From e463c07e1c17c45c3207cbff835409bae753a6bc Mon Sep 17 00:00:00 2001 From: Joe Betz Date: Tue, 10 Jul 2018 16:42:56 -0700 Subject: [PATCH] lease: Persist remainingTTL to prevent indefinite auto-renewal of long lived leases --- Documentation/dev-guide/api_reference_v3.md | 26 + clientv3/snapshot/v3_snapshot.go | 2 +- etcdserver/apply.go | 14 + etcdserver/config.go | 3 + etcdserver/etcdserverpb/etcdserver.pb.go | 3 + etcdserver/etcdserverpb/raft_internal.pb.go | 226 ++-- etcdserver/etcdserverpb/raft_internal.proto | 3 +- etcdserver/etcdserverpb/rpc.pb.go | 1143 +++++++++++++------ etcdserver/etcdserverpb/rpc.proto | 16 + etcdserver/server.go | 6 +- integration/cluster.go | 5 + integration/v3_lease_test.go | 52 + lease/lease_queue.go | 9 +- lease/lease_queue_test.go | 2 +- lease/leasehttp/http_test.go | 10 +- lease/leasepb/lease.pb.go | 55 +- lease/leasepb/lease.proto | 1 + lease/lessor.go | 266 ++++- lease/lessor_bench_test.go | 13 +- lease/lessor_test.go | 93 +- 20 files changed, 1426 insertions(+), 522 deletions(-) diff --git a/Documentation/dev-guide/api_reference_v3.md b/Documentation/dev-guide/api_reference_v3.md index 741ea0088fbe..70c1520dbeb2 100644 --- a/Documentation/dev-guide/api_reference_v3.md +++ b/Documentation/dev-guide/api_reference_v3.md @@ -476,6 +476,31 @@ Empty field. +##### message `LeaseCheckpoint` (etcdserver/etcdserverpb/rpc.proto) + +| Field | Description | Type | +| ----- | ----------- | ---- | +| ID | ID is the lease ID to checkpoint. | int64 | +| remaining_TTL | Remaining_TTL is the remaining time until expiry of the lease. | int64 | + + + +##### message `LeaseCheckpointRequest` (etcdserver/etcdserverpb/rpc.proto) + +| Field | Description | Type | +| ----- | ----------- | ---- | +| checkpoints | | (slice of) LeaseCheckpoint | + + + +##### message `LeaseCheckpointResponse` (etcdserver/etcdserverpb/rpc.proto) + +| Field | Description | Type | +| ----- | ----------- | ---- | +| header | | ResponseHeader | + + + ##### message `LeaseGrantRequest` (etcdserver/etcdserverpb/rpc.proto) | Field | Description | Type | @@ -903,6 +928,7 @@ Empty field. | ----- | ----------- | ---- | | ID | | int64 | | TTL | | int64 | +| RemainingTTL | | int64 | diff --git a/clientv3/snapshot/v3_snapshot.go b/clientv3/snapshot/v3_snapshot.go index 2b288d5147a6..c29e175db290 100644 --- a/clientv3/snapshot/v3_snapshot.go +++ b/clientv3/snapshot/v3_snapshot.go @@ -373,7 +373,7 @@ func (s *v3Manager) saveDB() error { be := backend.NewDefaultBackend(dbpath) // a lessor never timeouts leases - lessor := lease.NewLessor(be, math.MaxInt64) + lessor := lease.NewLessor(s.lg, be, lease.LessorConfig{MinLeaseTTL: math.MaxInt64}) mvs := mvcc.NewStore(s.lg, be, lessor, (*initIndex)(&commit)) txn := mvs.Write() diff --git a/etcdserver/apply.go b/etcdserver/apply.go index 40553185fbda..1c03995ea0a7 100644 --- a/etcdserver/apply.go +++ b/etcdserver/apply.go @@ -58,6 +58,8 @@ type applierV3 interface { LeaseGrant(lc *pb.LeaseGrantRequest) (*pb.LeaseGrantResponse, error) LeaseRevoke(lc *pb.LeaseRevokeRequest) (*pb.LeaseRevokeResponse, error) + LeaseCheckpoint(lc *pb.LeaseCheckpointRequest) (*pb.LeaseCheckpointResponse, error) + Alarm(*pb.AlarmRequest) (*pb.AlarmResponse, error) Authenticate(r *pb.InternalAuthenticateRequest) (*pb.AuthenticateResponse, error) @@ -130,6 +132,8 @@ func (a *applierV3backend) Apply(r *pb.InternalRaftRequest) *applyResult { ar.resp, ar.err = a.s.applyV3.LeaseGrant(r.LeaseGrant) case r.LeaseRevoke != nil: ar.resp, ar.err = a.s.applyV3.LeaseRevoke(r.LeaseRevoke) + case r.LeaseCheckpoint != nil: + ar.resp, ar.err = a.s.applyV3.LeaseCheckpoint(r.LeaseCheckpoint) case r.Alarm != nil: ar.resp, ar.err = a.s.applyV3.Alarm(r.Alarm) case r.Authenticate != nil: @@ -582,6 +586,16 @@ func (a *applierV3backend) LeaseRevoke(lc *pb.LeaseRevokeRequest) (*pb.LeaseRevo return &pb.LeaseRevokeResponse{Header: newHeader(a.s)}, err } +func (a *applierV3backend) LeaseCheckpoint(lc *pb.LeaseCheckpointRequest) (*pb.LeaseCheckpointResponse, error) { + for _, c := range lc.Checkpoints { + err := a.s.lessor.Checkpoint(lease.LeaseID(c.ID), c.Remaining_TTL) + if err != nil { + return &pb.LeaseCheckpointResponse{Header: newHeader(a.s)}, err + } + } + return &pb.LeaseCheckpointResponse{Header: newHeader(a.s)}, nil +} + func (a *applierV3backend) Alarm(ar *pb.AlarmRequest) (*pb.AlarmResponse, error) { resp := &pb.AlarmResponse{} oldCount := len(a.s.alarmStore.Get(ar.Alarm)) diff --git a/etcdserver/config.go b/etcdserver/config.go index 2381b5a71b33..6d945b342c1e 100644 --- a/etcdserver/config.go +++ b/etcdserver/config.go @@ -140,6 +140,9 @@ type ServerConfig struct { Debug bool ForceNewCluster bool + + // LeaseCheckpointInterval time.Duration is the wait duration between lease checkpoints. + LeaseCheckpointInterval time.Duration } // VerifyBootstrap sanity-checks the initial config for bootstrap case diff --git a/etcdserver/etcdserverpb/etcdserver.pb.go b/etcdserver/etcdserverpb/etcdserver.pb.go index 465588f48a5d..f5134b9f7c4e 100644 --- a/etcdserver/etcdserverpb/etcdserver.pb.go +++ b/etcdserver/etcdserverpb/etcdserver.pb.go @@ -45,6 +45,9 @@ LeaseGrantResponse LeaseRevokeRequest LeaseRevokeResponse + LeaseCheckpoint + LeaseCheckpointRequest + LeaseCheckpointResponse LeaseKeepAliveRequest LeaseKeepAliveResponse LeaseTimeToLiveRequest diff --git a/etcdserver/etcdserverpb/raft_internal.pb.go b/etcdserver/etcdserverpb/raft_internal.pb.go index 3084c6cbf864..b170499e4b6c 100644 --- a/etcdserver/etcdserverpb/raft_internal.pb.go +++ b/etcdserver/etcdserverpb/raft_internal.pb.go @@ -47,6 +47,7 @@ type InternalRaftRequest struct { LeaseGrant *LeaseGrantRequest `protobuf:"bytes,8,opt,name=lease_grant,json=leaseGrant" json:"lease_grant,omitempty"` LeaseRevoke *LeaseRevokeRequest `protobuf:"bytes,9,opt,name=lease_revoke,json=leaseRevoke" json:"lease_revoke,omitempty"` Alarm *AlarmRequest `protobuf:"bytes,10,opt,name=alarm" json:"alarm,omitempty"` + LeaseCheckpoint *LeaseCheckpointRequest `protobuf:"bytes,11,opt,name=lease_checkpoint,json=leaseCheckpoint" json:"lease_checkpoint,omitempty"` AuthEnable *AuthEnableRequest `protobuf:"bytes,1000,opt,name=auth_enable,json=authEnable" json:"auth_enable,omitempty"` AuthDisable *AuthDisableRequest `protobuf:"bytes,1011,opt,name=auth_disable,json=authDisable" json:"auth_disable,omitempty"` Authenticate *InternalAuthenticateRequest `protobuf:"bytes,1012,opt,name=authenticate" json:"authenticate,omitempty"` @@ -245,17 +246,27 @@ func (m *InternalRaftRequest) MarshalTo(dAtA []byte) (int, error) { } i += n9 } + if m.LeaseCheckpoint != nil { + dAtA[i] = 0x5a + i++ + i = encodeVarintRaftInternal(dAtA, i, uint64(m.LeaseCheckpoint.Size())) + n10, err := m.LeaseCheckpoint.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n10 + } if m.Header != nil { dAtA[i] = 0xa2 i++ dAtA[i] = 0x6 i++ i = encodeVarintRaftInternal(dAtA, i, uint64(m.Header.Size())) - n10, err := m.Header.MarshalTo(dAtA[i:]) + n11, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n10 + i += n11 } if m.AuthEnable != nil { dAtA[i] = 0xc2 @@ -263,11 +274,11 @@ func (m *InternalRaftRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x3e i++ i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthEnable.Size())) - n11, err := m.AuthEnable.MarshalTo(dAtA[i:]) + n12, err := m.AuthEnable.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n11 + i += n12 } if m.AuthDisable != nil { dAtA[i] = 0x9a @@ -275,11 +286,11 @@ func (m *InternalRaftRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x3f i++ i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthDisable.Size())) - n12, err := m.AuthDisable.MarshalTo(dAtA[i:]) + n13, err := m.AuthDisable.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n12 + i += n13 } if m.Authenticate != nil { dAtA[i] = 0xa2 @@ -287,11 +298,11 @@ func (m *InternalRaftRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x3f i++ i = encodeVarintRaftInternal(dAtA, i, uint64(m.Authenticate.Size())) - n13, err := m.Authenticate.MarshalTo(dAtA[i:]) + n14, err := m.Authenticate.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n13 + i += n14 } if m.AuthUserAdd != nil { dAtA[i] = 0xe2 @@ -299,11 +310,11 @@ func (m *InternalRaftRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x44 i++ i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthUserAdd.Size())) - n14, err := m.AuthUserAdd.MarshalTo(dAtA[i:]) + n15, err := m.AuthUserAdd.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n14 + i += n15 } if m.AuthUserDelete != nil { dAtA[i] = 0xea @@ -311,11 +322,11 @@ func (m *InternalRaftRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x44 i++ i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthUserDelete.Size())) - n15, err := m.AuthUserDelete.MarshalTo(dAtA[i:]) + n16, err := m.AuthUserDelete.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n15 + i += n16 } if m.AuthUserGet != nil { dAtA[i] = 0xf2 @@ -323,11 +334,11 @@ func (m *InternalRaftRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x44 i++ i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthUserGet.Size())) - n16, err := m.AuthUserGet.MarshalTo(dAtA[i:]) + n17, err := m.AuthUserGet.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n16 + i += n17 } if m.AuthUserChangePassword != nil { dAtA[i] = 0xfa @@ -335,11 +346,11 @@ func (m *InternalRaftRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x44 i++ i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthUserChangePassword.Size())) - n17, err := m.AuthUserChangePassword.MarshalTo(dAtA[i:]) + n18, err := m.AuthUserChangePassword.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n17 + i += n18 } if m.AuthUserGrantRole != nil { dAtA[i] = 0x82 @@ -347,11 +358,11 @@ func (m *InternalRaftRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x45 i++ i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthUserGrantRole.Size())) - n18, err := m.AuthUserGrantRole.MarshalTo(dAtA[i:]) + n19, err := m.AuthUserGrantRole.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n18 + i += n19 } if m.AuthUserRevokeRole != nil { dAtA[i] = 0x8a @@ -359,11 +370,11 @@ func (m *InternalRaftRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x45 i++ i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthUserRevokeRole.Size())) - n19, err := m.AuthUserRevokeRole.MarshalTo(dAtA[i:]) + n20, err := m.AuthUserRevokeRole.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n19 + i += n20 } if m.AuthUserList != nil { dAtA[i] = 0x92 @@ -371,11 +382,11 @@ func (m *InternalRaftRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x45 i++ i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthUserList.Size())) - n20, err := m.AuthUserList.MarshalTo(dAtA[i:]) + n21, err := m.AuthUserList.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n20 + i += n21 } if m.AuthRoleList != nil { dAtA[i] = 0x9a @@ -383,11 +394,11 @@ func (m *InternalRaftRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x45 i++ i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthRoleList.Size())) - n21, err := m.AuthRoleList.MarshalTo(dAtA[i:]) + n22, err := m.AuthRoleList.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n21 + i += n22 } if m.AuthRoleAdd != nil { dAtA[i] = 0x82 @@ -395,11 +406,11 @@ func (m *InternalRaftRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x4b i++ i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthRoleAdd.Size())) - n22, err := m.AuthRoleAdd.MarshalTo(dAtA[i:]) + n23, err := m.AuthRoleAdd.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n22 + i += n23 } if m.AuthRoleDelete != nil { dAtA[i] = 0x8a @@ -407,11 +418,11 @@ func (m *InternalRaftRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x4b i++ i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthRoleDelete.Size())) - n23, err := m.AuthRoleDelete.MarshalTo(dAtA[i:]) + n24, err := m.AuthRoleDelete.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n23 + i += n24 } if m.AuthRoleGet != nil { dAtA[i] = 0x92 @@ -419,11 +430,11 @@ func (m *InternalRaftRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x4b i++ i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthRoleGet.Size())) - n24, err := m.AuthRoleGet.MarshalTo(dAtA[i:]) + n25, err := m.AuthRoleGet.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n24 + i += n25 } if m.AuthRoleGrantPermission != nil { dAtA[i] = 0x9a @@ -431,11 +442,11 @@ func (m *InternalRaftRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x4b i++ i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthRoleGrantPermission.Size())) - n25, err := m.AuthRoleGrantPermission.MarshalTo(dAtA[i:]) + n26, err := m.AuthRoleGrantPermission.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n25 + i += n26 } if m.AuthRoleRevokePermission != nil { dAtA[i] = 0xa2 @@ -443,11 +454,11 @@ func (m *InternalRaftRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x4b i++ i = encodeVarintRaftInternal(dAtA, i, uint64(m.AuthRoleRevokePermission.Size())) - n26, err := m.AuthRoleRevokePermission.MarshalTo(dAtA[i:]) + n27, err := m.AuthRoleRevokePermission.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n26 + i += n27 } return i, nil } @@ -573,6 +584,10 @@ func (m *InternalRaftRequest) Size() (n int) { l = m.Alarm.Size() n += 1 + l + sovRaftInternal(uint64(l)) } + if m.LeaseCheckpoint != nil { + l = m.LeaseCheckpoint.Size() + n += 1 + l + sovRaftInternal(uint64(l)) + } if m.Header != nil { l = m.Header.Size() n += 2 + l + sovRaftInternal(uint64(l)) @@ -1143,6 +1158,39 @@ func (m *InternalRaftRequest) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LeaseCheckpoint", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRaftInternal + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRaftInternal + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LeaseCheckpoint == nil { + m.LeaseCheckpoint = &LeaseCheckpointRequest{} + } + if err := m.LeaseCheckpoint.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex case 100: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) @@ -2020,58 +2068,60 @@ var ( func init() { proto.RegisterFile("raft_internal.proto", fileDescriptorRaftInternal) } var fileDescriptorRaftInternal = []byte{ - // 837 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x96, 0xdd, 0x52, 0xd3, 0x40, - 0x14, 0xc7, 0x69, 0xf9, 0xec, 0xb6, 0x54, 0x5c, 0x40, 0xd7, 0x32, 0x53, 0xa1, 0x8c, 0x8a, 0x5f, - 0xe8, 0x94, 0x07, 0xd0, 0x4a, 0x19, 0x60, 0x86, 0x61, 0x98, 0x0c, 0xce, 0x38, 0xe3, 0x45, 0x5c, - 0x9a, 0x43, 0x1b, 0x49, 0x93, 0xb8, 0xd9, 0x56, 0x7c, 0x13, 0x1f, 0xc3, 0xaf, 0x87, 0xe0, 0xc2, - 0x0f, 0xd4, 0x17, 0x50, 0xbc, 0xf1, 0xca, 0x1b, 0x7d, 0x00, 0x67, 0x3f, 0x92, 0x34, 0x6d, 0xca, - 0x5d, 0x72, 0xce, 0xff, 0xfc, 0xce, 0xd9, 0xec, 0x7f, 0xbb, 0x45, 0xb3, 0x8c, 0x1e, 0x72, 0xd3, - 0x76, 0x39, 0x30, 0x97, 0x3a, 0xab, 0x3e, 0xf3, 0xb8, 0x87, 0x0b, 0xc0, 0x1b, 0x56, 0x00, 0xac, - 0x0b, 0xcc, 0x3f, 0x28, 0xcd, 0x35, 0xbd, 0xa6, 0x27, 0x13, 0xf7, 0xc4, 0x93, 0xd2, 0x94, 0x66, - 0x62, 0x8d, 0x8e, 0xe4, 0x98, 0xdf, 0x50, 0x8f, 0x95, 0x67, 0x68, 0xda, 0x80, 0x17, 0x1d, 0x08, - 0xf8, 0x16, 0x50, 0x0b, 0x18, 0x2e, 0xa2, 0xec, 0x76, 0x9d, 0x64, 0x16, 0x33, 0x2b, 0x63, 0x46, - 0x76, 0xbb, 0x8e, 0x4b, 0x68, 0xaa, 0x13, 0x88, 0x96, 0x6d, 0x20, 0xd9, 0xc5, 0xcc, 0x4a, 0xce, - 0x88, 0xde, 0xf1, 0x32, 0x9a, 0xa6, 0x1d, 0xde, 0x32, 0x19, 0x74, 0xed, 0xc0, 0xf6, 0x5c, 0x32, - 0x2a, 0xcb, 0x0a, 0x22, 0x68, 0xe8, 0x58, 0xe5, 0x4f, 0x11, 0xcd, 0x6e, 0xeb, 0xa9, 0x0d, 0x7a, - 0xc8, 0x75, 0xbb, 0x81, 0x46, 0xd7, 0x50, 0xb6, 0x5b, 0x95, 0x2d, 0xf2, 0xd5, 0xf9, 0xd5, 0xde, - 0x75, 0xad, 0xea, 0x12, 0x23, 0xdb, 0xad, 0xe2, 0xfb, 0x68, 0x9c, 0x51, 0xb7, 0x09, 0xb2, 0x57, - 0xbe, 0x5a, 0xea, 0x53, 0x8a, 0x54, 0x28, 0x57, 0x42, 0x7c, 0x0b, 0x8d, 0xfa, 0x1d, 0x4e, 0xc6, - 0xa4, 0x9e, 0x24, 0xf5, 0x7b, 0x9d, 0x70, 0x1e, 0x43, 0x88, 0xf0, 0x3a, 0x2a, 0x58, 0xe0, 0x00, - 0x07, 0x53, 0x35, 0x19, 0x97, 0x45, 0x8b, 0xc9, 0xa2, 0xba, 0x54, 0x24, 0x5a, 0xe5, 0xad, 0x38, - 0x26, 0x1a, 0xf2, 0x63, 0x97, 0x4c, 0xa4, 0x35, 0xdc, 0x3f, 0x76, 0xa3, 0x86, 0xfc, 0xd8, 0xc5, - 0x0f, 0x10, 0x6a, 0x78, 0x6d, 0x9f, 0x36, 0xb8, 0xf8, 0x7e, 0x93, 0xb2, 0xe4, 0x6a, 0xb2, 0x64, - 0x3d, 0xca, 0x87, 0x95, 0x3d, 0x25, 0xf8, 0x21, 0xca, 0x3b, 0x40, 0x03, 0x30, 0x9b, 0x8c, 0xba, - 0x9c, 0x4c, 0xa5, 0x11, 0x76, 0x84, 0x60, 0x53, 0xe4, 0x23, 0x82, 0x13, 0x85, 0xc4, 0x9a, 0x15, - 0x81, 0x41, 0xd7, 0x3b, 0x02, 0x92, 0x4b, 0x5b, 0xb3, 0x44, 0x18, 0x52, 0x10, 0xad, 0xd9, 0x89, - 0x63, 0x62, 0x5b, 0xa8, 0x43, 0x59, 0x9b, 0xa0, 0xb4, 0x6d, 0xa9, 0x89, 0x54, 0xb4, 0x2d, 0x52, - 0x88, 0xd7, 0xd0, 0x44, 0x4b, 0x5a, 0x8e, 0x58, 0xb2, 0x64, 0x21, 0x75, 0xcf, 0x95, 0x2b, 0x0d, - 0x2d, 0xc5, 0x35, 0x94, 0x97, 0x8e, 0x03, 0x97, 0x1e, 0x38, 0x40, 0x7e, 0xa7, 0x7e, 0xb0, 0x5a, - 0x87, 0xb7, 0x36, 0xa4, 0x20, 0x5a, 0x2e, 0x8d, 0x42, 0xb8, 0x8e, 0xa4, 0x3f, 0x4d, 0xcb, 0x0e, - 0x24, 0xe3, 0xef, 0x64, 0xda, 0x7a, 0x05, 0xa3, 0xae, 0x14, 0xd1, 0x7a, 0x69, 0x1c, 0xc3, 0xbb, - 0x8a, 0x02, 0x2e, 0xb7, 0x1b, 0x94, 0x03, 0xf9, 0xa7, 0x28, 0x37, 0x93, 0x94, 0xd0, 0xf7, 0xb5, - 0x1e, 0x69, 0x88, 0x4b, 0xd4, 0xe3, 0x0d, 0x7d, 0x94, 0xc4, 0xd9, 0x32, 0xa9, 0x65, 0x91, 0x8f, - 0x53, 0xc3, 0xc6, 0x7a, 0x1c, 0x00, 0xab, 0x59, 0x56, 0x62, 0x2c, 0x1d, 0xc3, 0xbb, 0x68, 0x26, - 0xc6, 0x28, 0x4f, 0x92, 0x4f, 0x8a, 0xb4, 0x9c, 0x4e, 0xd2, 0x66, 0xd6, 0xb0, 0x22, 0x4d, 0x84, - 0x93, 0x63, 0x35, 0x81, 0x93, 0xcf, 0xe7, 0x8e, 0xb5, 0x09, 0x7c, 0x60, 0xac, 0x4d, 0xe0, 0xb8, - 0x89, 0xae, 0xc4, 0x98, 0x46, 0x4b, 0x9c, 0x12, 0xd3, 0xa7, 0x41, 0xf0, 0xd2, 0x63, 0x16, 0xf9, - 0xa2, 0x90, 0xb7, 0xd3, 0x91, 0xeb, 0x52, 0xbd, 0xa7, 0xc5, 0x21, 0xfd, 0x12, 0x4d, 0x4d, 0xe3, - 0x27, 0x68, 0xae, 0x67, 0x5e, 0x61, 0x6f, 0x93, 0x79, 0x0e, 0x90, 0x53, 0xd5, 0xe3, 0xfa, 0x90, - 0xb1, 0xe5, 0xd1, 0xf0, 0xe2, 0xad, 0xbe, 0x48, 0xfb, 0x33, 0xf8, 0x29, 0x9a, 0x8f, 0xc9, 0xea, - 0xa4, 0x28, 0xf4, 0x57, 0x85, 0xbe, 0x91, 0x8e, 0xd6, 0x47, 0xa6, 0x87, 0x8d, 0xe9, 0x40, 0x0a, - 0x6f, 0xa1, 0x62, 0x0c, 0x77, 0xec, 0x80, 0x93, 0x6f, 0x8a, 0xba, 0x94, 0x4e, 0xdd, 0xb1, 0x03, - 0x9e, 0xf0, 0x51, 0x18, 0x8c, 0x48, 0x62, 0x34, 0x45, 0xfa, 0x3e, 0x94, 0x24, 0x5a, 0x0f, 0x90, - 0xc2, 0x60, 0xb4, 0xf5, 0x92, 0x24, 0x1c, 0xf9, 0x26, 0x37, 0x6c, 0xeb, 0x45, 0x4d, 0xbf, 0x23, - 0x75, 0x2c, 0x72, 0xa4, 0xc4, 0x68, 0x47, 0xbe, 0xcd, 0x0d, 0x73, 0xa4, 0xa8, 0x4a, 0x71, 0x64, - 0x1c, 0x4e, 0x8e, 0x25, 0x1c, 0xf9, 0xee, 0xdc, 0xb1, 0xfa, 0x1d, 0xa9, 0x63, 0xf8, 0x39, 0x2a, - 0xf5, 0x60, 0xa4, 0x51, 0x7c, 0x60, 0x6d, 0x3b, 0x90, 0xf7, 0xd8, 0x7b, 0xc5, 0xbc, 0x33, 0x84, - 0x29, 0xe4, 0x7b, 0x91, 0x3a, 0xe4, 0x5f, 0xa6, 0xe9, 0x79, 0xdc, 0x46, 0x0b, 0x71, 0x2f, 0x6d, - 0x9d, 0x9e, 0x66, 0x1f, 0x54, 0xb3, 0xbb, 0xe9, 0xcd, 0x94, 0x4b, 0x06, 0xbb, 0x11, 0x3a, 0x44, - 0x50, 0xb9, 0x80, 0xa6, 0x37, 0xda, 0x3e, 0x7f, 0x65, 0x40, 0xe0, 0x7b, 0x6e, 0x00, 0x15, 0x1f, - 0x2d, 0x9c, 0xf3, 0x43, 0x84, 0x31, 0x1a, 0x93, 0xb7, 0x7b, 0x46, 0xde, 0xee, 0xf2, 0x59, 0xdc, - 0xfa, 0xd1, 0xf9, 0xd4, 0xb7, 0x7e, 0xf8, 0x8e, 0x97, 0x50, 0x21, 0xb0, 0xdb, 0xbe, 0x03, 0x26, - 0xf7, 0x8e, 0x40, 0x5d, 0xfa, 0x39, 0x23, 0xaf, 0x62, 0xfb, 0x22, 0xf4, 0x68, 0xee, 0xe4, 0x67, - 0x79, 0xe4, 0xe4, 0xac, 0x9c, 0x39, 0x3d, 0x2b, 0x67, 0x7e, 0x9c, 0x95, 0x33, 0xaf, 0x7f, 0x95, - 0x47, 0x0e, 0x26, 0xe4, 0x5f, 0x8e, 0xb5, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc9, 0xfc, - 0x0e, 0xca, 0x08, 0x00, 0x00, + // 867 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x96, 0xcb, 0x52, 0x33, 0x45, + 0x14, 0xc7, 0x49, 0xb8, 0xa6, 0x13, 0x2e, 0x36, 0xa0, 0x6d, 0xa8, 0x8a, 0x10, 0xbc, 0xe0, 0x0d, + 0xad, 0xf0, 0x00, 0x1a, 0x13, 0x0a, 0xa8, 0xa2, 0x90, 0x9a, 0xc2, 0x2a, 0xab, 0x5c, 0x8c, 0xcd, + 0xcc, 0x21, 0x19, 0x99, 0xcc, 0x8c, 0x3d, 0x9d, 0x88, 0x6f, 0xe2, 0x63, 0x78, 0xdb, 0xbb, 0x65, + 0xe1, 0x05, 0xf5, 0x05, 0x14, 0x37, 0xee, 0xbf, 0xef, 0x01, 0xbe, 0xea, 0xcb, 0xf4, 0x64, 0x92, + 0x0e, 0xbb, 0xc9, 0x39, 0xff, 0xf3, 0xfb, 0x9f, 0x99, 0x3e, 0x07, 0x1a, 0x6d, 0x32, 0x7a, 0xc3, + 0xdd, 0x20, 0xe2, 0xc0, 0x22, 0x1a, 0x1e, 0x26, 0x2c, 0xe6, 0x31, 0xae, 0x01, 0xf7, 0xfc, 0x14, + 0xd8, 0x08, 0x58, 0x72, 0x5d, 0xdf, 0xea, 0xc5, 0xbd, 0x58, 0x26, 0x3e, 0x10, 0x4f, 0x4a, 0x53, + 0xdf, 0xc8, 0x35, 0x3a, 0x52, 0x61, 0x89, 0xa7, 0x1e, 0x9b, 0x5f, 0xa2, 0x55, 0x07, 0xbe, 0x1e, + 0x42, 0xca, 0x4f, 0x81, 0xfa, 0xc0, 0xf0, 0x1a, 0x2a, 0x9f, 0x75, 0x49, 0x69, 0xb7, 0x74, 0xb0, + 0xe0, 0x94, 0xcf, 0xba, 0xb8, 0x8e, 0x56, 0x86, 0xa9, 0xb0, 0x1c, 0x00, 0x29, 0xef, 0x96, 0x0e, + 0x2a, 0x8e, 0xf9, 0x8d, 0xf7, 0xd1, 0x2a, 0x1d, 0xf2, 0xbe, 0xcb, 0x60, 0x14, 0xa4, 0x41, 0x1c, + 0x91, 0x79, 0x59, 0x56, 0x13, 0x41, 0x47, 0xc7, 0x9a, 0xbf, 0xac, 0xa3, 0xcd, 0x33, 0xdd, 0xb5, + 0x43, 0x6f, 0xb8, 0xb6, 0x9b, 0x32, 0x7a, 0x03, 0x95, 0x47, 0x2d, 0x69, 0x51, 0x6d, 0x6d, 0x1f, + 0x8e, 0xbf, 0xd7, 0xa1, 0x2e, 0x71, 0xca, 0xa3, 0x16, 0xfe, 0x10, 0x2d, 0x32, 0x1a, 0xf5, 0x40, + 0x7a, 0x55, 0x5b, 0xf5, 0x09, 0xa5, 0x48, 0x65, 0x72, 0x25, 0xc4, 0xef, 0xa0, 0xf9, 0x64, 0xc8, + 0xc9, 0x82, 0xd4, 0x93, 0xa2, 0xfe, 0x72, 0x98, 0xf5, 0xe3, 0x08, 0x11, 0xee, 0xa0, 0x9a, 0x0f, + 0x21, 0x70, 0x70, 0x95, 0xc9, 0xa2, 0x2c, 0xda, 0x2d, 0x16, 0x75, 0xa5, 0xa2, 0x60, 0x55, 0xf5, + 0xf3, 0x98, 0x30, 0xe4, 0x77, 0x11, 0x59, 0xb2, 0x19, 0x5e, 0xdd, 0x45, 0xc6, 0x90, 0xdf, 0x45, + 0xf8, 0x23, 0x84, 0xbc, 0x78, 0x90, 0x50, 0x8f, 0x8b, 0xef, 0xb7, 0x2c, 0x4b, 0x5e, 0x2b, 0x96, + 0x74, 0x4c, 0x3e, 0xab, 0x1c, 0x2b, 0xc1, 0x1f, 0xa3, 0x6a, 0x08, 0x34, 0x05, 0xb7, 0xc7, 0x68, + 0xc4, 0xc9, 0x8a, 0x8d, 0x70, 0x2e, 0x04, 0x27, 0x22, 0x6f, 0x08, 0xa1, 0x09, 0x89, 0x77, 0x56, + 0x04, 0x06, 0xa3, 0xf8, 0x16, 0x48, 0xc5, 0xf6, 0xce, 0x12, 0xe1, 0x48, 0x81, 0x79, 0xe7, 0x30, + 0x8f, 0x89, 0x63, 0xa1, 0x21, 0x65, 0x03, 0x82, 0x6c, 0xc7, 0xd2, 0x16, 0x29, 0x73, 0x2c, 0x52, + 0x88, 0x3f, 0x45, 0x1b, 0xca, 0xd6, 0xeb, 0x83, 0x77, 0x9b, 0xc4, 0x41, 0xc4, 0x49, 0x55, 0x16, + 0xbf, 0x6e, 0xb1, 0xee, 0x18, 0x51, 0x86, 0x59, 0x0f, 0x8b, 0x71, 0x7c, 0x84, 0x96, 0xfa, 0x72, + 0x86, 0x89, 0x2f, 0x31, 0x3b, 0xd6, 0x21, 0x52, 0x63, 0xee, 0x68, 0x29, 0x6e, 0xa3, 0xaa, 0x1c, + 0x61, 0x88, 0xe8, 0x75, 0x08, 0xe4, 0x7f, 0xeb, 0x09, 0xb4, 0x87, 0xbc, 0x7f, 0x2c, 0x05, 0xe6, + 0xfb, 0x51, 0x13, 0xc2, 0x5d, 0x24, 0x07, 0xde, 0xf5, 0x83, 0x54, 0x32, 0x9e, 0x2d, 0xdb, 0x3e, + 0xa0, 0x60, 0x74, 0x95, 0xc2, 0x7c, 0x40, 0x9a, 0xc7, 0xf0, 0x85, 0xa2, 0x40, 0xc4, 0x03, 0x8f, + 0x72, 0x20, 0xcf, 0x15, 0xe5, 0xed, 0x22, 0x25, 0x5b, 0xa4, 0xf6, 0x98, 0x34, 0xc3, 0x15, 0xea, + 0xf1, 0xb1, 0xde, 0x4d, 0xb1, 0xac, 0x2e, 0xf5, 0x7d, 0xf2, 0xeb, 0xca, 0xac, 0xb6, 0x3e, 0x4b, + 0x81, 0xb5, 0x7d, 0xbf, 0xd0, 0x96, 0x8e, 0xe1, 0x0b, 0xb4, 0x91, 0x63, 0xd4, 0x90, 0x93, 0xdf, + 0x14, 0x69, 0xdf, 0x4e, 0xd2, 0xdb, 0xa1, 0x61, 0x6b, 0xb4, 0x10, 0x2e, 0xb6, 0xd5, 0x03, 0x4e, + 0x7e, 0x7f, 0xb2, 0xad, 0x13, 0xe0, 0x53, 0x6d, 0x9d, 0x00, 0xc7, 0x3d, 0xf4, 0x6a, 0x8e, 0xf1, + 0xfa, 0x62, 0xed, 0xdc, 0x84, 0xa6, 0xe9, 0x37, 0x31, 0xf3, 0xc9, 0x1f, 0x0a, 0xf9, 0xae, 0x1d, + 0xd9, 0x91, 0xea, 0x4b, 0x2d, 0xce, 0xe8, 0x2f, 0x53, 0x6b, 0x1a, 0x7f, 0x8e, 0xb6, 0xc6, 0xfa, + 0x15, 0xfb, 0xe2, 0xb2, 0x38, 0x04, 0xf2, 0xa0, 0x3c, 0xde, 0x9c, 0xd1, 0xb6, 0xdc, 0xb5, 0x38, + 0x3f, 0xea, 0x97, 0xe8, 0x64, 0x06, 0x7f, 0x81, 0xb6, 0x73, 0xb2, 0x5a, 0x3d, 0x85, 0xfe, 0x53, + 0xa1, 0xdf, 0xb2, 0xa3, 0xf5, 0x0e, 0x8e, 0xb1, 0x31, 0x9d, 0x4a, 0xe1, 0x53, 0xb4, 0x96, 0xc3, + 0xc3, 0x20, 0xe5, 0xe4, 0x2f, 0x45, 0xdd, 0xb3, 0x53, 0xcf, 0x83, 0x94, 0x17, 0xe6, 0x28, 0x0b, + 0x1a, 0x92, 0x68, 0x4d, 0x91, 0xfe, 0x9e, 0x49, 0x12, 0xd6, 0x53, 0xa4, 0x2c, 0x68, 0x8e, 0x5e, + 0x92, 0xc4, 0x44, 0x7e, 0x5f, 0x99, 0x75, 0xf4, 0xa2, 0x66, 0x72, 0x22, 0x75, 0xcc, 0x4c, 0xa4, + 0xc4, 0xe8, 0x89, 0xfc, 0xa1, 0x32, 0x6b, 0x22, 0x45, 0x95, 0x65, 0x22, 0xf3, 0x70, 0xb1, 0x2d, + 0x31, 0x91, 0x3f, 0x3e, 0xd9, 0xd6, 0xe4, 0x44, 0xea, 0x18, 0xfe, 0x0a, 0xd5, 0xc7, 0x30, 0x72, + 0x50, 0x12, 0x60, 0x83, 0x20, 0x95, 0xff, 0x18, 0x7f, 0x52, 0xcc, 0xf7, 0x66, 0x30, 0x85, 0xfc, + 0xd2, 0xa8, 0x33, 0xfe, 0x2b, 0xd4, 0x9e, 0xc7, 0x03, 0xb4, 0x93, 0x7b, 0xe9, 0xd1, 0x19, 0x33, + 0xfb, 0x59, 0x99, 0xbd, 0x6f, 0x37, 0x53, 0x53, 0x32, 0xed, 0x46, 0xe8, 0x0c, 0x41, 0x73, 0x1d, + 0xad, 0x1e, 0x0f, 0x12, 0xfe, 0xad, 0x03, 0x69, 0x12, 0x47, 0x29, 0x34, 0x13, 0xb4, 0xf3, 0xc4, + 0x1f, 0x22, 0x8c, 0xd1, 0x82, 0xbc, 0x2e, 0x94, 0xe4, 0x75, 0x41, 0x3e, 0x8b, 0x6b, 0x84, 0xd9, + 0x4f, 0x7d, 0x8d, 0xc8, 0x7e, 0xe3, 0x3d, 0x54, 0x4b, 0x83, 0x41, 0x12, 0x82, 0xcb, 0xe3, 0x5b, + 0x50, 0xb7, 0x88, 0x8a, 0x53, 0x55, 0xb1, 0x2b, 0x11, 0xfa, 0x64, 0xeb, 0xfe, 0xdf, 0xc6, 0xdc, + 0xfd, 0x63, 0xa3, 0xf4, 0xf0, 0xd8, 0x28, 0xfd, 0xf3, 0xd8, 0x28, 0x7d, 0xf7, 0x5f, 0x63, 0xee, + 0x7a, 0x49, 0xde, 0x61, 0x8e, 0x5e, 0x04, 0x00, 0x00, 0xff, 0xff, 0xed, 0x36, 0xf0, 0x6f, 0x1b, + 0x09, 0x00, 0x00, } diff --git a/etcdserver/etcdserverpb/raft_internal.proto b/etcdserver/etcdserverpb/raft_internal.proto index 25d45d3c4f23..7111f4572b21 100644 --- a/etcdserver/etcdserverpb/raft_internal.proto +++ b/etcdserver/etcdserverpb/raft_internal.proto @@ -37,6 +37,8 @@ message InternalRaftRequest { AlarmRequest alarm = 10; + LeaseCheckpointRequest lease_checkpoint = 11; + AuthEnableRequest auth_enable = 1000; AuthDisableRequest auth_disable = 1011; @@ -71,4 +73,3 @@ message InternalAuthenticateRequest { // simple_token is generated in API layer (etcdserver/v3_server.go) string simple_token = 3; } - diff --git a/etcdserver/etcdserverpb/rpc.pb.go b/etcdserver/etcdserverpb/rpc.pb.go index ba57be8bf2e4..ddf72d6a8659 100644 --- a/etcdserver/etcdserverpb/rpc.pb.go +++ b/etcdserver/etcdserverpb/rpc.pb.go @@ -211,7 +211,7 @@ func (x AlarmRequest_AlarmAction) String() string { return proto.EnumName(AlarmRequest_AlarmAction_name, int32(x)) } func (AlarmRequest_AlarmAction) EnumDescriptor() ([]byte, []int) { - return fileDescriptorRpc, []int{49, 0} + return fileDescriptorRpc, []int{52, 0} } type ResponseHeader struct { @@ -1942,6 +1942,64 @@ func (m *LeaseRevokeResponse) GetHeader() *ResponseHeader { return nil } +type LeaseCheckpoint struct { + // ID is the lease ID to checkpoint. + ID int64 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` + // Remaining_TTL is the remaining time until expiry of the lease. + Remaining_TTL int64 `protobuf:"varint,2,opt,name=remaining_TTL,json=remainingTTL,proto3" json:"remaining_TTL,omitempty"` +} + +func (m *LeaseCheckpoint) Reset() { *m = LeaseCheckpoint{} } +func (m *LeaseCheckpoint) String() string { return proto.CompactTextString(m) } +func (*LeaseCheckpoint) ProtoMessage() {} +func (*LeaseCheckpoint) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{29} } + +func (m *LeaseCheckpoint) GetID() int64 { + if m != nil { + return m.ID + } + return 0 +} + +func (m *LeaseCheckpoint) GetRemaining_TTL() int64 { + if m != nil { + return m.Remaining_TTL + } + return 0 +} + +type LeaseCheckpointRequest struct { + Checkpoints []*LeaseCheckpoint `protobuf:"bytes,1,rep,name=checkpoints" json:"checkpoints,omitempty"` +} + +func (m *LeaseCheckpointRequest) Reset() { *m = LeaseCheckpointRequest{} } +func (m *LeaseCheckpointRequest) String() string { return proto.CompactTextString(m) } +func (*LeaseCheckpointRequest) ProtoMessage() {} +func (*LeaseCheckpointRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{30} } + +func (m *LeaseCheckpointRequest) GetCheckpoints() []*LeaseCheckpoint { + if m != nil { + return m.Checkpoints + } + return nil +} + +type LeaseCheckpointResponse struct { + Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` +} + +func (m *LeaseCheckpointResponse) Reset() { *m = LeaseCheckpointResponse{} } +func (m *LeaseCheckpointResponse) String() string { return proto.CompactTextString(m) } +func (*LeaseCheckpointResponse) ProtoMessage() {} +func (*LeaseCheckpointResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{31} } + +func (m *LeaseCheckpointResponse) GetHeader() *ResponseHeader { + if m != nil { + return m.Header + } + return nil +} + type LeaseKeepAliveRequest struct { // ID is the lease ID for the lease to keep alive. ID int64 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` @@ -1950,7 +2008,7 @@ type LeaseKeepAliveRequest struct { func (m *LeaseKeepAliveRequest) Reset() { *m = LeaseKeepAliveRequest{} } func (m *LeaseKeepAliveRequest) String() string { return proto.CompactTextString(m) } func (*LeaseKeepAliveRequest) ProtoMessage() {} -func (*LeaseKeepAliveRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{29} } +func (*LeaseKeepAliveRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{32} } func (m *LeaseKeepAliveRequest) GetID() int64 { if m != nil { @@ -1970,7 +2028,7 @@ type LeaseKeepAliveResponse struct { func (m *LeaseKeepAliveResponse) Reset() { *m = LeaseKeepAliveResponse{} } func (m *LeaseKeepAliveResponse) String() string { return proto.CompactTextString(m) } func (*LeaseKeepAliveResponse) ProtoMessage() {} -func (*LeaseKeepAliveResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{30} } +func (*LeaseKeepAliveResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{33} } func (m *LeaseKeepAliveResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2003,7 +2061,7 @@ type LeaseTimeToLiveRequest struct { func (m *LeaseTimeToLiveRequest) Reset() { *m = LeaseTimeToLiveRequest{} } func (m *LeaseTimeToLiveRequest) String() string { return proto.CompactTextString(m) } func (*LeaseTimeToLiveRequest) ProtoMessage() {} -func (*LeaseTimeToLiveRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{31} } +func (*LeaseTimeToLiveRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{34} } func (m *LeaseTimeToLiveRequest) GetID() int64 { if m != nil { @@ -2034,7 +2092,7 @@ type LeaseTimeToLiveResponse struct { func (m *LeaseTimeToLiveResponse) Reset() { *m = LeaseTimeToLiveResponse{} } func (m *LeaseTimeToLiveResponse) String() string { return proto.CompactTextString(m) } func (*LeaseTimeToLiveResponse) ProtoMessage() {} -func (*LeaseTimeToLiveResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{32} } +func (*LeaseTimeToLiveResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{35} } func (m *LeaseTimeToLiveResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2077,7 +2135,7 @@ type LeaseLeasesRequest struct { func (m *LeaseLeasesRequest) Reset() { *m = LeaseLeasesRequest{} } func (m *LeaseLeasesRequest) String() string { return proto.CompactTextString(m) } func (*LeaseLeasesRequest) ProtoMessage() {} -func (*LeaseLeasesRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{33} } +func (*LeaseLeasesRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{36} } type LeaseStatus struct { ID int64 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` @@ -2086,7 +2144,7 @@ type LeaseStatus struct { func (m *LeaseStatus) Reset() { *m = LeaseStatus{} } func (m *LeaseStatus) String() string { return proto.CompactTextString(m) } func (*LeaseStatus) ProtoMessage() {} -func (*LeaseStatus) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{34} } +func (*LeaseStatus) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{37} } func (m *LeaseStatus) GetID() int64 { if m != nil { @@ -2103,7 +2161,7 @@ type LeaseLeasesResponse struct { func (m *LeaseLeasesResponse) Reset() { *m = LeaseLeasesResponse{} } func (m *LeaseLeasesResponse) String() string { return proto.CompactTextString(m) } func (*LeaseLeasesResponse) ProtoMessage() {} -func (*LeaseLeasesResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{35} } +func (*LeaseLeasesResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{38} } func (m *LeaseLeasesResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2133,7 +2191,7 @@ type Member struct { func (m *Member) Reset() { *m = Member{} } func (m *Member) String() string { return proto.CompactTextString(m) } func (*Member) ProtoMessage() {} -func (*Member) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{36} } +func (*Member) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{39} } func (m *Member) GetID() uint64 { if m != nil { @@ -2171,7 +2229,7 @@ type MemberAddRequest struct { func (m *MemberAddRequest) Reset() { *m = MemberAddRequest{} } func (m *MemberAddRequest) String() string { return proto.CompactTextString(m) } func (*MemberAddRequest) ProtoMessage() {} -func (*MemberAddRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{37} } +func (*MemberAddRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{40} } func (m *MemberAddRequest) GetPeerURLs() []string { if m != nil { @@ -2191,7 +2249,7 @@ type MemberAddResponse struct { func (m *MemberAddResponse) Reset() { *m = MemberAddResponse{} } func (m *MemberAddResponse) String() string { return proto.CompactTextString(m) } func (*MemberAddResponse) ProtoMessage() {} -func (*MemberAddResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{38} } +func (*MemberAddResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{41} } func (m *MemberAddResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2222,7 +2280,7 @@ type MemberRemoveRequest struct { func (m *MemberRemoveRequest) Reset() { *m = MemberRemoveRequest{} } func (m *MemberRemoveRequest) String() string { return proto.CompactTextString(m) } func (*MemberRemoveRequest) ProtoMessage() {} -func (*MemberRemoveRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{39} } +func (*MemberRemoveRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{42} } func (m *MemberRemoveRequest) GetID() uint64 { if m != nil { @@ -2240,7 +2298,7 @@ type MemberRemoveResponse struct { func (m *MemberRemoveResponse) Reset() { *m = MemberRemoveResponse{} } func (m *MemberRemoveResponse) String() string { return proto.CompactTextString(m) } func (*MemberRemoveResponse) ProtoMessage() {} -func (*MemberRemoveResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{40} } +func (*MemberRemoveResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{43} } func (m *MemberRemoveResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2266,7 +2324,7 @@ type MemberUpdateRequest struct { func (m *MemberUpdateRequest) Reset() { *m = MemberUpdateRequest{} } func (m *MemberUpdateRequest) String() string { return proto.CompactTextString(m) } func (*MemberUpdateRequest) ProtoMessage() {} -func (*MemberUpdateRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{41} } +func (*MemberUpdateRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{44} } func (m *MemberUpdateRequest) GetID() uint64 { if m != nil { @@ -2291,7 +2349,7 @@ type MemberUpdateResponse struct { func (m *MemberUpdateResponse) Reset() { *m = MemberUpdateResponse{} } func (m *MemberUpdateResponse) String() string { return proto.CompactTextString(m) } func (*MemberUpdateResponse) ProtoMessage() {} -func (*MemberUpdateResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{42} } +func (*MemberUpdateResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{45} } func (m *MemberUpdateResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2313,7 +2371,7 @@ type MemberListRequest struct { func (m *MemberListRequest) Reset() { *m = MemberListRequest{} } func (m *MemberListRequest) String() string { return proto.CompactTextString(m) } func (*MemberListRequest) ProtoMessage() {} -func (*MemberListRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{43} } +func (*MemberListRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{46} } type MemberListResponse struct { Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` @@ -2324,7 +2382,7 @@ type MemberListResponse struct { func (m *MemberListResponse) Reset() { *m = MemberListResponse{} } func (m *MemberListResponse) String() string { return proto.CompactTextString(m) } func (*MemberListResponse) ProtoMessage() {} -func (*MemberListResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{44} } +func (*MemberListResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{47} } func (m *MemberListResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2346,7 +2404,7 @@ type DefragmentRequest struct { func (m *DefragmentRequest) Reset() { *m = DefragmentRequest{} } func (m *DefragmentRequest) String() string { return proto.CompactTextString(m) } func (*DefragmentRequest) ProtoMessage() {} -func (*DefragmentRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{45} } +func (*DefragmentRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{48} } type DefragmentResponse struct { Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` @@ -2355,7 +2413,7 @@ type DefragmentResponse struct { func (m *DefragmentResponse) Reset() { *m = DefragmentResponse{} } func (m *DefragmentResponse) String() string { return proto.CompactTextString(m) } func (*DefragmentResponse) ProtoMessage() {} -func (*DefragmentResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{46} } +func (*DefragmentResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{49} } func (m *DefragmentResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2372,7 +2430,7 @@ type MoveLeaderRequest struct { func (m *MoveLeaderRequest) Reset() { *m = MoveLeaderRequest{} } func (m *MoveLeaderRequest) String() string { return proto.CompactTextString(m) } func (*MoveLeaderRequest) ProtoMessage() {} -func (*MoveLeaderRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{47} } +func (*MoveLeaderRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{50} } func (m *MoveLeaderRequest) GetTargetID() uint64 { if m != nil { @@ -2388,7 +2446,7 @@ type MoveLeaderResponse struct { func (m *MoveLeaderResponse) Reset() { *m = MoveLeaderResponse{} } func (m *MoveLeaderResponse) String() string { return proto.CompactTextString(m) } func (*MoveLeaderResponse) ProtoMessage() {} -func (*MoveLeaderResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{48} } +func (*MoveLeaderResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{51} } func (m *MoveLeaderResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2412,7 +2470,7 @@ type AlarmRequest struct { func (m *AlarmRequest) Reset() { *m = AlarmRequest{} } func (m *AlarmRequest) String() string { return proto.CompactTextString(m) } func (*AlarmRequest) ProtoMessage() {} -func (*AlarmRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{49} } +func (*AlarmRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{52} } func (m *AlarmRequest) GetAction() AlarmRequest_AlarmAction { if m != nil { @@ -2445,7 +2503,7 @@ type AlarmMember struct { func (m *AlarmMember) Reset() { *m = AlarmMember{} } func (m *AlarmMember) String() string { return proto.CompactTextString(m) } func (*AlarmMember) ProtoMessage() {} -func (*AlarmMember) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{50} } +func (*AlarmMember) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{53} } func (m *AlarmMember) GetMemberID() uint64 { if m != nil { @@ -2470,7 +2528,7 @@ type AlarmResponse struct { func (m *AlarmResponse) Reset() { *m = AlarmResponse{} } func (m *AlarmResponse) String() string { return proto.CompactTextString(m) } func (*AlarmResponse) ProtoMessage() {} -func (*AlarmResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{51} } +func (*AlarmResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{54} } func (m *AlarmResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2492,7 +2550,7 @@ type StatusRequest struct { func (m *StatusRequest) Reset() { *m = StatusRequest{} } func (m *StatusRequest) String() string { return proto.CompactTextString(m) } func (*StatusRequest) ProtoMessage() {} -func (*StatusRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{52} } +func (*StatusRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{55} } type StatusResponse struct { Header *ResponseHeader `protobuf:"bytes,1,opt,name=header" json:"header,omitempty"` @@ -2517,7 +2575,7 @@ type StatusResponse struct { func (m *StatusResponse) Reset() { *m = StatusResponse{} } func (m *StatusResponse) String() string { return proto.CompactTextString(m) } func (*StatusResponse) ProtoMessage() {} -func (*StatusResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{53} } +func (*StatusResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{56} } func (m *StatusResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2588,7 +2646,7 @@ type AuthEnableRequest struct { func (m *AuthEnableRequest) Reset() { *m = AuthEnableRequest{} } func (m *AuthEnableRequest) String() string { return proto.CompactTextString(m) } func (*AuthEnableRequest) ProtoMessage() {} -func (*AuthEnableRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{54} } +func (*AuthEnableRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{57} } type AuthDisableRequest struct { } @@ -2596,7 +2654,7 @@ type AuthDisableRequest struct { func (m *AuthDisableRequest) Reset() { *m = AuthDisableRequest{} } func (m *AuthDisableRequest) String() string { return proto.CompactTextString(m) } func (*AuthDisableRequest) ProtoMessage() {} -func (*AuthDisableRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{55} } +func (*AuthDisableRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{58} } type AuthenticateRequest struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` @@ -2606,7 +2664,7 @@ type AuthenticateRequest struct { func (m *AuthenticateRequest) Reset() { *m = AuthenticateRequest{} } func (m *AuthenticateRequest) String() string { return proto.CompactTextString(m) } func (*AuthenticateRequest) ProtoMessage() {} -func (*AuthenticateRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{56} } +func (*AuthenticateRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{59} } func (m *AuthenticateRequest) GetName() string { if m != nil { @@ -2630,7 +2688,7 @@ type AuthUserAddRequest struct { func (m *AuthUserAddRequest) Reset() { *m = AuthUserAddRequest{} } func (m *AuthUserAddRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserAddRequest) ProtoMessage() {} -func (*AuthUserAddRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{57} } +func (*AuthUserAddRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{60} } func (m *AuthUserAddRequest) GetName() string { if m != nil { @@ -2653,7 +2711,7 @@ type AuthUserGetRequest struct { func (m *AuthUserGetRequest) Reset() { *m = AuthUserGetRequest{} } func (m *AuthUserGetRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserGetRequest) ProtoMessage() {} -func (*AuthUserGetRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{58} } +func (*AuthUserGetRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{61} } func (m *AuthUserGetRequest) GetName() string { if m != nil { @@ -2670,7 +2728,7 @@ type AuthUserDeleteRequest struct { func (m *AuthUserDeleteRequest) Reset() { *m = AuthUserDeleteRequest{} } func (m *AuthUserDeleteRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserDeleteRequest) ProtoMessage() {} -func (*AuthUserDeleteRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{59} } +func (*AuthUserDeleteRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{62} } func (m *AuthUserDeleteRequest) GetName() string { if m != nil { @@ -2690,7 +2748,7 @@ func (m *AuthUserChangePasswordRequest) Reset() { *m = AuthUserChangePas func (m *AuthUserChangePasswordRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserChangePasswordRequest) ProtoMessage() {} func (*AuthUserChangePasswordRequest) Descriptor() ([]byte, []int) { - return fileDescriptorRpc, []int{60} + return fileDescriptorRpc, []int{63} } func (m *AuthUserChangePasswordRequest) GetName() string { @@ -2717,7 +2775,7 @@ type AuthUserGrantRoleRequest struct { func (m *AuthUserGrantRoleRequest) Reset() { *m = AuthUserGrantRoleRequest{} } func (m *AuthUserGrantRoleRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserGrantRoleRequest) ProtoMessage() {} -func (*AuthUserGrantRoleRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{61} } +func (*AuthUserGrantRoleRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{64} } func (m *AuthUserGrantRoleRequest) GetUser() string { if m != nil { @@ -2741,7 +2799,7 @@ type AuthUserRevokeRoleRequest struct { func (m *AuthUserRevokeRoleRequest) Reset() { *m = AuthUserRevokeRoleRequest{} } func (m *AuthUserRevokeRoleRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserRevokeRoleRequest) ProtoMessage() {} -func (*AuthUserRevokeRoleRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{62} } +func (*AuthUserRevokeRoleRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{65} } func (m *AuthUserRevokeRoleRequest) GetName() string { if m != nil { @@ -2765,7 +2823,7 @@ type AuthRoleAddRequest struct { func (m *AuthRoleAddRequest) Reset() { *m = AuthRoleAddRequest{} } func (m *AuthRoleAddRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleAddRequest) ProtoMessage() {} -func (*AuthRoleAddRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{63} } +func (*AuthRoleAddRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{66} } func (m *AuthRoleAddRequest) GetName() string { if m != nil { @@ -2781,7 +2839,7 @@ type AuthRoleGetRequest struct { func (m *AuthRoleGetRequest) Reset() { *m = AuthRoleGetRequest{} } func (m *AuthRoleGetRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleGetRequest) ProtoMessage() {} -func (*AuthRoleGetRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{64} } +func (*AuthRoleGetRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{67} } func (m *AuthRoleGetRequest) GetRole() string { if m != nil { @@ -2796,7 +2854,7 @@ type AuthUserListRequest struct { func (m *AuthUserListRequest) Reset() { *m = AuthUserListRequest{} } func (m *AuthUserListRequest) String() string { return proto.CompactTextString(m) } func (*AuthUserListRequest) ProtoMessage() {} -func (*AuthUserListRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{65} } +func (*AuthUserListRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{68} } type AuthRoleListRequest struct { } @@ -2804,7 +2862,7 @@ type AuthRoleListRequest struct { func (m *AuthRoleListRequest) Reset() { *m = AuthRoleListRequest{} } func (m *AuthRoleListRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleListRequest) ProtoMessage() {} -func (*AuthRoleListRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{66} } +func (*AuthRoleListRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{69} } type AuthRoleDeleteRequest struct { Role string `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` @@ -2813,7 +2871,7 @@ type AuthRoleDeleteRequest struct { func (m *AuthRoleDeleteRequest) Reset() { *m = AuthRoleDeleteRequest{} } func (m *AuthRoleDeleteRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleDeleteRequest) ProtoMessage() {} -func (*AuthRoleDeleteRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{67} } +func (*AuthRoleDeleteRequest) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{70} } func (m *AuthRoleDeleteRequest) GetRole() string { if m != nil { @@ -2833,7 +2891,7 @@ func (m *AuthRoleGrantPermissionRequest) Reset() { *m = AuthRoleGrantPer func (m *AuthRoleGrantPermissionRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleGrantPermissionRequest) ProtoMessage() {} func (*AuthRoleGrantPermissionRequest) Descriptor() ([]byte, []int) { - return fileDescriptorRpc, []int{68} + return fileDescriptorRpc, []int{71} } func (m *AuthRoleGrantPermissionRequest) GetName() string { @@ -2860,7 +2918,7 @@ func (m *AuthRoleRevokePermissionRequest) Reset() { *m = AuthRoleRevokeP func (m *AuthRoleRevokePermissionRequest) String() string { return proto.CompactTextString(m) } func (*AuthRoleRevokePermissionRequest) ProtoMessage() {} func (*AuthRoleRevokePermissionRequest) Descriptor() ([]byte, []int) { - return fileDescriptorRpc, []int{69} + return fileDescriptorRpc, []int{72} } func (m *AuthRoleRevokePermissionRequest) GetRole() string { @@ -2891,7 +2949,7 @@ type AuthEnableResponse struct { func (m *AuthEnableResponse) Reset() { *m = AuthEnableResponse{} } func (m *AuthEnableResponse) String() string { return proto.CompactTextString(m) } func (*AuthEnableResponse) ProtoMessage() {} -func (*AuthEnableResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{70} } +func (*AuthEnableResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{73} } func (m *AuthEnableResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2907,7 +2965,7 @@ type AuthDisableResponse struct { func (m *AuthDisableResponse) Reset() { *m = AuthDisableResponse{} } func (m *AuthDisableResponse) String() string { return proto.CompactTextString(m) } func (*AuthDisableResponse) ProtoMessage() {} -func (*AuthDisableResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{71} } +func (*AuthDisableResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{74} } func (m *AuthDisableResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2925,7 +2983,7 @@ type AuthenticateResponse struct { func (m *AuthenticateResponse) Reset() { *m = AuthenticateResponse{} } func (m *AuthenticateResponse) String() string { return proto.CompactTextString(m) } func (*AuthenticateResponse) ProtoMessage() {} -func (*AuthenticateResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{72} } +func (*AuthenticateResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{75} } func (m *AuthenticateResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2948,7 +3006,7 @@ type AuthUserAddResponse struct { func (m *AuthUserAddResponse) Reset() { *m = AuthUserAddResponse{} } func (m *AuthUserAddResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserAddResponse) ProtoMessage() {} -func (*AuthUserAddResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{73} } +func (*AuthUserAddResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{76} } func (m *AuthUserAddResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2965,7 +3023,7 @@ type AuthUserGetResponse struct { func (m *AuthUserGetResponse) Reset() { *m = AuthUserGetResponse{} } func (m *AuthUserGetResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserGetResponse) ProtoMessage() {} -func (*AuthUserGetResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{74} } +func (*AuthUserGetResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{77} } func (m *AuthUserGetResponse) GetHeader() *ResponseHeader { if m != nil { @@ -2988,7 +3046,7 @@ type AuthUserDeleteResponse struct { func (m *AuthUserDeleteResponse) Reset() { *m = AuthUserDeleteResponse{} } func (m *AuthUserDeleteResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserDeleteResponse) ProtoMessage() {} -func (*AuthUserDeleteResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{75} } +func (*AuthUserDeleteResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{78} } func (m *AuthUserDeleteResponse) GetHeader() *ResponseHeader { if m != nil { @@ -3005,7 +3063,7 @@ func (m *AuthUserChangePasswordResponse) Reset() { *m = AuthUserChangePa func (m *AuthUserChangePasswordResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserChangePasswordResponse) ProtoMessage() {} func (*AuthUserChangePasswordResponse) Descriptor() ([]byte, []int) { - return fileDescriptorRpc, []int{76} + return fileDescriptorRpc, []int{79} } func (m *AuthUserChangePasswordResponse) GetHeader() *ResponseHeader { @@ -3022,7 +3080,7 @@ type AuthUserGrantRoleResponse struct { func (m *AuthUserGrantRoleResponse) Reset() { *m = AuthUserGrantRoleResponse{} } func (m *AuthUserGrantRoleResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserGrantRoleResponse) ProtoMessage() {} -func (*AuthUserGrantRoleResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{77} } +func (*AuthUserGrantRoleResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{80} } func (m *AuthUserGrantRoleResponse) GetHeader() *ResponseHeader { if m != nil { @@ -3038,7 +3096,7 @@ type AuthUserRevokeRoleResponse struct { func (m *AuthUserRevokeRoleResponse) Reset() { *m = AuthUserRevokeRoleResponse{} } func (m *AuthUserRevokeRoleResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserRevokeRoleResponse) ProtoMessage() {} -func (*AuthUserRevokeRoleResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{78} } +func (*AuthUserRevokeRoleResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{81} } func (m *AuthUserRevokeRoleResponse) GetHeader() *ResponseHeader { if m != nil { @@ -3054,7 +3112,7 @@ type AuthRoleAddResponse struct { func (m *AuthRoleAddResponse) Reset() { *m = AuthRoleAddResponse{} } func (m *AuthRoleAddResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleAddResponse) ProtoMessage() {} -func (*AuthRoleAddResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{79} } +func (*AuthRoleAddResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{82} } func (m *AuthRoleAddResponse) GetHeader() *ResponseHeader { if m != nil { @@ -3071,7 +3129,7 @@ type AuthRoleGetResponse struct { func (m *AuthRoleGetResponse) Reset() { *m = AuthRoleGetResponse{} } func (m *AuthRoleGetResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleGetResponse) ProtoMessage() {} -func (*AuthRoleGetResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{80} } +func (*AuthRoleGetResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{83} } func (m *AuthRoleGetResponse) GetHeader() *ResponseHeader { if m != nil { @@ -3095,7 +3153,7 @@ type AuthRoleListResponse struct { func (m *AuthRoleListResponse) Reset() { *m = AuthRoleListResponse{} } func (m *AuthRoleListResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleListResponse) ProtoMessage() {} -func (*AuthRoleListResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{81} } +func (*AuthRoleListResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{84} } func (m *AuthRoleListResponse) GetHeader() *ResponseHeader { if m != nil { @@ -3119,7 +3177,7 @@ type AuthUserListResponse struct { func (m *AuthUserListResponse) Reset() { *m = AuthUserListResponse{} } func (m *AuthUserListResponse) String() string { return proto.CompactTextString(m) } func (*AuthUserListResponse) ProtoMessage() {} -func (*AuthUserListResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{82} } +func (*AuthUserListResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{85} } func (m *AuthUserListResponse) GetHeader() *ResponseHeader { if m != nil { @@ -3142,7 +3200,7 @@ type AuthRoleDeleteResponse struct { func (m *AuthRoleDeleteResponse) Reset() { *m = AuthRoleDeleteResponse{} } func (m *AuthRoleDeleteResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleDeleteResponse) ProtoMessage() {} -func (*AuthRoleDeleteResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{83} } +func (*AuthRoleDeleteResponse) Descriptor() ([]byte, []int) { return fileDescriptorRpc, []int{86} } func (m *AuthRoleDeleteResponse) GetHeader() *ResponseHeader { if m != nil { @@ -3159,7 +3217,7 @@ func (m *AuthRoleGrantPermissionResponse) Reset() { *m = AuthRoleGrantPe func (m *AuthRoleGrantPermissionResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleGrantPermissionResponse) ProtoMessage() {} func (*AuthRoleGrantPermissionResponse) Descriptor() ([]byte, []int) { - return fileDescriptorRpc, []int{84} + return fileDescriptorRpc, []int{87} } func (m *AuthRoleGrantPermissionResponse) GetHeader() *ResponseHeader { @@ -3177,7 +3235,7 @@ func (m *AuthRoleRevokePermissionResponse) Reset() { *m = AuthRoleRevoke func (m *AuthRoleRevokePermissionResponse) String() string { return proto.CompactTextString(m) } func (*AuthRoleRevokePermissionResponse) ProtoMessage() {} func (*AuthRoleRevokePermissionResponse) Descriptor() ([]byte, []int) { - return fileDescriptorRpc, []int{85} + return fileDescriptorRpc, []int{88} } func (m *AuthRoleRevokePermissionResponse) GetHeader() *ResponseHeader { @@ -3217,6 +3275,9 @@ func init() { proto.RegisterType((*LeaseGrantResponse)(nil), "etcdserverpb.LeaseGrantResponse") proto.RegisterType((*LeaseRevokeRequest)(nil), "etcdserverpb.LeaseRevokeRequest") proto.RegisterType((*LeaseRevokeResponse)(nil), "etcdserverpb.LeaseRevokeResponse") + proto.RegisterType((*LeaseCheckpoint)(nil), "etcdserverpb.LeaseCheckpoint") + proto.RegisterType((*LeaseCheckpointRequest)(nil), "etcdserverpb.LeaseCheckpointRequest") + proto.RegisterType((*LeaseCheckpointResponse)(nil), "etcdserverpb.LeaseCheckpointResponse") proto.RegisterType((*LeaseKeepAliveRequest)(nil), "etcdserverpb.LeaseKeepAliveRequest") proto.RegisterType((*LeaseKeepAliveResponse)(nil), "etcdserverpb.LeaseKeepAliveResponse") proto.RegisterType((*LeaseTimeToLiveRequest)(nil), "etcdserverpb.LeaseTimeToLiveRequest") @@ -6312,6 +6373,92 @@ func (m *LeaseRevokeResponse) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *LeaseCheckpoint) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LeaseCheckpoint) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.ID != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.ID)) + } + if m.Remaining_TTL != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Remaining_TTL)) + } + return i, nil +} + +func (m *LeaseCheckpointRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LeaseCheckpointRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Checkpoints) > 0 { + for _, msg := range m.Checkpoints { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + +func (m *LeaseCheckpointResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LeaseCheckpointResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Header != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) + n30, err := m.Header.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n30 + } + return i, nil +} + func (m *LeaseKeepAliveRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -6354,11 +6501,11 @@ func (m *LeaseKeepAliveResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n30, err := m.Header.MarshalTo(dAtA[i:]) + n31, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n30 + i += n31 } if m.ID != 0 { dAtA[i] = 0x10 @@ -6425,11 +6572,11 @@ func (m *LeaseTimeToLiveResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n31, err := m.Header.MarshalTo(dAtA[i:]) + n32, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n31 + i += n32 } if m.ID != 0 { dAtA[i] = 0x10 @@ -6517,11 +6664,11 @@ func (m *LeaseLeasesResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n32, err := m.Header.MarshalTo(dAtA[i:]) + n33, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n32 + i += n33 } if len(m.Leases) > 0 { for _, msg := range m.Leases { @@ -6649,21 +6796,21 @@ func (m *MemberAddResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n33, err := m.Header.MarshalTo(dAtA[i:]) + n34, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n33 + i += n34 } if m.Member != nil { dAtA[i] = 0x12 i++ i = encodeVarintRpc(dAtA, i, uint64(m.Member.Size())) - n34, err := m.Member.MarshalTo(dAtA[i:]) + n35, err := m.Member.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n34 + i += n35 } if len(m.Members) > 0 { for _, msg := range m.Members { @@ -6722,11 +6869,11 @@ func (m *MemberRemoveResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n35, err := m.Header.MarshalTo(dAtA[i:]) + n36, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n35 + i += n36 } if len(m.Members) > 0 { for _, msg := range m.Members { @@ -6800,11 +6947,11 @@ func (m *MemberUpdateResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n36, err := m.Header.MarshalTo(dAtA[i:]) + n37, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n36 + i += n37 } if len(m.Members) > 0 { for _, msg := range m.Members { @@ -6858,11 +7005,11 @@ func (m *MemberListResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n37, err := m.Header.MarshalTo(dAtA[i:]) + n38, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n37 + i += n38 } if len(m.Members) > 0 { for _, msg := range m.Members { @@ -6916,11 +7063,11 @@ func (m *DefragmentResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n38, err := m.Header.MarshalTo(dAtA[i:]) + n39, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n38 + i += n39 } return i, nil } @@ -6967,11 +7114,11 @@ func (m *MoveLeaderResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n39, err := m.Header.MarshalTo(dAtA[i:]) + n40, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n39 + i += n40 } return i, nil } @@ -7056,11 +7203,11 @@ func (m *AlarmResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n40, err := m.Header.MarshalTo(dAtA[i:]) + n41, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n40 + i += n41 } if len(m.Alarms) > 0 { for _, msg := range m.Alarms { @@ -7114,11 +7261,11 @@ func (m *StatusResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n41, err := m.Header.MarshalTo(dAtA[i:]) + n42, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n41 + i += n42 } if len(m.Version) > 0 { dAtA[i] = 0x12 @@ -7541,11 +7688,11 @@ func (m *AuthRoleGrantPermissionRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintRpc(dAtA, i, uint64(m.Perm.Size())) - n42, err := m.Perm.MarshalTo(dAtA[i:]) + n43, err := m.Perm.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n42 + i += n43 } return i, nil } @@ -7605,11 +7752,11 @@ func (m *AuthEnableResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n43, err := m.Header.MarshalTo(dAtA[i:]) + n44, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n43 + i += n44 } return i, nil } @@ -7633,11 +7780,11 @@ func (m *AuthDisableResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n44, err := m.Header.MarshalTo(dAtA[i:]) + n45, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n44 + i += n45 } return i, nil } @@ -7661,11 +7808,11 @@ func (m *AuthenticateResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n45, err := m.Header.MarshalTo(dAtA[i:]) + n46, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n45 + i += n46 } if len(m.Token) > 0 { dAtA[i] = 0x12 @@ -7695,11 +7842,11 @@ func (m *AuthUserAddResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n46, err := m.Header.MarshalTo(dAtA[i:]) + n47, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n46 + i += n47 } return i, nil } @@ -7723,11 +7870,11 @@ func (m *AuthUserGetResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n47, err := m.Header.MarshalTo(dAtA[i:]) + n48, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n47 + i += n48 } if len(m.Roles) > 0 { for _, s := range m.Roles { @@ -7766,11 +7913,11 @@ func (m *AuthUserDeleteResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n48, err := m.Header.MarshalTo(dAtA[i:]) + n49, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n48 + i += n49 } return i, nil } @@ -7794,11 +7941,11 @@ func (m *AuthUserChangePasswordResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n49, err := m.Header.MarshalTo(dAtA[i:]) + n50, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n49 + i += n50 } return i, nil } @@ -7822,11 +7969,11 @@ func (m *AuthUserGrantRoleResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n50, err := m.Header.MarshalTo(dAtA[i:]) + n51, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n50 + i += n51 } return i, nil } @@ -7850,11 +7997,11 @@ func (m *AuthUserRevokeRoleResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n51, err := m.Header.MarshalTo(dAtA[i:]) + n52, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n51 + i += n52 } return i, nil } @@ -7878,11 +8025,11 @@ func (m *AuthRoleAddResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n52, err := m.Header.MarshalTo(dAtA[i:]) + n53, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n52 + i += n53 } return i, nil } @@ -7906,11 +8053,11 @@ func (m *AuthRoleGetResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n53, err := m.Header.MarshalTo(dAtA[i:]) + n54, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n53 + i += n54 } if len(m.Perm) > 0 { for _, msg := range m.Perm { @@ -7946,11 +8093,11 @@ func (m *AuthRoleListResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n54, err := m.Header.MarshalTo(dAtA[i:]) + n55, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n54 + i += n55 } if len(m.Roles) > 0 { for _, s := range m.Roles { @@ -7989,11 +8136,11 @@ func (m *AuthUserListResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n55, err := m.Header.MarshalTo(dAtA[i:]) + n56, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n55 + i += n56 } if len(m.Users) > 0 { for _, s := range m.Users { @@ -8032,11 +8179,11 @@ func (m *AuthRoleDeleteResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n56, err := m.Header.MarshalTo(dAtA[i:]) + n57, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n56 + i += n57 } return i, nil } @@ -8060,11 +8207,11 @@ func (m *AuthRoleGrantPermissionResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n57, err := m.Header.MarshalTo(dAtA[i:]) + n58, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n57 + i += n58 } return i, nil } @@ -8088,11 +8235,11 @@ func (m *AuthRoleRevokePermissionResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintRpc(dAtA, i, uint64(m.Header.Size())) - n58, err := m.Header.MarshalTo(dAtA[i:]) + n59, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n58 + i += n59 } return i, nil } @@ -8720,6 +8867,40 @@ func (m *LeaseRevokeResponse) Size() (n int) { return n } +func (m *LeaseCheckpoint) Size() (n int) { + var l int + _ = l + if m.ID != 0 { + n += 1 + sovRpc(uint64(m.ID)) + } + if m.Remaining_TTL != 0 { + n += 1 + sovRpc(uint64(m.Remaining_TTL)) + } + return n +} + +func (m *LeaseCheckpointRequest) Size() (n int) { + var l int + _ = l + if len(m.Checkpoints) > 0 { + for _, e := range m.Checkpoints { + l = e.Size() + n += 1 + l + sovRpc(uint64(l)) + } + } + return n +} + +func (m *LeaseCheckpointResponse) Size() (n int) { + var l int + _ = l + if m.Header != nil { + l = m.Header.Size() + n += 1 + l + sovRpc(uint64(l)) + } + return n +} + func (m *LeaseKeepAliveRequest) Size() (n int) { var l int _ = l @@ -13380,6 +13561,258 @@ func (m *LeaseRevokeResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *LeaseCheckpoint) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LeaseCheckpoint: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LeaseCheckpoint: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + m.ID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ID |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Remaining_TTL", wireType) + } + m.Remaining_TTL = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Remaining_TTL |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LeaseCheckpointRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LeaseCheckpointRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LeaseCheckpointRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Checkpoints", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Checkpoints = append(m.Checkpoints, &LeaseCheckpoint{}) + if err := m.Checkpoints[len(m.Checkpoints)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LeaseCheckpointResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LeaseCheckpointResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LeaseCheckpointResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Header", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowRpc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthRpc + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Header == nil { + m.Header = &ResponseHeader{} + } + if err := m.Header.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipRpc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthRpc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *LeaseKeepAliveRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -18872,241 +19305,245 @@ var ( func init() { proto.RegisterFile("rpc.proto", fileDescriptorRpc) } var fileDescriptorRpc = []byte{ - // 3773 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x5b, 0x5b, 0x6f, 0x1c, 0x47, - 0x76, 0x66, 0xcf, 0x70, 0x6e, 0x67, 0x2e, 0x1c, 0x16, 0x2f, 0x1a, 0x8d, 0x24, 0x8a, 0x2a, 0x49, - 0x16, 0x2d, 0xd9, 0x1c, 0x9b, 0xb6, 0x13, 0x40, 0x49, 0x0c, 0x53, 0xe4, 0x58, 0xa4, 0x49, 0x91, - 0x74, 0x73, 0x28, 0x5f, 0x60, 0x84, 0x68, 0xce, 0x94, 0xc8, 0x0e, 0x67, 0xba, 0xc7, 0xdd, 0x3d, - 0x23, 0xd2, 0x09, 0xe2, 0xc0, 0x70, 0x02, 0x24, 0x8f, 0x36, 0x10, 0x24, 0x0f, 0x79, 0x0a, 0x82, - 0xc0, 0x0f, 0x0b, 0xec, 0xdb, 0x02, 0xfb, 0x0b, 0xf6, 0x6d, 0x77, 0xb1, 0x7f, 0x60, 0xe1, 0xf5, - 0xcb, 0xfe, 0x8b, 0x45, 0xdd, 0xba, 0xab, 0x7b, 0xba, 0x49, 0xd9, 0x63, 0xfb, 0x85, 0xea, 0xaa, - 0x3a, 0x75, 0xbe, 0x53, 0xa7, 0xaa, 0xce, 0xa9, 0xfa, 0x6a, 0x04, 0x05, 0xa7, 0xdf, 0x5e, 0xee, - 0x3b, 0xb6, 0x67, 0xa3, 0x12, 0xf1, 0xda, 0x1d, 0x97, 0x38, 0x43, 0xe2, 0xf4, 0x8f, 0xea, 0xb3, - 0xc7, 0xf6, 0xb1, 0xcd, 0x1a, 0x1a, 0xf4, 0x8b, 0xcb, 0xd4, 0xaf, 0x52, 0x99, 0x46, 0x6f, 0xd8, - 0x6e, 0xb3, 0x3f, 0xfd, 0xa3, 0xc6, 0xe9, 0x50, 0x34, 0x5d, 0x63, 0x4d, 0xc6, 0xc0, 0x3b, 0x61, - 0x7f, 0xfa, 0x47, 0xec, 0x1f, 0xd1, 0x78, 0xfd, 0xd8, 0xb6, 0x8f, 0xbb, 0xa4, 0x61, 0xf4, 0xcd, - 0x86, 0x61, 0x59, 0xb6, 0x67, 0x78, 0xa6, 0x6d, 0xb9, 0xbc, 0x15, 0xff, 0xab, 0x06, 0x15, 0x9d, - 0xb8, 0x7d, 0xdb, 0x72, 0xc9, 0x06, 0x31, 0x3a, 0xc4, 0x41, 0x37, 0x00, 0xda, 0xdd, 0x81, 0xeb, - 0x11, 0xe7, 0xd0, 0xec, 0xd4, 0xb4, 0x45, 0x6d, 0x69, 0x52, 0x2f, 0x88, 0x9a, 0xcd, 0x0e, 0xba, - 0x06, 0x85, 0x1e, 0xe9, 0x1d, 0xf1, 0xd6, 0x14, 0x6b, 0xcd, 0xf3, 0x8a, 0xcd, 0x0e, 0xaa, 0x43, - 0xde, 0x21, 0x43, 0xd3, 0x35, 0x6d, 0xab, 0x96, 0x5e, 0xd4, 0x96, 0xd2, 0xba, 0x5f, 0xa6, 0x1d, - 0x1d, 0xe3, 0x99, 0x77, 0xe8, 0x11, 0xa7, 0x57, 0x9b, 0xe4, 0x1d, 0x69, 0x45, 0x8b, 0x38, 0x3d, - 0xfc, 0x65, 0x06, 0x4a, 0xba, 0x61, 0x1d, 0x13, 0x9d, 0x7c, 0x3a, 0x20, 0xae, 0x87, 0xaa, 0x90, - 0x3e, 0x25, 0xe7, 0x0c, 0xbe, 0xa4, 0xd3, 0x4f, 0xde, 0xdf, 0x3a, 0x26, 0x87, 0xc4, 0xe2, 0xc0, - 0x25, 0xda, 0xdf, 0x3a, 0x26, 0x4d, 0xab, 0x83, 0x66, 0x21, 0xd3, 0x35, 0x7b, 0xa6, 0x27, 0x50, - 0x79, 0x21, 0x64, 0xce, 0x64, 0xc4, 0x9c, 0x35, 0x00, 0xd7, 0x76, 0xbc, 0x43, 0xdb, 0xe9, 0x10, - 0xa7, 0x96, 0x59, 0xd4, 0x96, 0x2a, 0x2b, 0x77, 0x96, 0xd5, 0x89, 0x58, 0x56, 0x0d, 0x5a, 0xde, - 0xb7, 0x1d, 0x6f, 0x97, 0xca, 0xea, 0x05, 0x57, 0x7e, 0xa2, 0x77, 0xa1, 0xc8, 0x94, 0x78, 0x86, - 0x73, 0x4c, 0xbc, 0x5a, 0x96, 0x69, 0xb9, 0x7b, 0x89, 0x96, 0x16, 0x13, 0xd6, 0x19, 0x3c, 0xff, - 0x46, 0x18, 0x4a, 0x2e, 0x71, 0x4c, 0xa3, 0x6b, 0x7e, 0x66, 0x1c, 0x75, 0x49, 0x2d, 0xb7, 0xa8, - 0x2d, 0xe5, 0xf5, 0x50, 0x1d, 0x1d, 0xff, 0x29, 0x39, 0x77, 0x0f, 0x6d, 0xab, 0x7b, 0x5e, 0xcb, - 0x33, 0x81, 0x3c, 0xad, 0xd8, 0xb5, 0xba, 0xe7, 0x6c, 0xd2, 0xec, 0x81, 0xe5, 0xf1, 0xd6, 0x02, - 0x6b, 0x2d, 0xb0, 0x1a, 0xd6, 0xbc, 0x04, 0xd5, 0x9e, 0x69, 0x1d, 0xf6, 0xec, 0xce, 0xa1, 0xef, - 0x10, 0x60, 0x0e, 0xa9, 0xf4, 0x4c, 0xeb, 0x89, 0xdd, 0xd1, 0xa5, 0x5b, 0xa8, 0xa4, 0x71, 0x16, - 0x96, 0x2c, 0x0a, 0x49, 0xe3, 0x4c, 0x95, 0x5c, 0x86, 0x19, 0xaa, 0xb3, 0xed, 0x10, 0xc3, 0x23, - 0x81, 0x70, 0x89, 0x09, 0x4f, 0xf7, 0x4c, 0x6b, 0x8d, 0xb5, 0x84, 0xe4, 0x8d, 0xb3, 0x11, 0xf9, - 0xb2, 0x90, 0x37, 0xce, 0xc2, 0xf2, 0x78, 0x19, 0x0a, 0xbe, 0xcf, 0x51, 0x1e, 0x26, 0x77, 0x76, - 0x77, 0x9a, 0xd5, 0x09, 0x04, 0x90, 0x5d, 0xdd, 0x5f, 0x6b, 0xee, 0xac, 0x57, 0x35, 0x54, 0x84, - 0xdc, 0x7a, 0x93, 0x17, 0x52, 0xf8, 0x11, 0x40, 0xe0, 0x5d, 0x94, 0x83, 0xf4, 0x56, 0xf3, 0xa3, - 0xea, 0x04, 0x95, 0x79, 0xda, 0xd4, 0xf7, 0x37, 0x77, 0x77, 0xaa, 0x1a, 0xed, 0xbc, 0xa6, 0x37, - 0x57, 0x5b, 0xcd, 0x6a, 0x8a, 0x4a, 0x3c, 0xd9, 0x5d, 0xaf, 0xa6, 0x51, 0x01, 0x32, 0x4f, 0x57, - 0xb7, 0x0f, 0x9a, 0xd5, 0x49, 0xfc, 0xb5, 0x06, 0x65, 0x31, 0x5f, 0x7c, 0x4f, 0xa0, 0x37, 0x21, - 0x7b, 0xc2, 0xf6, 0x05, 0x5b, 0x8a, 0xc5, 0x95, 0xeb, 0x91, 0xc9, 0x0d, 0xed, 0x1d, 0x5d, 0xc8, - 0x22, 0x0c, 0xe9, 0xd3, 0xa1, 0x5b, 0x4b, 0x2d, 0xa6, 0x97, 0x8a, 0x2b, 0xd5, 0x65, 0xbe, 0x61, - 0x97, 0xb7, 0xc8, 0xf9, 0x53, 0xa3, 0x3b, 0x20, 0x3a, 0x6d, 0x44, 0x08, 0x26, 0x7b, 0xb6, 0x43, - 0xd8, 0x8a, 0xcd, 0xeb, 0xec, 0x9b, 0x2e, 0x63, 0x36, 0x69, 0x62, 0xb5, 0xf2, 0x02, 0xfe, 0x46, - 0x03, 0xd8, 0x1b, 0x78, 0xc9, 0x5b, 0x63, 0x16, 0x32, 0x43, 0xaa, 0x58, 0x6c, 0x0b, 0x5e, 0x60, - 0x7b, 0x82, 0x18, 0x2e, 0xf1, 0xf7, 0x04, 0x2d, 0xa0, 0x2b, 0x90, 0xeb, 0x3b, 0x64, 0x78, 0x78, - 0x3a, 0x64, 0x20, 0x79, 0x3d, 0x4b, 0x8b, 0x5b, 0x43, 0x74, 0x0b, 0x4a, 0xe6, 0xb1, 0x65, 0x3b, - 0xe4, 0x90, 0xeb, 0xca, 0xb0, 0xd6, 0x22, 0xaf, 0x63, 0x76, 0x2b, 0x22, 0x5c, 0x71, 0x56, 0x15, - 0xd9, 0xa6, 0x55, 0xd8, 0x82, 0x22, 0x33, 0x75, 0x2c, 0xf7, 0xbd, 0x1c, 0xd8, 0x98, 0x62, 0xdd, - 0x46, 0x5d, 0x28, 0xac, 0xc6, 0x9f, 0x00, 0x5a, 0x27, 0x5d, 0xe2, 0x91, 0x71, 0xa2, 0x87, 0xe2, - 0x93, 0xb4, 0xea, 0x13, 0xfc, 0x95, 0x06, 0x33, 0x21, 0xf5, 0x63, 0x0d, 0xab, 0x06, 0xb9, 0x0e, - 0x53, 0xc6, 0x2d, 0x48, 0xeb, 0xb2, 0x88, 0x1e, 0x40, 0x5e, 0x18, 0xe0, 0xd6, 0xd2, 0x09, 0x8b, - 0x26, 0xc7, 0x6d, 0x72, 0xf1, 0x37, 0x29, 0x28, 0x88, 0x81, 0xee, 0xf6, 0xd1, 0x2a, 0x94, 0x1d, - 0x5e, 0x38, 0x64, 0xe3, 0x11, 0x16, 0xd5, 0x93, 0x83, 0xd0, 0xc6, 0x84, 0x5e, 0x12, 0x5d, 0x58, - 0x35, 0xfa, 0x1b, 0x28, 0x4a, 0x15, 0xfd, 0x81, 0x27, 0x5c, 0x5e, 0x0b, 0x2b, 0x08, 0xd6, 0xdf, - 0xc6, 0x84, 0x0e, 0x42, 0x7c, 0x6f, 0xe0, 0xa1, 0x16, 0xcc, 0xca, 0xce, 0x7c, 0x34, 0xc2, 0x8c, - 0x34, 0xd3, 0xb2, 0x18, 0xd6, 0x32, 0x3a, 0x55, 0x1b, 0x13, 0x3a, 0x12, 0xfd, 0x95, 0x46, 0xd5, - 0x24, 0xef, 0x8c, 0x07, 0xef, 0x11, 0x93, 0x5a, 0x67, 0xd6, 0xa8, 0x49, 0xad, 0x33, 0xeb, 0x51, - 0x01, 0x72, 0xa2, 0x84, 0x7f, 0x95, 0x02, 0x90, 0xb3, 0xb1, 0xdb, 0x47, 0xeb, 0x50, 0x71, 0x44, - 0x29, 0xe4, 0xad, 0x6b, 0xb1, 0xde, 0x12, 0x93, 0x38, 0xa1, 0x97, 0x65, 0x27, 0x6e, 0xdc, 0xdb, - 0x50, 0xf2, 0xb5, 0x04, 0x0e, 0xbb, 0x1a, 0xe3, 0x30, 0x5f, 0x43, 0x51, 0x76, 0xa0, 0x2e, 0xfb, - 0x00, 0xe6, 0xfc, 0xfe, 0x31, 0x3e, 0xbb, 0x75, 0x81, 0xcf, 0x7c, 0x85, 0x33, 0x52, 0x83, 0xea, - 0x35, 0xd5, 0xb0, 0xc0, 0x6d, 0x57, 0x63, 0xdc, 0x36, 0x6a, 0x18, 0x75, 0x1c, 0xd0, 0x7c, 0xc9, - 0x8b, 0xf8, 0xcf, 0x69, 0xc8, 0xad, 0xd9, 0xbd, 0xbe, 0xe1, 0xd0, 0xd9, 0xc8, 0x3a, 0xc4, 0x1d, - 0x74, 0x3d, 0xe6, 0xae, 0xca, 0xca, 0xed, 0xb0, 0x46, 0x21, 0x26, 0xff, 0xd5, 0x99, 0xa8, 0x2e, - 0xba, 0xd0, 0xce, 0x22, 0x3d, 0xa6, 0x5e, 0xa0, 0xb3, 0x48, 0x8e, 0xa2, 0x8b, 0xdc, 0xc8, 0xe9, - 0x60, 0x23, 0xd7, 0x21, 0x37, 0x24, 0x4e, 0x90, 0xd2, 0x37, 0x26, 0x74, 0x59, 0x81, 0x5e, 0x86, - 0xa9, 0x68, 0x7a, 0xc9, 0x08, 0x99, 0x4a, 0x3b, 0x9c, 0x8d, 0x6e, 0x43, 0x29, 0x94, 0xe3, 0xb2, - 0x42, 0xae, 0xd8, 0x53, 0x52, 0xdc, 0xbc, 0x8c, 0xab, 0x34, 0x1f, 0x97, 0x36, 0x26, 0x64, 0x64, - 0x9d, 0x97, 0x91, 0x35, 0x2f, 0x7a, 0x89, 0xd8, 0x1a, 0x0a, 0x32, 0xef, 0x84, 0x83, 0x0c, 0x7e, - 0x07, 0xca, 0x21, 0x07, 0xd1, 0xbc, 0xd3, 0x7c, 0xff, 0x60, 0x75, 0x9b, 0x27, 0xa9, 0xc7, 0x2c, - 0x2f, 0xe9, 0x55, 0x8d, 0xe6, 0xba, 0xed, 0xe6, 0xfe, 0x7e, 0x35, 0x85, 0xca, 0x50, 0xd8, 0xd9, - 0x6d, 0x1d, 0x72, 0xa9, 0x34, 0x7e, 0xec, 0x6b, 0x10, 0x49, 0x4e, 0xc9, 0x6d, 0x13, 0x4a, 0x6e, - 0xd3, 0x64, 0x6e, 0x4b, 0x05, 0xb9, 0x8d, 0xa5, 0xb9, 0xed, 0xe6, 0xea, 0x7e, 0xb3, 0x3a, 0xf9, - 0xa8, 0x02, 0x25, 0xee, 0xdf, 0xc3, 0x81, 0x45, 0x53, 0xed, 0xff, 0x6a, 0x00, 0xc1, 0x6e, 0x42, - 0x0d, 0xc8, 0xb5, 0x39, 0x4e, 0x4d, 0x63, 0xc1, 0x68, 0x2e, 0x76, 0xca, 0x74, 0x29, 0x85, 0x5e, - 0x87, 0x9c, 0x3b, 0x68, 0xb7, 0x89, 0x2b, 0x53, 0xde, 0x95, 0x68, 0x3c, 0x14, 0xd1, 0x4a, 0x97, - 0x72, 0xb4, 0xcb, 0x33, 0xc3, 0xec, 0x0e, 0x58, 0x02, 0xbc, 0xb8, 0x8b, 0x90, 0xc3, 0xff, 0xad, - 0x41, 0x51, 0x59, 0xbc, 0x3f, 0x30, 0x08, 0x5f, 0x87, 0x02, 0xb3, 0x81, 0x74, 0x44, 0x18, 0xce, - 0xeb, 0x41, 0x05, 0xfa, 0x2b, 0x28, 0xc8, 0x1d, 0x20, 0x23, 0x71, 0x2d, 0x5e, 0xed, 0x6e, 0x5f, - 0x0f, 0x44, 0xf1, 0x16, 0x4c, 0x33, 0xaf, 0xb4, 0xe9, 0xe1, 0x5a, 0xfa, 0x51, 0x3d, 0x7e, 0x6a, - 0x91, 0xe3, 0x67, 0x1d, 0xf2, 0xfd, 0x93, 0x73, 0xd7, 0x6c, 0x1b, 0x5d, 0x61, 0x85, 0x5f, 0xc6, - 0xef, 0x01, 0x52, 0x95, 0x8d, 0x33, 0x5c, 0x5c, 0x86, 0xe2, 0x86, 0xe1, 0x9e, 0x08, 0x93, 0xf0, - 0x03, 0x28, 0xd3, 0xe2, 0xd6, 0xd3, 0x17, 0xb0, 0x91, 0x5d, 0x0e, 0xa4, 0xf4, 0x58, 0x3e, 0x47, - 0x30, 0x79, 0x62, 0xb8, 0x27, 0x6c, 0xa0, 0x65, 0x9d, 0x7d, 0xa3, 0x97, 0xa1, 0xda, 0xe6, 0x83, - 0x3c, 0x8c, 0x5c, 0x19, 0xa6, 0x44, 0xbd, 0x7f, 0x12, 0xfc, 0x10, 0x4a, 0x7c, 0x0c, 0x3f, 0xb6, - 0x11, 0x78, 0x1a, 0xa6, 0xf6, 0x2d, 0xa3, 0xef, 0x9e, 0xd8, 0x32, 0xbb, 0xd1, 0x41, 0x57, 0x83, - 0xba, 0xb1, 0x10, 0xef, 0xc1, 0x94, 0x43, 0x7a, 0x86, 0x69, 0x99, 0xd6, 0xf1, 0xe1, 0xd1, 0xb9, - 0x47, 0x5c, 0x71, 0x61, 0xaa, 0xf8, 0xd5, 0x8f, 0x68, 0x2d, 0x35, 0xed, 0xa8, 0x6b, 0x1f, 0x89, - 0x30, 0xc7, 0xbe, 0xf1, 0xbf, 0xa5, 0xa0, 0xf4, 0x81, 0xe1, 0xb5, 0xe5, 0xd4, 0xa1, 0x4d, 0xa8, - 0xf8, 0xc1, 0x8d, 0xd5, 0x08, 0x5b, 0x22, 0x29, 0x96, 0xf5, 0x91, 0x47, 0x69, 0x99, 0x1d, 0xcb, - 0x6d, 0xb5, 0x82, 0xa9, 0x32, 0xac, 0x36, 0xe9, 0xfa, 0xaa, 0x52, 0xc9, 0xaa, 0x98, 0xa0, 0xaa, - 0x4a, 0xad, 0x40, 0xbb, 0x50, 0xed, 0x3b, 0xf6, 0xb1, 0x43, 0x5c, 0xd7, 0x57, 0xc6, 0xd3, 0x18, - 0x8e, 0x51, 0xb6, 0x27, 0x44, 0x03, 0x75, 0x53, 0xfd, 0x70, 0xd5, 0xa3, 0xa9, 0xe0, 0x3c, 0xc3, - 0x83, 0xd3, 0xef, 0x53, 0x80, 0x46, 0x07, 0xf5, 0x7d, 0x8f, 0x78, 0x77, 0xa1, 0xe2, 0x7a, 0x86, - 0x33, 0xb2, 0xd8, 0xca, 0xac, 0xd6, 0x8f, 0xf8, 0xf7, 0xc0, 0x37, 0xe8, 0xd0, 0xb2, 0x3d, 0xf3, - 0xd9, 0xb9, 0x38, 0x25, 0x57, 0x64, 0xf5, 0x0e, 0xab, 0x45, 0x4d, 0xc8, 0x3d, 0x33, 0xbb, 0x1e, - 0x71, 0xdc, 0x5a, 0x66, 0x31, 0xbd, 0x54, 0x59, 0x79, 0x70, 0xd9, 0x34, 0x2c, 0xbf, 0xcb, 0xe4, - 0x5b, 0xe7, 0x7d, 0xa2, 0xcb, 0xbe, 0xea, 0xc9, 0x33, 0x1b, 0x3a, 0x8d, 0x5f, 0x85, 0xfc, 0x73, - 0xaa, 0x82, 0xde, 0xb2, 0x73, 0xfc, 0xb0, 0xc8, 0xca, 0xfc, 0x92, 0xfd, 0xcc, 0x31, 0x8e, 0x7b, - 0xc4, 0xf2, 0xe4, 0x3d, 0x50, 0x96, 0xf1, 0x5d, 0x80, 0x00, 0x86, 0x86, 0xfc, 0x9d, 0xdd, 0xbd, - 0x83, 0x56, 0x75, 0x02, 0x95, 0x20, 0xbf, 0xb3, 0xbb, 0xde, 0xdc, 0x6e, 0xd2, 0xfc, 0x80, 0x1b, - 0xd2, 0xa5, 0xa1, 0xb9, 0x54, 0x31, 0xb5, 0x10, 0x26, 0x9e, 0x87, 0xd9, 0xb8, 0x09, 0xa4, 0x67, - 0xd1, 0xb2, 0x58, 0xa5, 0x63, 0x6d, 0x15, 0x15, 0x3a, 0x15, 0x1e, 0x6e, 0x0d, 0x72, 0x7c, 0xf5, - 0x76, 0xc4, 0xe1, 0x5c, 0x16, 0xa9, 0x23, 0xf8, 0x62, 0x24, 0x1d, 0x31, 0x4b, 0x7e, 0x39, 0x36, - 0xbc, 0x64, 0x62, 0xc3, 0x0b, 0xba, 0x0d, 0x65, 0x7f, 0x37, 0x18, 0xae, 0x38, 0x0b, 0x14, 0xf4, - 0x92, 0x5c, 0xe8, 0xb4, 0x2e, 0xe4, 0xf4, 0x5c, 0xd8, 0xe9, 0xe8, 0x2e, 0x64, 0xc9, 0x90, 0x58, - 0x9e, 0x5b, 0x2b, 0xb2, 0x8c, 0x51, 0x96, 0x67, 0xf7, 0x26, 0xad, 0xd5, 0x45, 0x23, 0x7e, 0x0b, - 0xa6, 0xd9, 0x1d, 0xe9, 0xb1, 0x63, 0x58, 0xea, 0x65, 0xae, 0xd5, 0xda, 0x16, 0xee, 0xa6, 0x9f, - 0xa8, 0x02, 0xa9, 0xcd, 0x75, 0xe1, 0x84, 0xd4, 0xe6, 0x3a, 0xfe, 0x42, 0x03, 0xa4, 0xf6, 0x1b, - 0xcb, 0xcf, 0x11, 0xe5, 0x12, 0x3e, 0x1d, 0xc0, 0xcf, 0x42, 0x86, 0x38, 0x8e, 0xed, 0x30, 0x8f, - 0x16, 0x74, 0x5e, 0xc0, 0x77, 0x84, 0x0d, 0x3a, 0x19, 0xda, 0xa7, 0xfe, 0x1e, 0xe4, 0xda, 0x34, - 0xdf, 0xd4, 0x2d, 0x98, 0x09, 0x49, 0x8d, 0x95, 0xb9, 0xee, 0xc1, 0x1c, 0x53, 0xb6, 0x45, 0x48, - 0x7f, 0xb5, 0x6b, 0x0e, 0x13, 0x51, 0xfb, 0x30, 0x1f, 0x15, 0xfc, 0x69, 0x7d, 0x84, 0xff, 0x56, - 0x20, 0xb6, 0xcc, 0x1e, 0x69, 0xd9, 0xdb, 0xc9, 0xb6, 0xd1, 0xc8, 0x7e, 0x4a, 0xce, 0x5d, 0x91, - 0xe2, 0xd9, 0x37, 0xfe, 0x3f, 0x0d, 0xae, 0x8c, 0x74, 0xff, 0x89, 0x67, 0x75, 0x01, 0xe0, 0x98, - 0x2e, 0x1f, 0xd2, 0xa1, 0x0d, 0x9c, 0x5d, 0x50, 0x6a, 0x7c, 0x3b, 0x69, 0x2c, 0x2b, 0x09, 0x3b, - 0x67, 0xc5, 0x9c, 0xb3, 0x3f, 0xfe, 0x8e, 0xbf, 0x01, 0x45, 0x56, 0xb1, 0xef, 0x19, 0xde, 0xc0, - 0x1d, 0x99, 0x8c, 0x7f, 0x16, 0x4b, 0x40, 0x76, 0x1a, 0x6b, 0x5c, 0xaf, 0x43, 0x96, 0x1d, 0xac, - 0xe5, 0xb1, 0x32, 0x72, 0x93, 0x51, 0xec, 0xd0, 0x85, 0x20, 0x3e, 0x81, 0xec, 0x13, 0xc6, 0x46, - 0x2a, 0x96, 0x4d, 0xca, 0xa9, 0xb0, 0x8c, 0x1e, 0xe7, 0x48, 0x0a, 0x3a, 0xfb, 0x66, 0xa7, 0x30, - 0x42, 0x9c, 0x03, 0x7d, 0x9b, 0x9f, 0xf6, 0x0a, 0xba, 0x5f, 0xa6, 0x2e, 0x6b, 0x77, 0x4d, 0x62, - 0x79, 0xac, 0x75, 0x92, 0xb5, 0x2a, 0x35, 0x78, 0x19, 0xaa, 0x1c, 0x69, 0xb5, 0xd3, 0x51, 0x4e, - 0x53, 0xbe, 0x3e, 0x2d, 0xac, 0x0f, 0xff, 0xbf, 0x06, 0xd3, 0x4a, 0x87, 0xb1, 0x1c, 0xf3, 0x0a, - 0x64, 0x39, 0xe7, 0x2a, 0x12, 0xf7, 0x6c, 0xb8, 0x17, 0x87, 0xd1, 0x85, 0x0c, 0x5a, 0x86, 0x1c, - 0xff, 0x92, 0x47, 0xda, 0x78, 0x71, 0x29, 0x84, 0xef, 0xc2, 0x8c, 0xa8, 0x22, 0x3d, 0x3b, 0x6e, - 0x6d, 0x33, 0x87, 0xe2, 0x7f, 0x82, 0xd9, 0xb0, 0xd8, 0x58, 0x43, 0x52, 0x8c, 0x4c, 0xbd, 0x88, - 0x91, 0xab, 0xd2, 0xc8, 0x83, 0x7e, 0x47, 0x39, 0x16, 0x44, 0x67, 0x5d, 0x9d, 0x91, 0x54, 0x64, - 0x46, 0xfc, 0x01, 0x48, 0x15, 0x3f, 0xeb, 0x00, 0x66, 0xe4, 0x72, 0xd8, 0x36, 0x5d, 0xff, 0xf4, - 0xf9, 0x19, 0x20, 0xb5, 0xf2, 0xe7, 0x36, 0x68, 0x9d, 0xc8, 0xa4, 0x26, 0x0d, 0x7a, 0x0f, 0x90, - 0x5a, 0x39, 0x56, 0x44, 0x6f, 0xc0, 0xf4, 0x13, 0x7b, 0x48, 0x43, 0x03, 0xad, 0x0d, 0xb6, 0x0c, - 0xbf, 0x8b, 0xfa, 0xd3, 0xe6, 0x97, 0x29, 0xb8, 0xda, 0x61, 0x2c, 0xf0, 0xdf, 0x6a, 0x50, 0x5a, - 0xed, 0x1a, 0x4e, 0x4f, 0x02, 0xbf, 0x0d, 0x59, 0x7e, 0xc3, 0x12, 0xa4, 0xc6, 0x4b, 0x61, 0x35, - 0xaa, 0x2c, 0x2f, 0xac, 0xf2, 0xfb, 0x98, 0xe8, 0x45, 0x0d, 0x17, 0xef, 0x1e, 0xeb, 0x91, 0x77, - 0x90, 0x75, 0xf4, 0x2a, 0x64, 0x0c, 0xda, 0x85, 0x85, 0xe0, 0x4a, 0xf4, 0x6e, 0xcb, 0xb4, 0xb1, - 0x73, 0x20, 0x97, 0xc2, 0x6f, 0x42, 0x51, 0x41, 0xa0, 0xb7, 0xf7, 0xc7, 0x4d, 0x71, 0x68, 0x5b, - 0x5d, 0x6b, 0x6d, 0x3e, 0xe5, 0x97, 0xfa, 0x0a, 0xc0, 0x7a, 0xd3, 0x2f, 0xa7, 0xf0, 0x87, 0xa2, - 0x97, 0x88, 0x77, 0xaa, 0x3d, 0x5a, 0x92, 0x3d, 0xa9, 0x17, 0xb2, 0xe7, 0x0c, 0xca, 0x62, 0xf8, - 0xe3, 0x86, 0x6f, 0xa6, 0x2f, 0x21, 0x7c, 0x2b, 0xc6, 0xeb, 0x42, 0x10, 0x4f, 0x41, 0x59, 0x04, - 0x74, 0xb1, 0xfe, 0x7e, 0x99, 0x82, 0x8a, 0xac, 0x19, 0x97, 0x7c, 0x95, 0xbc, 0x11, 0xcf, 0x00, - 0x3e, 0x6b, 0x34, 0x0f, 0xd9, 0xce, 0xd1, 0xbe, 0xf9, 0x99, 0x24, 0xca, 0x45, 0x89, 0xd6, 0x77, - 0x39, 0x0e, 0x7f, 0xad, 0x12, 0x25, 0x74, 0x9d, 0x3f, 0x64, 0x6d, 0x5a, 0x1d, 0x72, 0xc6, 0xce, - 0x94, 0x93, 0x7a, 0x50, 0xc1, 0x2e, 0xd4, 0xe2, 0x55, 0x8b, 0x1d, 0x24, 0x95, 0x57, 0x2e, 0x74, - 0x1f, 0xaa, 0xf4, 0x7b, 0xb5, 0xdf, 0xef, 0x9a, 0xa4, 0xc3, 0x15, 0xe4, 0x98, 0xcc, 0x48, 0x3d, - 0x45, 0x67, 0x47, 0x2f, 0xb7, 0x96, 0x67, 0x61, 0x4b, 0x94, 0xd0, 0x22, 0x14, 0xb9, 0x7d, 0x9b, - 0xd6, 0x81, 0x4b, 0xd8, 0x53, 0x4f, 0x5a, 0x57, 0xab, 0xe8, 0x3e, 0x5e, 0x1d, 0x78, 0x27, 0x4d, - 0xcb, 0x38, 0xea, 0xca, 0xb8, 0x48, 0x93, 0x39, 0xad, 0x5c, 0x37, 0x5d, 0xb5, 0xb6, 0x09, 0x33, - 0xb4, 0x96, 0x58, 0x9e, 0xd9, 0x56, 0x82, 0xa8, 0x4c, 0x95, 0x5a, 0x24, 0x55, 0x1a, 0xae, 0xfb, - 0xdc, 0x76, 0x3a, 0xc2, 0x81, 0x7e, 0x19, 0xaf, 0x73, 0xe5, 0x07, 0x6e, 0x28, 0x19, 0x7e, 0x5f, - 0x2d, 0x4b, 0x81, 0x96, 0xc7, 0xc4, 0xbb, 0x40, 0x0b, 0x7e, 0x00, 0x73, 0x52, 0x52, 0xd0, 0x9f, - 0x17, 0x08, 0xef, 0xc2, 0x0d, 0x29, 0xbc, 0x76, 0x42, 0xaf, 0x83, 0x7b, 0x02, 0xf0, 0x87, 0xda, - 0xf9, 0x08, 0x6a, 0xbe, 0x9d, 0xec, 0x48, 0x6e, 0x77, 0x55, 0x03, 0x06, 0xae, 0x58, 0x99, 0x05, - 0x9d, 0x7d, 0xd3, 0x3a, 0xc7, 0xee, 0xfa, 0x07, 0x0f, 0xfa, 0x8d, 0xd7, 0xe0, 0xaa, 0xd4, 0x21, - 0x0e, 0xcb, 0x61, 0x25, 0x23, 0x06, 0xc5, 0x29, 0x11, 0x0e, 0xa3, 0x5d, 0x2f, 0x76, 0xbb, 0x2a, - 0x19, 0x76, 0x2d, 0xd3, 0xa9, 0x29, 0x3a, 0xe7, 0xf8, 0x8a, 0xa0, 0x86, 0xa9, 0x79, 0x49, 0x54, - 0x53, 0x05, 0x6a, 0xb5, 0x98, 0x08, 0x5a, 0x3d, 0x32, 0x11, 0x23, 0xaa, 0x3f, 0x81, 0x05, 0xdf, - 0x08, 0xea, 0xb7, 0x3d, 0xe2, 0xf4, 0x4c, 0xd7, 0x55, 0x08, 0xb3, 0xb8, 0x81, 0xbf, 0x04, 0x93, - 0x7d, 0x22, 0x22, 0x57, 0x71, 0x05, 0x2d, 0xf3, 0x17, 0xee, 0x65, 0xa5, 0x33, 0x6b, 0xc7, 0x1d, - 0xb8, 0x29, 0xb5, 0x73, 0x8f, 0xc6, 0xaa, 0x8f, 0x1a, 0x25, 0x69, 0x84, 0x54, 0x02, 0x8d, 0x90, - 0x8e, 0x90, 0xb8, 0xef, 0x71, 0x47, 0xca, 0xbd, 0x35, 0x56, 0x46, 0xda, 0xe2, 0x3e, 0xf5, 0xb7, - 0xe4, 0x58, 0xca, 0x8e, 0x60, 0x36, 0xbc, 0x93, 0xc7, 0x0a, 0x96, 0xb3, 0x90, 0xf1, 0xec, 0x53, - 0x22, 0x43, 0x25, 0x2f, 0x48, 0x83, 0xfd, 0x6d, 0x3e, 0x96, 0xc1, 0x46, 0xa0, 0x8c, 0x2d, 0xc9, - 0x71, 0xed, 0xa5, 0xb3, 0x29, 0x8f, 0x78, 0xbc, 0x80, 0x77, 0x60, 0x3e, 0x1a, 0x26, 0xc6, 0x32, - 0xf9, 0x29, 0x5f, 0xc0, 0x71, 0x91, 0x64, 0x2c, 0xbd, 0xef, 0x07, 0xc1, 0x40, 0x09, 0x28, 0x63, - 0xa9, 0xd4, 0xa1, 0x1e, 0x17, 0x5f, 0x7e, 0x8c, 0xf5, 0xea, 0x87, 0x9b, 0xb1, 0x94, 0xb9, 0x81, - 0xb2, 0xf1, 0xa7, 0x3f, 0x88, 0x11, 0xe9, 0x0b, 0x63, 0x84, 0xd8, 0x24, 0x41, 0x14, 0xfb, 0x09, - 0x16, 0x9d, 0xc0, 0x08, 0x02, 0xe8, 0xb8, 0x18, 0x34, 0x87, 0xf8, 0x18, 0xac, 0x20, 0x17, 0xb6, - 0x1a, 0x76, 0xc7, 0x9a, 0x8c, 0x0f, 0x82, 0xd8, 0x39, 0x12, 0x99, 0xc7, 0x52, 0xfc, 0x21, 0x2c, - 0x26, 0x07, 0xe5, 0x71, 0x34, 0xdf, 0x6f, 0x40, 0xc1, 0x3f, 0xb6, 0x2a, 0xbf, 0x0e, 0x29, 0x42, - 0x6e, 0x67, 0x77, 0x7f, 0x6f, 0x75, 0xad, 0xc9, 0x7f, 0x1e, 0xb2, 0xb6, 0xab, 0xeb, 0x07, 0x7b, - 0xad, 0x6a, 0x6a, 0xe5, 0xbb, 0x34, 0xa4, 0xb6, 0x9e, 0xa2, 0x8f, 0x20, 0xc3, 0xdf, 0x4a, 0x2f, - 0x78, 0x20, 0xaf, 0x5f, 0xf4, 0x1c, 0x8c, 0xaf, 0x7c, 0xf1, 0x87, 0xef, 0xbe, 0x4e, 0x4d, 0xe3, - 0x52, 0x63, 0xf8, 0x46, 0xe3, 0x74, 0xd8, 0x60, 0xb9, 0xe1, 0xa1, 0x76, 0x1f, 0xbd, 0x0f, 0xe9, - 0xbd, 0x81, 0x87, 0x12, 0x1f, 0xce, 0xeb, 0xc9, 0x2f, 0xc4, 0x78, 0x8e, 0x29, 0x9d, 0xc2, 0x20, - 0x94, 0xf6, 0x07, 0x1e, 0x55, 0xf9, 0x29, 0x14, 0xd5, 0xf7, 0xdd, 0x4b, 0x5f, 0xd3, 0xeb, 0x97, - 0xbf, 0x1d, 0xe3, 0x1b, 0x0c, 0xea, 0x0a, 0x46, 0x02, 0x8a, 0xbf, 0x40, 0xab, 0xa3, 0x68, 0x9d, - 0x59, 0x28, 0xf1, 0xad, 0xbd, 0x9e, 0xfc, 0x9c, 0x3c, 0x32, 0x0a, 0xef, 0xcc, 0xa2, 0x2a, 0xff, - 0x41, 0xbc, 0x24, 0xb7, 0x3d, 0x74, 0x33, 0xe6, 0x25, 0x51, 0x7d, 0x33, 0xab, 0x2f, 0x26, 0x0b, - 0x08, 0x90, 0xeb, 0x0c, 0x64, 0x1e, 0x4f, 0x0b, 0x90, 0xb6, 0x2f, 0xf2, 0x50, 0xbb, 0xbf, 0xd2, - 0x86, 0x0c, 0xe3, 0xa3, 0xd1, 0xc7, 0xf2, 0xa3, 0x1e, 0x43, 0xcc, 0x27, 0x4c, 0x74, 0x88, 0xc9, - 0xc6, 0xb3, 0x0c, 0xa8, 0x82, 0x0b, 0x14, 0x88, 0xb1, 0xd1, 0x0f, 0xb5, 0xfb, 0x4b, 0xda, 0x6b, - 0xda, 0xca, 0x2f, 0x32, 0x90, 0x61, 0xe4, 0x13, 0x3a, 0x05, 0x08, 0xb8, 0xd9, 0xe8, 0xe8, 0x46, - 0xd8, 0xde, 0xe8, 0xe8, 0x46, 0x69, 0x5d, 0x5c, 0x67, 0xa0, 0xb3, 0x78, 0x8a, 0x82, 0x32, 0x4e, - 0xab, 0xc1, 0x68, 0x3a, 0xea, 0xc7, 0x7f, 0xd7, 0x04, 0xf7, 0xc6, 0xf7, 0x12, 0x8a, 0xd3, 0x16, - 0x22, 0x68, 0xa3, 0xcb, 0x21, 0x86, 0x9c, 0xc5, 0x6f, 0x31, 0xc0, 0x06, 0xae, 0x06, 0x80, 0x0e, - 0x93, 0x78, 0xa8, 0xdd, 0xff, 0xb8, 0x86, 0x67, 0x84, 0x97, 0x23, 0x2d, 0xe8, 0x73, 0xa8, 0x84, - 0x49, 0x57, 0x74, 0x3b, 0x06, 0x2b, 0xca, 0xdd, 0xd6, 0xef, 0x5c, 0x2c, 0x24, 0x6c, 0x5a, 0x60, - 0x36, 0x09, 0x70, 0x8e, 0x7c, 0x4a, 0x48, 0xdf, 0xa0, 0x42, 0x62, 0x0e, 0xd0, 0xff, 0x68, 0x30, - 0x15, 0x61, 0x51, 0x51, 0x9c, 0xf6, 0x11, 0x8e, 0xb6, 0x7e, 0xf7, 0x12, 0x29, 0x61, 0xc4, 0xdf, - 0x31, 0x23, 0xfe, 0x1a, 0xcf, 0x06, 0x46, 0x78, 0x66, 0x8f, 0x78, 0xb6, 0xb0, 0xe2, 0xe3, 0xeb, - 0xf8, 0x4a, 0xc8, 0x39, 0xa1, 0xd6, 0x60, 0xb2, 0x38, 0x13, 0x1a, 0x3b, 0x59, 0x21, 0x66, 0x35, - 0x76, 0xb2, 0xc2, 0x34, 0x6a, 0xdc, 0x64, 0x71, 0xde, 0x33, 0x6e, 0xb2, 0xfc, 0x96, 0x15, 0xf6, - 0x5b, 0x0e, 0xfe, 0x0b, 0x4e, 0x64, 0x43, 0xc1, 0x67, 0x21, 0xd1, 0x42, 0x1c, 0x23, 0x14, 0xdc, - 0x25, 0xea, 0x37, 0x13, 0xdb, 0x85, 0x41, 0xb7, 0x98, 0x41, 0xd7, 0xf0, 0x3c, 0x45, 0x16, 0x3f, - 0x12, 0x6d, 0x70, 0xda, 0xa1, 0x61, 0x74, 0x3a, 0xd4, 0x11, 0xff, 0x08, 0x25, 0x95, 0x26, 0x44, - 0xb7, 0x62, 0x59, 0x28, 0x95, 0x69, 0xac, 0xe3, 0x8b, 0x44, 0x04, 0xf2, 0x1d, 0x86, 0xbc, 0x80, - 0xaf, 0xc6, 0x20, 0x3b, 0x4c, 0x34, 0x04, 0xce, 0x29, 0xbe, 0x78, 0xf0, 0x10, 0x83, 0x18, 0x0f, - 0x1e, 0x66, 0x08, 0x2f, 0x04, 0x1f, 0x30, 0x51, 0x0a, 0xee, 0x02, 0x04, 0x64, 0x1e, 0x8a, 0xf5, - 0xa5, 0x72, 0x99, 0x8a, 0x06, 0x87, 0x51, 0x1e, 0x10, 0x63, 0x06, 0x2b, 0xd6, 0x5d, 0x04, 0xb6, - 0x6b, 0xba, 0x34, 0x48, 0xac, 0xfc, 0x47, 0x16, 0x8a, 0x4f, 0x0c, 0xd3, 0xf2, 0x88, 0x65, 0x58, - 0x6d, 0x82, 0x8e, 0x20, 0xc3, 0x12, 0x65, 0x34, 0x0e, 0xaa, 0xfc, 0x56, 0x34, 0x0e, 0x86, 0xc8, - 0x1f, 0xbc, 0xc8, 0x50, 0xeb, 0x78, 0x8e, 0xa2, 0xf6, 0x02, 0xd5, 0x0d, 0xc6, 0xd9, 0xd0, 0x81, - 0x3e, 0x83, 0xac, 0x78, 0x0e, 0x88, 0x28, 0x0a, 0x71, 0x39, 0xf5, 0xeb, 0xf1, 0x8d, 0x71, 0x4b, - 0x49, 0x85, 0x71, 0x99, 0x1c, 0xc5, 0x19, 0x02, 0x04, 0x64, 0x64, 0xd4, 0xa1, 0x23, 0xdc, 0x65, - 0x7d, 0x31, 0x59, 0x40, 0x60, 0xde, 0x65, 0x98, 0x37, 0x71, 0x3d, 0x8a, 0xd9, 0xf1, 0x65, 0x29, - 0xee, 0xdf, 0xc3, 0xe4, 0x86, 0xe1, 0x9e, 0xa0, 0x48, 0xea, 0x53, 0x7e, 0x58, 0x51, 0xaf, 0xc7, - 0x35, 0x09, 0x94, 0x9b, 0x0c, 0xe5, 0x2a, 0x8f, 0x24, 0x2a, 0xca, 0x89, 0xe1, 0xd2, 0x9c, 0x82, - 0x3a, 0x90, 0xe5, 0xbf, 0xb3, 0x88, 0xfa, 0x2f, 0xf4, 0x5b, 0x8d, 0xa8, 0xff, 0xc2, 0x3f, 0xcd, - 0xb8, 0x1c, 0xa5, 0x0f, 0x79, 0xf9, 0xc3, 0x06, 0x74, 0x23, 0x32, 0x15, 0xe1, 0x1f, 0x41, 0xd4, - 0x17, 0x92, 0x9a, 0x05, 0xd6, 0x6d, 0x86, 0x75, 0x03, 0xd7, 0x46, 0xe6, 0x4a, 0x48, 0x3e, 0xd4, - 0xee, 0xbf, 0xa6, 0xa1, 0xcf, 0x01, 0x02, 0xfe, 0x76, 0x64, 0x03, 0x44, 0xa9, 0xe0, 0x91, 0x0d, - 0x30, 0x42, 0xfd, 0xe2, 0x65, 0x86, 0xbb, 0x84, 0x6f, 0x47, 0x71, 0x3d, 0xc7, 0xb0, 0xdc, 0x67, - 0xc4, 0x79, 0x95, 0x73, 0x74, 0xee, 0x89, 0xd9, 0xa7, 0x9b, 0xe1, 0xd7, 0x53, 0x30, 0x49, 0x0f, - 0xa0, 0x34, 0x4f, 0x07, 0xf7, 0xf6, 0xa8, 0x25, 0x23, 0x6c, 0x59, 0xd4, 0x92, 0xd1, 0x2b, 0x7f, - 0x38, 0x4f, 0xb3, 0x9f, 0xde, 0x13, 0x26, 0x40, 0x1d, 0x6d, 0x43, 0x51, 0xb9, 0xd8, 0xa3, 0x18, - 0x65, 0x61, 0x1a, 0x2e, 0x1a, 0xf9, 0x63, 0x58, 0x01, 0x7c, 0x8d, 0xe1, 0xcd, 0xf1, 0xc8, 0xcf, - 0xf0, 0x3a, 0x5c, 0x82, 0x02, 0x3e, 0x87, 0x92, 0x7a, 0xf9, 0x47, 0x31, 0xfa, 0x22, 0x14, 0x5f, - 0x34, 0xca, 0xc5, 0x71, 0x07, 0xe1, 0x8d, 0xef, 0xff, 0xf7, 0x02, 0x29, 0x46, 0x81, 0xbb, 0x90, - 0x13, 0x6c, 0x40, 0xdc, 0x28, 0xc3, 0x7c, 0x60, 0xdc, 0x28, 0x23, 0x54, 0x42, 0xf8, 0x6c, 0xc7, - 0x10, 0xe9, 0x85, 0x47, 0x66, 0x12, 0x81, 0xf6, 0x98, 0x78, 0x49, 0x68, 0x01, 0xb9, 0x95, 0x84, - 0xa6, 0x5c, 0x36, 0x93, 0xd0, 0x8e, 0x89, 0x27, 0xb6, 0x8b, 0xbc, 0xc4, 0xa1, 0x04, 0x65, 0x6a, - 0xf4, 0xc6, 0x17, 0x89, 0xc4, 0x1d, 0xbd, 0x03, 0x40, 0x11, 0xba, 0xd1, 0x19, 0x40, 0xc0, 0x55, - 0x44, 0xcf, 0x53, 0xb1, 0x84, 0x67, 0xf4, 0x3c, 0x15, 0x4f, 0x77, 0x84, 0x43, 0x43, 0x80, 0xcb, - 0x4f, 0xfe, 0x14, 0xf9, 0x2b, 0x0d, 0xd0, 0x28, 0xad, 0x81, 0x1e, 0xc4, 0x6b, 0x8f, 0xa5, 0x51, - 0xeb, 0xaf, 0xbc, 0x98, 0x70, 0x5c, 0xb4, 0x0f, 0x4c, 0x6a, 0x33, 0xe9, 0xfe, 0x73, 0x6a, 0xd4, - 0xbf, 0x68, 0x50, 0x0e, 0x71, 0x22, 0xe8, 0xa5, 0x84, 0x39, 0x8d, 0xb0, 0xb0, 0xf5, 0x7b, 0x97, - 0xca, 0xc5, 0x1d, 0x34, 0x95, 0x15, 0x20, 0x4f, 0xdc, 0x5f, 0x6a, 0x50, 0x09, 0x73, 0x28, 0x28, - 0x41, 0xf7, 0x08, 0x8b, 0x5b, 0x5f, 0xba, 0x5c, 0xf0, 0xe2, 0xe9, 0x09, 0x0e, 0xdb, 0x5d, 0xc8, - 0x09, 0xd6, 0x25, 0x6e, 0xe1, 0x87, 0xf9, 0xdf, 0xb8, 0x85, 0x1f, 0xa1, 0x6c, 0x62, 0x16, 0xbe, - 0x63, 0x77, 0x89, 0xb2, 0xcd, 0x04, 0x2d, 0x93, 0x84, 0x76, 0xf1, 0x36, 0x8b, 0x70, 0x3a, 0x49, - 0x68, 0xc1, 0x36, 0x93, 0x7c, 0x0c, 0x4a, 0x50, 0x76, 0xc9, 0x36, 0x8b, 0xd2, 0x39, 0x31, 0xdb, - 0x8c, 0x01, 0x2a, 0xdb, 0x2c, 0x60, 0x4e, 0xe2, 0xb6, 0xd9, 0x08, 0x9d, 0x1d, 0xb7, 0xcd, 0x46, - 0xc9, 0x97, 0x98, 0x79, 0x64, 0xb8, 0xa1, 0x6d, 0x36, 0x13, 0x43, 0xb2, 0xa0, 0x57, 0x12, 0x9c, - 0x18, 0xcb, 0x92, 0xd7, 0x5f, 0x7d, 0x41, 0xe9, 0xc4, 0x35, 0xce, 0xdd, 0x2f, 0xd7, 0xf8, 0x7f, - 0x6a, 0x30, 0x1b, 0x47, 0xd0, 0xa0, 0x04, 0x9c, 0x04, 0x76, 0xbd, 0xbe, 0xfc, 0xa2, 0xe2, 0x17, - 0x7b, 0xcb, 0x5f, 0xf5, 0x8f, 0xaa, 0xbf, 0xf9, 0x76, 0x41, 0xfb, 0xdd, 0xb7, 0x0b, 0xda, 0x1f, - 0xbf, 0x5d, 0xd0, 0xfe, 0xeb, 0x4f, 0x0b, 0x13, 0x47, 0x59, 0xf6, 0x9f, 0xd6, 0xde, 0xf8, 0x4b, - 0x00, 0x00, 0x00, 0xff, 0xff, 0x40, 0x16, 0xfd, 0x84, 0x3b, 0x37, 0x00, 0x00, + // 3836 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x5b, 0xdd, 0x6f, 0x23, 0xc9, + 0x71, 0xd7, 0x90, 0xe2, 0x57, 0xf1, 0x43, 0x54, 0xeb, 0x63, 0x29, 0xee, 0xae, 0x56, 0xd7, 0xbb, + 0x7b, 0xab, 0xdb, 0xbd, 0x13, 0x6d, 0xd9, 0x4e, 0x80, 0x4d, 0xe2, 0x58, 0x2b, 0xf1, 0x56, 0x3a, + 0x69, 0x45, 0xdd, 0x88, 0xda, 0xfb, 0x80, 0x11, 0x61, 0x44, 0xf6, 0x4a, 0x13, 0x91, 0x33, 0xf4, + 0xcc, 0x90, 0x2b, 0x5d, 0x82, 0x38, 0x30, 0x9c, 0x00, 0xc9, 0xa3, 0x0d, 0x04, 0xc9, 0x43, 0x9e, + 0x82, 0x20, 0xf0, 0x43, 0x80, 0xbc, 0x05, 0xc8, 0x5f, 0x90, 0xb7, 0x24, 0xc8, 0x3f, 0x10, 0x5c, + 0xfc, 0x92, 0xff, 0x22, 0xe8, 0xaf, 0x99, 0x9e, 0x2f, 0x69, 0x6d, 0xfa, 0xfc, 0x22, 0x4d, 0x57, + 0x57, 0x57, 0x55, 0x57, 0x77, 0x57, 0x55, 0xff, 0x66, 0x08, 0x25, 0x67, 0xd4, 0xdb, 0x18, 0x39, + 0xb6, 0x67, 0xa3, 0x0a, 0xf1, 0x7a, 0x7d, 0x97, 0x38, 0x13, 0xe2, 0x8c, 0xce, 0x9a, 0x8b, 0xe7, + 0xf6, 0xb9, 0xcd, 0x3a, 0x5a, 0xf4, 0x89, 0xf3, 0x34, 0x57, 0x28, 0x4f, 0x6b, 0x38, 0xe9, 0xf5, + 0xd8, 0x9f, 0xd1, 0x59, 0xeb, 0x72, 0x22, 0xba, 0xee, 0xb2, 0x2e, 0x63, 0xec, 0x5d, 0xb0, 0x3f, + 0xa3, 0x33, 0xf6, 0x4f, 0x74, 0xde, 0x3b, 0xb7, 0xed, 0xf3, 0x01, 0x69, 0x19, 0x23, 0xb3, 0x65, + 0x58, 0x96, 0xed, 0x19, 0x9e, 0x69, 0x5b, 0x2e, 0xef, 0xc5, 0x7f, 0xa1, 0x41, 0x4d, 0x27, 0xee, + 0xc8, 0xb6, 0x5c, 0xb2, 0x4b, 0x8c, 0x3e, 0x71, 0xd0, 0x7d, 0x80, 0xde, 0x60, 0xec, 0x7a, 0xc4, + 0x39, 0x35, 0xfb, 0x0d, 0x6d, 0x4d, 0x5b, 0x9f, 0xd5, 0x4b, 0x82, 0xb2, 0xd7, 0x47, 0x77, 0xa1, + 0x34, 0x24, 0xc3, 0x33, 0xde, 0x9b, 0x61, 0xbd, 0x45, 0x4e, 0xd8, 0xeb, 0xa3, 0x26, 0x14, 0x1d, + 0x32, 0x31, 0x5d, 0xd3, 0xb6, 0x1a, 0xd9, 0x35, 0x6d, 0x3d, 0xab, 0xfb, 0x6d, 0x3a, 0xd0, 0x31, + 0xde, 0x78, 0xa7, 0x1e, 0x71, 0x86, 0x8d, 0x59, 0x3e, 0x90, 0x12, 0xba, 0xc4, 0x19, 0xe2, 0x9f, + 0xe6, 0xa0, 0xa2, 0x1b, 0xd6, 0x39, 0xd1, 0xc9, 0x8f, 0xc6, 0xc4, 0xf5, 0x50, 0x1d, 0xb2, 0x97, + 0xe4, 0x9a, 0xa9, 0xaf, 0xe8, 0xf4, 0x91, 0x8f, 0xb7, 0xce, 0xc9, 0x29, 0xb1, 0xb8, 0xe2, 0x0a, + 0x1d, 0x6f, 0x9d, 0x93, 0xb6, 0xd5, 0x47, 0x8b, 0x90, 0x1b, 0x98, 0x43, 0xd3, 0x13, 0x5a, 0x79, + 0x23, 0x64, 0xce, 0x6c, 0xc4, 0x9c, 0x6d, 0x00, 0xd7, 0x76, 0xbc, 0x53, 0xdb, 0xe9, 0x13, 0xa7, + 0x91, 0x5b, 0xd3, 0xd6, 0x6b, 0x9b, 0x8f, 0x36, 0xd4, 0x85, 0xd8, 0x50, 0x0d, 0xda, 0x38, 0xb6, + 0x1d, 0xaf, 0x43, 0x79, 0xf5, 0x92, 0x2b, 0x1f, 0xd1, 0xc7, 0x50, 0x66, 0x42, 0x3c, 0xc3, 0x39, + 0x27, 0x5e, 0x23, 0xcf, 0xa4, 0x3c, 0xbe, 0x45, 0x4a, 0x97, 0x31, 0xeb, 0x4c, 0x3d, 0x7f, 0x46, + 0x18, 0x2a, 0x2e, 0x71, 0x4c, 0x63, 0x60, 0x7e, 0x65, 0x9c, 0x0d, 0x48, 0xa3, 0xb0, 0xa6, 0xad, + 0x17, 0xf5, 0x10, 0x8d, 0xce, 0xff, 0x92, 0x5c, 0xbb, 0xa7, 0xb6, 0x35, 0xb8, 0x6e, 0x14, 0x19, + 0x43, 0x91, 0x12, 0x3a, 0xd6, 0xe0, 0x9a, 0x2d, 0x9a, 0x3d, 0xb6, 0x3c, 0xde, 0x5b, 0x62, 0xbd, + 0x25, 0x46, 0x61, 0xdd, 0xeb, 0x50, 0x1f, 0x9a, 0xd6, 0xe9, 0xd0, 0xee, 0x9f, 0xfa, 0x0e, 0x01, + 0xe6, 0x90, 0xda, 0xd0, 0xb4, 0x5e, 0xd9, 0x7d, 0x5d, 0xba, 0x85, 0x72, 0x1a, 0x57, 0x61, 0xce, + 0xb2, 0xe0, 0x34, 0xae, 0x54, 0xce, 0x0d, 0x58, 0xa0, 0x32, 0x7b, 0x0e, 0x31, 0x3c, 0x12, 0x30, + 0x57, 0x18, 0xf3, 0xfc, 0xd0, 0xb4, 0xb6, 0x59, 0x4f, 0x88, 0xdf, 0xb8, 0x8a, 0xf1, 0x57, 0x05, + 0xbf, 0x71, 0x15, 0xe6, 0xc7, 0x1b, 0x50, 0xf2, 0x7d, 0x8e, 0x8a, 0x30, 0x7b, 0xd8, 0x39, 0x6c, + 0xd7, 0x67, 0x10, 0x40, 0x7e, 0xeb, 0x78, 0xbb, 0x7d, 0xb8, 0x53, 0xd7, 0x50, 0x19, 0x0a, 0x3b, + 0x6d, 0xde, 0xc8, 0xe0, 0x17, 0x00, 0x81, 0x77, 0x51, 0x01, 0xb2, 0xfb, 0xed, 0x2f, 0xea, 0x33, + 0x94, 0xe7, 0x75, 0x5b, 0x3f, 0xde, 0xeb, 0x1c, 0xd6, 0x35, 0x3a, 0x78, 0x5b, 0x6f, 0x6f, 0x75, + 0xdb, 0xf5, 0x0c, 0xe5, 0x78, 0xd5, 0xd9, 0xa9, 0x67, 0x51, 0x09, 0x72, 0xaf, 0xb7, 0x0e, 0x4e, + 0xda, 0xf5, 0x59, 0xfc, 0x73, 0x0d, 0xaa, 0x62, 0xbd, 0xf8, 0x99, 0x40, 0xdf, 0x85, 0xfc, 0x05, + 0x3b, 0x17, 0x6c, 0x2b, 0x96, 0x37, 0xef, 0x45, 0x16, 0x37, 0x74, 0x76, 0x74, 0xc1, 0x8b, 0x30, + 0x64, 0x2f, 0x27, 0x6e, 0x23, 0xb3, 0x96, 0x5d, 0x2f, 0x6f, 0xd6, 0x37, 0xf8, 0x81, 0xdd, 0xd8, + 0x27, 0xd7, 0xaf, 0x8d, 0xc1, 0x98, 0xe8, 0xb4, 0x13, 0x21, 0x98, 0x1d, 0xda, 0x0e, 0x61, 0x3b, + 0xb6, 0xa8, 0xb3, 0x67, 0xba, 0x8d, 0xd9, 0xa2, 0x89, 0xdd, 0xca, 0x1b, 0xf8, 0x17, 0x1a, 0xc0, + 0xd1, 0xd8, 0x4b, 0x3f, 0x1a, 0x8b, 0x90, 0x9b, 0x50, 0xc1, 0xe2, 0x58, 0xf0, 0x06, 0x3b, 0x13, + 0xc4, 0x70, 0x89, 0x7f, 0x26, 0x68, 0x03, 0xdd, 0x81, 0xc2, 0xc8, 0x21, 0x93, 0xd3, 0xcb, 0x09, + 0x53, 0x52, 0xd4, 0xf3, 0xb4, 0xb9, 0x3f, 0x41, 0xef, 0x41, 0xc5, 0x3c, 0xb7, 0x6c, 0x87, 0x9c, + 0x72, 0x59, 0x39, 0xd6, 0x5b, 0xe6, 0x34, 0x66, 0xb7, 0xc2, 0xc2, 0x05, 0xe7, 0x55, 0x96, 0x03, + 0x4a, 0xc2, 0x16, 0x94, 0x99, 0xa9, 0x53, 0xb9, 0xef, 0x83, 0xc0, 0xc6, 0x0c, 0x1b, 0x16, 0x77, + 0xa1, 0xb0, 0x1a, 0xff, 0x10, 0xd0, 0x0e, 0x19, 0x10, 0x8f, 0x4c, 0x13, 0x3d, 0x14, 0x9f, 0x64, + 0x55, 0x9f, 0xe0, 0x9f, 0x69, 0xb0, 0x10, 0x12, 0x3f, 0xd5, 0xb4, 0x1a, 0x50, 0xe8, 0x33, 0x61, + 0xdc, 0x82, 0xac, 0x2e, 0x9b, 0xe8, 0x19, 0x14, 0x85, 0x01, 0x6e, 0x23, 0x9b, 0xb2, 0x69, 0x0a, + 0xdc, 0x26, 0x17, 0xff, 0x22, 0x03, 0x25, 0x31, 0xd1, 0xce, 0x08, 0x6d, 0x41, 0xd5, 0xe1, 0x8d, + 0x53, 0x36, 0x1f, 0x61, 0x51, 0x33, 0x3d, 0x08, 0xed, 0xce, 0xe8, 0x15, 0x31, 0x84, 0x91, 0xd1, + 0xef, 0x41, 0x59, 0x8a, 0x18, 0x8d, 0x3d, 0xe1, 0xf2, 0x46, 0x58, 0x40, 0xb0, 0xff, 0x76, 0x67, + 0x74, 0x10, 0xec, 0x47, 0x63, 0x0f, 0x75, 0x61, 0x51, 0x0e, 0xe6, 0xb3, 0x11, 0x66, 0x64, 0x99, + 0x94, 0xb5, 0xb0, 0x94, 0xf8, 0x52, 0xed, 0xce, 0xe8, 0x48, 0x8c, 0x57, 0x3a, 0x55, 0x93, 0xbc, + 0x2b, 0x1e, 0xbc, 0x63, 0x26, 0x75, 0xaf, 0xac, 0xb8, 0x49, 0xdd, 0x2b, 0xeb, 0x45, 0x09, 0x0a, + 0xa2, 0x85, 0xff, 0x35, 0x03, 0x20, 0x57, 0xa3, 0x33, 0x42, 0x3b, 0x50, 0x73, 0x44, 0x2b, 0xe4, + 0xad, 0xbb, 0x89, 0xde, 0x12, 0x8b, 0x38, 0xa3, 0x57, 0xe5, 0x20, 0x6e, 0xdc, 0xf7, 0xa1, 0xe2, + 0x4b, 0x09, 0x1c, 0xb6, 0x92, 0xe0, 0x30, 0x5f, 0x42, 0x59, 0x0e, 0xa0, 0x2e, 0xfb, 0x0c, 0x96, + 0xfc, 0xf1, 0x09, 0x3e, 0x7b, 0xef, 0x06, 0x9f, 0xf9, 0x02, 0x17, 0xa4, 0x04, 0xd5, 0x6b, 0xaa, + 0x61, 0x81, 0xdb, 0x56, 0x12, 0xdc, 0x16, 0x37, 0x8c, 0x3a, 0x0e, 0x68, 0xbe, 0xe4, 0x4d, 0xfc, + 0x7f, 0x59, 0x28, 0x6c, 0xdb, 0xc3, 0x91, 0xe1, 0xd0, 0xd5, 0xc8, 0x3b, 0xc4, 0x1d, 0x0f, 0x3c, + 0xe6, 0xae, 0xda, 0xe6, 0xc3, 0xb0, 0x44, 0xc1, 0x26, 0xff, 0xeb, 0x8c, 0x55, 0x17, 0x43, 0xe8, + 0x60, 0x91, 0x1e, 0x33, 0xef, 0x30, 0x58, 0x24, 0x47, 0x31, 0x44, 0x1e, 0xe4, 0x6c, 0x70, 0x90, + 0x9b, 0x50, 0x98, 0x10, 0x27, 0x48, 0xe9, 0xbb, 0x33, 0xba, 0x24, 0xa0, 0x0f, 0x60, 0x2e, 0x9a, + 0x5e, 0x72, 0x82, 0xa7, 0xd6, 0x0b, 0x67, 0xa3, 0x87, 0x50, 0x09, 0xe5, 0xb8, 0xbc, 0xe0, 0x2b, + 0x0f, 0x95, 0x14, 0xb7, 0x2c, 0xe3, 0x2a, 0xcd, 0xc7, 0x95, 0xdd, 0x19, 0x19, 0x59, 0x97, 0x65, + 0x64, 0x2d, 0x8a, 0x51, 0x22, 0xb6, 0x86, 0x82, 0xcc, 0x0f, 0xc2, 0x41, 0x06, 0xff, 0x00, 0xaa, + 0x21, 0x07, 0xd1, 0xbc, 0xd3, 0xfe, 0xf4, 0x64, 0xeb, 0x80, 0x27, 0xa9, 0x97, 0x2c, 0x2f, 0xe9, + 0x75, 0x8d, 0xe6, 0xba, 0x83, 0xf6, 0xf1, 0x71, 0x3d, 0x83, 0xaa, 0x50, 0x3a, 0xec, 0x74, 0x4f, + 0x39, 0x57, 0x16, 0xbf, 0xf4, 0x25, 0x88, 0x24, 0xa7, 0xe4, 0xb6, 0x19, 0x25, 0xb7, 0x69, 0x32, + 0xb7, 0x65, 0x82, 0xdc, 0xc6, 0xd2, 0xdc, 0x41, 0x7b, 0xeb, 0xb8, 0x5d, 0x9f, 0x7d, 0x51, 0x83, + 0x0a, 0xf7, 0xef, 0xe9, 0xd8, 0xa2, 0xa9, 0xf6, 0x1f, 0x34, 0x80, 0xe0, 0x34, 0xa1, 0x16, 0x14, + 0x7a, 0x5c, 0x4f, 0x43, 0x63, 0xc1, 0x68, 0x29, 0x71, 0xc9, 0x74, 0xc9, 0x85, 0xbe, 0x0d, 0x05, + 0x77, 0xdc, 0xeb, 0x11, 0x57, 0xa6, 0xbc, 0x3b, 0xd1, 0x78, 0x28, 0xa2, 0x95, 0x2e, 0xf9, 0xe8, + 0x90, 0x37, 0x86, 0x39, 0x18, 0xb3, 0x04, 0x78, 0xf3, 0x10, 0xc1, 0x87, 0xff, 0x4e, 0x83, 0xb2, + 0xb2, 0x79, 0x7f, 0xcd, 0x20, 0x7c, 0x0f, 0x4a, 0xcc, 0x06, 0xd2, 0x17, 0x61, 0xb8, 0xa8, 0x07, + 0x04, 0xf4, 0x3b, 0x50, 0x92, 0x27, 0x40, 0x46, 0xe2, 0x46, 0xb2, 0xd8, 0xce, 0x48, 0x0f, 0x58, + 0xf1, 0x3e, 0xcc, 0x33, 0xaf, 0xf4, 0x68, 0x71, 0x2d, 0xfd, 0xa8, 0x96, 0x9f, 0x5a, 0xa4, 0xfc, + 0x6c, 0x42, 0x71, 0x74, 0x71, 0xed, 0x9a, 0x3d, 0x63, 0x20, 0xac, 0xf0, 0xdb, 0xf8, 0x13, 0x40, + 0xaa, 0xb0, 0x69, 0xa6, 0x8b, 0xab, 0x50, 0xde, 0x35, 0xdc, 0x0b, 0x61, 0x12, 0x7e, 0x06, 0x55, + 0xda, 0xdc, 0x7f, 0xfd, 0x0e, 0x36, 0xb2, 0xcb, 0x81, 0xe4, 0x9e, 0xca, 0xe7, 0x08, 0x66, 0x2f, + 0x0c, 0xf7, 0x82, 0x4d, 0xb4, 0xaa, 0xb3, 0x67, 0xf4, 0x01, 0xd4, 0x7b, 0x7c, 0x92, 0xa7, 0x91, + 0x2b, 0xc3, 0x9c, 0xa0, 0xfb, 0x95, 0xe0, 0xe7, 0x50, 0xe1, 0x73, 0xf8, 0x4d, 0x1b, 0x81, 0xe7, + 0x61, 0xee, 0xd8, 0x32, 0x46, 0xee, 0x85, 0x2d, 0xb3, 0x1b, 0x9d, 0x74, 0x3d, 0xa0, 0x4d, 0xa5, + 0xf1, 0x09, 0xcc, 0x39, 0x64, 0x68, 0x98, 0x96, 0x69, 0x9d, 0x9f, 0x9e, 0x5d, 0x7b, 0xc4, 0x15, + 0x17, 0xa6, 0x9a, 0x4f, 0x7e, 0x41, 0xa9, 0xd4, 0xb4, 0xb3, 0x81, 0x7d, 0x26, 0xc2, 0x1c, 0x7b, + 0xc6, 0x7f, 0x99, 0x81, 0xca, 0x67, 0x86, 0xd7, 0x93, 0x4b, 0x87, 0xf6, 0xa0, 0xe6, 0x07, 0x37, + 0x46, 0x11, 0xb6, 0x44, 0x52, 0x2c, 0x1b, 0x23, 0x4b, 0x69, 0x99, 0x1d, 0xab, 0x3d, 0x95, 0xc0, + 0x44, 0x19, 0x56, 0x8f, 0x0c, 0x7c, 0x51, 0x99, 0x74, 0x51, 0x8c, 0x51, 0x15, 0xa5, 0x12, 0x50, + 0x07, 0xea, 0x23, 0xc7, 0x3e, 0x77, 0x88, 0xeb, 0xfa, 0xc2, 0x78, 0x1a, 0xc3, 0x09, 0xc2, 0x8e, + 0x04, 0x6b, 0x20, 0x6e, 0x6e, 0x14, 0x26, 0xbd, 0x98, 0x0b, 0xea, 0x19, 0x1e, 0x9c, 0xfe, 0x2b, + 0x03, 0x28, 0x3e, 0xa9, 0x5f, 0xb5, 0xc4, 0x7b, 0x0c, 0x35, 0xd7, 0x33, 0x9c, 0xd8, 0x66, 0xab, + 0x32, 0xaa, 0x1f, 0xf1, 0x9f, 0x80, 0x6f, 0xd0, 0xa9, 0x65, 0x7b, 0xe6, 0x9b, 0x6b, 0x51, 0x25, + 0xd7, 0x24, 0xf9, 0x90, 0x51, 0x51, 0x1b, 0x0a, 0x6f, 0xcc, 0x81, 0x47, 0x1c, 0xb7, 0x91, 0x5b, + 0xcb, 0xae, 0xd7, 0x36, 0x9f, 0xdd, 0xb6, 0x0c, 0x1b, 0x1f, 0x33, 0xfe, 0xee, 0xf5, 0x88, 0xe8, + 0x72, 0xac, 0x5a, 0x79, 0xe6, 0x43, 0xd5, 0xf8, 0x0a, 0x14, 0xdf, 0x52, 0x11, 0xf4, 0x96, 0x5d, + 0xe0, 0xc5, 0x22, 0x6b, 0xf3, 0x4b, 0xf6, 0x1b, 0xc7, 0x38, 0x1f, 0x12, 0xcb, 0x93, 0xf7, 0x40, + 0xd9, 0xc6, 0x8f, 0x01, 0x02, 0x35, 0x34, 0xe4, 0x1f, 0x76, 0x8e, 0x4e, 0xba, 0xf5, 0x19, 0x54, + 0x81, 0xe2, 0x61, 0x67, 0xa7, 0x7d, 0xd0, 0xa6, 0xf9, 0x01, 0xb7, 0xa4, 0x4b, 0x43, 0x6b, 0xa9, + 0xea, 0xd4, 0x42, 0x3a, 0xf1, 0x32, 0x2c, 0x26, 0x2d, 0x20, 0xad, 0x45, 0xab, 0x62, 0x97, 0x4e, + 0x75, 0x54, 0x54, 0xd5, 0x99, 0xf0, 0x74, 0x1b, 0x50, 0xe0, 0xbb, 0xb7, 0x2f, 0x8a, 0x73, 0xd9, + 0xa4, 0x8e, 0xe0, 0x9b, 0x91, 0xf4, 0xc5, 0x2a, 0xf9, 0xed, 0xc4, 0xf0, 0x92, 0x4b, 0x0c, 0x2f, + 0xe8, 0x21, 0x54, 0xfd, 0xd3, 0x60, 0xb8, 0xa2, 0x16, 0x28, 0xe9, 0x15, 0xb9, 0xd1, 0x29, 0x2d, + 0xe4, 0xf4, 0x42, 0xd8, 0xe9, 0xe8, 0x31, 0xe4, 0xc9, 0x84, 0x58, 0x9e, 0xdb, 0x28, 0xb3, 0x8c, + 0x51, 0x95, 0xb5, 0x7b, 0x9b, 0x52, 0x75, 0xd1, 0x89, 0xbf, 0x07, 0xf3, 0xec, 0x8e, 0xf4, 0xd2, + 0x31, 0x2c, 0xf5, 0x32, 0xd7, 0xed, 0x1e, 0x08, 0x77, 0xd3, 0x47, 0x54, 0x83, 0xcc, 0xde, 0x8e, + 0x70, 0x42, 0x66, 0x6f, 0x07, 0xff, 0x44, 0x03, 0xa4, 0x8e, 0x9b, 0xca, 0xcf, 0x11, 0xe1, 0x52, + 0x7d, 0x36, 0x50, 0xbf, 0x08, 0x39, 0xe2, 0x38, 0xb6, 0xc3, 0x3c, 0x5a, 0xd2, 0x79, 0x03, 0x3f, + 0x12, 0x36, 0xe8, 0x64, 0x62, 0x5f, 0xfa, 0x67, 0x90, 0x4b, 0xd3, 0x7c, 0x53, 0xf7, 0x61, 0x21, + 0xc4, 0x35, 0x55, 0xe6, 0xfa, 0x18, 0xe6, 0x98, 0xb0, 0xed, 0x0b, 0xd2, 0xbb, 0x1c, 0xd9, 0xa6, + 0x15, 0xd3, 0x47, 0x57, 0x2e, 0x08, 0xb0, 0x74, 0x1e, 0x7c, 0x62, 0x15, 0x9f, 0xd8, 0xed, 0x1e, + 0xe0, 0x2f, 0x60, 0x39, 0x22, 0x47, 0x9a, 0xff, 0x87, 0x50, 0xee, 0xf9, 0x44, 0x57, 0xd4, 0x3a, + 0xf7, 0xc3, 0xc6, 0x45, 0x87, 0xaa, 0x23, 0x70, 0x07, 0xee, 0xc4, 0x44, 0x4f, 0x35, 0xe7, 0x27, + 0xb0, 0xc4, 0x04, 0xee, 0x13, 0x32, 0xda, 0x1a, 0x98, 0x93, 0x54, 0x4f, 0x8f, 0xc4, 0xa4, 0x14, + 0xc6, 0x6f, 0x76, 0x5f, 0xe0, 0xdf, 0x17, 0x1a, 0xbb, 0xe6, 0x90, 0x74, 0xed, 0x83, 0x74, 0xdb, + 0x68, 0x36, 0xbb, 0x24, 0xd7, 0xae, 0x28, 0x6b, 0xd8, 0x33, 0xfe, 0x47, 0x4d, 0xb8, 0x4a, 0x1d, + 0xfe, 0x0d, 0xef, 0xe4, 0x55, 0x80, 0x73, 0x7a, 0x64, 0x48, 0x9f, 0x76, 0x70, 0x44, 0x45, 0xa1, + 0xf8, 0x76, 0xd2, 0xf8, 0x5d, 0x11, 0x76, 0x2e, 0x8a, 0x7d, 0xce, 0xfe, 0xf8, 0x51, 0xee, 0x3e, + 0x94, 0x19, 0xe1, 0xd8, 0x33, 0xbc, 0xb1, 0x1b, 0x5b, 0x8c, 0x3f, 0x13, 0xdb, 0x5e, 0x0e, 0x9a, + 0x6a, 0x5e, 0xdf, 0x86, 0x3c, 0xbb, 0x4c, 0xc8, 0x52, 0x7a, 0x25, 0x61, 0x3f, 0x72, 0x3b, 0x74, + 0xc1, 0x88, 0x2f, 0x20, 0xff, 0x8a, 0x21, 0xb0, 0x8a, 0x65, 0xb3, 0x72, 0x29, 0x2c, 0x63, 0xc8, + 0x71, 0xa1, 0x92, 0xce, 0x9e, 0x59, 0xe5, 0x49, 0x88, 0x73, 0xa2, 0x1f, 0xf0, 0x0a, 0xb7, 0xa4, + 0xfb, 0x6d, 0xea, 0xb2, 0xde, 0xc0, 0x24, 0x96, 0xc7, 0x7a, 0x67, 0x59, 0xaf, 0x42, 0xc1, 0x1b, + 0x50, 0xe7, 0x9a, 0xb6, 0xfa, 0x7d, 0xa5, 0x82, 0xf4, 0xe5, 0x69, 0x61, 0x79, 0xf8, 0x9f, 0x34, + 0x98, 0x57, 0x06, 0x4c, 0xe5, 0x98, 0x0f, 0x21, 0xcf, 0x71, 0x66, 0x51, 0xac, 0x2c, 0x86, 0x47, + 0x71, 0x35, 0xba, 0xe0, 0x41, 0x1b, 0x50, 0xe0, 0x4f, 0xb2, 0x8c, 0x4f, 0x66, 0x97, 0x4c, 0xf8, + 0x31, 0x2c, 0x08, 0x12, 0x19, 0xda, 0x49, 0x7b, 0x9b, 0x39, 0x14, 0xff, 0x29, 0x2c, 0x86, 0xd9, + 0xa6, 0x9a, 0x92, 0x62, 0x64, 0xe6, 0x5d, 0x8c, 0xdc, 0x92, 0x46, 0x9e, 0x8c, 0xfa, 0x4a, 0x29, + 0x14, 0x5d, 0x75, 0x75, 0x45, 0x32, 0x91, 0x15, 0xf1, 0x27, 0x20, 0x45, 0xfc, 0x56, 0x27, 0xb0, + 0x20, 0xb7, 0xc3, 0x81, 0xe9, 0xfa, 0x15, 0xf7, 0x57, 0x80, 0x54, 0xe2, 0x6f, 0xdb, 0xa0, 0x1d, + 0x22, 0x13, 0xb9, 0x34, 0xe8, 0x13, 0x40, 0x2a, 0x71, 0xaa, 0x88, 0xde, 0x82, 0xf9, 0x57, 0xf6, + 0x84, 0x86, 0x06, 0x4a, 0x0d, 0x8e, 0x0c, 0xbf, 0x7f, 0xfb, 0xcb, 0xe6, 0xb7, 0xa9, 0x72, 0x75, + 0xc0, 0x54, 0xca, 0xff, 0x43, 0x83, 0xca, 0xd6, 0xc0, 0x70, 0x86, 0x52, 0xf1, 0xf7, 0x21, 0xcf, + 0x6f, 0x95, 0x02, 0xc8, 0x79, 0x3f, 0x2c, 0x46, 0xe5, 0xe5, 0x8d, 0x2d, 0x7e, 0x07, 0x15, 0xa3, + 0xa8, 0xe1, 0xe2, 0x5d, 0xcf, 0x4e, 0xe4, 0xdd, 0xcf, 0x0e, 0xfa, 0x08, 0x72, 0x06, 0x1d, 0xc2, + 0x42, 0x70, 0x2d, 0x7a, 0x9f, 0x67, 0xd2, 0x58, 0xed, 0xcb, 0xb9, 0xf0, 0x77, 0xa1, 0xac, 0x68, + 0x40, 0x05, 0xc8, 0xbe, 0x6c, 0x8b, 0x42, 0x75, 0x6b, 0xbb, 0xbb, 0xf7, 0x9a, 0x03, 0x19, 0x35, + 0x80, 0x9d, 0xb6, 0xdf, 0xce, 0xe0, 0xcf, 0xc5, 0x28, 0x11, 0xef, 0x54, 0x7b, 0xb4, 0x34, 0x7b, + 0x32, 0xef, 0x64, 0xcf, 0x15, 0x54, 0xc5, 0xf4, 0xa7, 0x0d, 0xdf, 0x4c, 0x5e, 0x4a, 0xf8, 0x56, + 0x8c, 0xd7, 0x05, 0x23, 0x9e, 0x83, 0xaa, 0x08, 0xe8, 0x62, 0xff, 0xfd, 0x4b, 0x06, 0x6a, 0x92, + 0x32, 0x2d, 0xe0, 0x2c, 0xb1, 0x32, 0x9e, 0x01, 0x7c, 0xa4, 0x6c, 0x19, 0xf2, 0xfd, 0xb3, 0x63, + 0xf3, 0x2b, 0xf9, 0x72, 0x40, 0xb4, 0x28, 0x7d, 0xc0, 0xf5, 0xf0, 0x37, 0x74, 0xa2, 0x85, 0xee, + 0xf1, 0x97, 0x77, 0x7b, 0x56, 0x9f, 0x5c, 0xb1, 0x3a, 0x7a, 0x56, 0x0f, 0x08, 0x0c, 0x44, 0x10, + 0x6f, 0xf2, 0x58, 0xf1, 0xac, 0xbc, 0xd9, 0x43, 0x4f, 0xa1, 0x4e, 0x9f, 0xb7, 0x46, 0xa3, 0x81, + 0x49, 0xfa, 0x5c, 0x40, 0x81, 0xf1, 0xc4, 0xe8, 0x54, 0x3b, 0x2b, 0x37, 0xdd, 0x46, 0x91, 0x85, + 0x2d, 0xd1, 0x42, 0x6b, 0x50, 0xe6, 0xf6, 0xed, 0x59, 0x27, 0x2e, 0x61, 0xaf, 0xb7, 0xb2, 0xba, + 0x4a, 0xa2, 0xe7, 0x78, 0x6b, 0xec, 0x5d, 0xb4, 0x2d, 0xe3, 0x6c, 0x20, 0xe3, 0x22, 0x4d, 0xe6, + 0x94, 0xb8, 0x63, 0xba, 0x2a, 0xb5, 0x0d, 0x0b, 0x94, 0x4a, 0x2c, 0xcf, 0xec, 0x29, 0x41, 0x54, + 0xa6, 0x4a, 0x2d, 0x92, 0x2a, 0x0d, 0xd7, 0x7d, 0x6b, 0x3b, 0x7d, 0xe1, 0x40, 0xbf, 0x8d, 0x77, + 0xb8, 0xf0, 0x13, 0x37, 0x94, 0x0c, 0x7f, 0x55, 0x29, 0xeb, 0x81, 0x94, 0x97, 0xc4, 0xbb, 0x41, + 0x0a, 0x7e, 0x06, 0x4b, 0x92, 0x53, 0x40, 0xbe, 0x37, 0x30, 0x77, 0xe0, 0xbe, 0x64, 0xde, 0xbe, + 0xa0, 0x57, 0xe0, 0x23, 0xa1, 0xf0, 0xd7, 0xb5, 0xf3, 0x05, 0x34, 0x7c, 0x3b, 0xd9, 0x35, 0xc4, + 0x1e, 0xa8, 0x06, 0x8c, 0x5d, 0xb1, 0x33, 0x4b, 0x3a, 0x7b, 0xa6, 0x34, 0xc7, 0x1e, 0xf8, 0x85, + 0x07, 0x7d, 0xc6, 0xdb, 0xb0, 0x22, 0x65, 0x88, 0x0b, 0x42, 0x58, 0x48, 0xcc, 0xa0, 0x24, 0x21, + 0xc2, 0x61, 0x74, 0xe8, 0xcd, 0x6e, 0x57, 0x39, 0xc3, 0xae, 0x65, 0x32, 0x35, 0x45, 0xe6, 0x12, + 0xdf, 0x11, 0xd4, 0x30, 0x35, 0x2f, 0x09, 0x32, 0x15, 0xa0, 0x92, 0xc5, 0x42, 0x50, 0x72, 0x6c, + 0x21, 0x62, 0xa2, 0x7f, 0x08, 0xab, 0xbe, 0x11, 0xd4, 0x6f, 0x47, 0xc4, 0x19, 0x9a, 0xae, 0xab, + 0x80, 0x84, 0x49, 0x13, 0x7f, 0x1f, 0x66, 0x47, 0x44, 0x44, 0xae, 0xf2, 0x26, 0xda, 0xe0, 0x6f, + 0xf5, 0x37, 0x94, 0xc1, 0xac, 0x1f, 0xf7, 0xe1, 0x81, 0x94, 0xce, 0x3d, 0x9a, 0x28, 0x3e, 0x6a, + 0x94, 0x84, 0x4e, 0x32, 0x29, 0xd0, 0x49, 0x36, 0x02, 0x5c, 0x7f, 0xc2, 0x1d, 0x29, 0xcf, 0xd6, + 0x54, 0x19, 0x69, 0x9f, 0xfb, 0xd4, 0x3f, 0x92, 0x53, 0x09, 0x3b, 0x83, 0xc5, 0xf0, 0x49, 0x9e, + 0x2a, 0x58, 0x2e, 0x42, 0xce, 0xb3, 0x2f, 0x89, 0x0c, 0x95, 0xbc, 0x21, 0x0d, 0xf6, 0x8f, 0xf9, + 0x54, 0x06, 0x1b, 0x81, 0x30, 0xb6, 0x25, 0xa7, 0xb5, 0x97, 0xae, 0xa6, 0x2c, 0xf1, 0x78, 0x03, + 0x1f, 0xc2, 0x72, 0x34, 0x4c, 0x4c, 0x65, 0xf2, 0x6b, 0xbe, 0x81, 0x93, 0x22, 0xc9, 0x54, 0x72, + 0x3f, 0x0d, 0x82, 0x81, 0x12, 0x50, 0xa6, 0x12, 0xa9, 0x43, 0x33, 0x29, 0xbe, 0xfc, 0x26, 0xf6, + 0xab, 0x1f, 0x6e, 0xa6, 0x12, 0xe6, 0x06, 0xc2, 0xa6, 0x5f, 0xfe, 0x20, 0x46, 0x64, 0x6f, 0x8c, + 0x11, 0xe2, 0x90, 0x04, 0x51, 0xec, 0x1b, 0xd8, 0x74, 0x42, 0x47, 0x10, 0x40, 0xa7, 0xd5, 0x41, + 0x73, 0x88, 0xaf, 0x83, 0x35, 0xe4, 0xc6, 0x56, 0xc3, 0xee, 0x54, 0x8b, 0xf1, 0x59, 0x10, 0x3b, + 0x63, 0x91, 0x79, 0x2a, 0xc1, 0x9f, 0xc3, 0x5a, 0x7a, 0x50, 0x9e, 0x46, 0xf2, 0xd3, 0x16, 0x94, + 0xfc, 0xb2, 0x55, 0xf9, 0x22, 0xa6, 0x0c, 0x85, 0xc3, 0xce, 0xf1, 0xd1, 0xd6, 0x76, 0x9b, 0x7f, + 0x12, 0xb3, 0xdd, 0xd1, 0xf5, 0x93, 0xa3, 0x6e, 0x3d, 0xb3, 0xf9, 0xcb, 0x2c, 0x64, 0xf6, 0x5f, + 0xa3, 0x2f, 0x20, 0xc7, 0xdf, 0x0f, 0xdf, 0xf0, 0x51, 0x40, 0xf3, 0xa6, 0x57, 0xe0, 0xf8, 0xce, + 0x4f, 0xfe, 0xfb, 0x97, 0x3f, 0xcf, 0xcc, 0xe3, 0x4a, 0x6b, 0xf2, 0x9d, 0xd6, 0xe5, 0xa4, 0xc5, + 0x72, 0xc3, 0x73, 0xed, 0x29, 0xfa, 0x14, 0xb2, 0x47, 0x63, 0x0f, 0xa5, 0x7e, 0x2c, 0xd0, 0x4c, + 0x7f, 0x2b, 0x8e, 0x97, 0x98, 0xd0, 0x39, 0x0c, 0x42, 0xe8, 0x68, 0xec, 0x51, 0x91, 0x3f, 0x82, + 0xb2, 0xfa, 0x4e, 0xfb, 0xd6, 0x2f, 0x08, 0x9a, 0xb7, 0xbf, 0x2f, 0xc7, 0xf7, 0x99, 0xaa, 0x3b, + 0x18, 0x09, 0x55, 0xfc, 0xad, 0xbb, 0x3a, 0x8b, 0xee, 0x95, 0x85, 0x52, 0xbf, 0x2f, 0x68, 0xa6, + 0xbf, 0x42, 0x8f, 0xcd, 0xc2, 0xbb, 0xb2, 0xa8, 0xc8, 0x3f, 0x16, 0x6f, 0xcf, 0x7b, 0x1e, 0x7a, + 0x90, 0xf0, 0xf6, 0x54, 0x7d, 0x4f, 0xd8, 0x5c, 0x4b, 0x67, 0x10, 0x4a, 0xee, 0x31, 0x25, 0xcb, + 0x78, 0x5e, 0x28, 0xe9, 0xf9, 0x2c, 0xcf, 0xb5, 0xa7, 0x9b, 0x3d, 0xc8, 0x31, 0x0c, 0x1e, 0x7d, + 0x29, 0x1f, 0x9a, 0x09, 0x2f, 0x23, 0x52, 0x16, 0x3a, 0x84, 0xde, 0xe3, 0x45, 0xa6, 0xa8, 0x86, + 0x4b, 0x54, 0x11, 0x43, 0xe0, 0x9f, 0x6b, 0x4f, 0xd7, 0xb5, 0x6f, 0x69, 0x9b, 0xff, 0x9c, 0x83, + 0x1c, 0x03, 0x9f, 0xd0, 0x25, 0x40, 0x80, 0x47, 0x47, 0x67, 0x17, 0x43, 0xb8, 0xa3, 0xb3, 0x8b, + 0x43, 0xd9, 0xb8, 0xc9, 0x94, 0x2e, 0xe2, 0x39, 0xaa, 0x94, 0x61, 0x5a, 0x2d, 0x06, 0xd3, 0x51, + 0x3f, 0xfe, 0x95, 0x26, 0xb0, 0x37, 0x7e, 0x96, 0x50, 0x92, 0xb4, 0x10, 0x28, 0x1d, 0xdd, 0x0e, + 0x09, 0x80, 0x34, 0xfe, 0x1e, 0x53, 0xd8, 0xc2, 0xf5, 0x40, 0xa1, 0xc3, 0x38, 0x9e, 0x6b, 0x4f, + 0xbf, 0x6c, 0xe0, 0x05, 0xe1, 0xe5, 0x48, 0x0f, 0xfa, 0x31, 0xd4, 0xc2, 0xa0, 0x2b, 0x7a, 0x98, + 0xa0, 0x2b, 0x8a, 0xdd, 0x36, 0x1f, 0xdd, 0xcc, 0x24, 0x6c, 0x5a, 0x65, 0x36, 0x09, 0xe5, 0x5c, + 0xf3, 0x25, 0x21, 0x23, 0x83, 0x32, 0x89, 0x35, 0x40, 0x7f, 0xaf, 0x09, 0x4c, 0x3c, 0x40, 0x51, + 0x51, 0x92, 0xf4, 0x18, 0x46, 0xdb, 0x7c, 0x7c, 0x0b, 0x97, 0x30, 0xe2, 0x0f, 0x98, 0x11, 0xbf, + 0x8b, 0x17, 0x03, 0x23, 0x3c, 0x73, 0x48, 0x3c, 0x5b, 0x58, 0xf1, 0xe5, 0x3d, 0x7c, 0x27, 0xe4, + 0x9c, 0x50, 0x6f, 0xb0, 0x58, 0x1c, 0x09, 0x4d, 0x5c, 0xac, 0x10, 0xb2, 0x9a, 0xb8, 0x58, 0x61, + 0x18, 0x35, 0x69, 0xb1, 0x38, 0xee, 0x99, 0xb4, 0x58, 0x7e, 0xcf, 0x26, 0xfb, 0x7e, 0x85, 0x7f, + 0xb5, 0x8a, 0x6c, 0x28, 0xf9, 0x28, 0x24, 0x5a, 0x4d, 0x42, 0x84, 0x82, 0xbb, 0x44, 0xf3, 0x41, + 0x6a, 0xbf, 0x30, 0xe8, 0x3d, 0x66, 0xd0, 0x5d, 0xbc, 0x4c, 0x35, 0x8b, 0x0f, 0x63, 0x5b, 0x1c, + 0x76, 0x68, 0x19, 0xfd, 0x3e, 0x75, 0xc4, 0x9f, 0x40, 0x45, 0x85, 0x09, 0xd1, 0x7b, 0x89, 0x28, + 0x94, 0x8a, 0x34, 0x36, 0xf1, 0x4d, 0x2c, 0x42, 0xf3, 0x23, 0xa6, 0x79, 0x15, 0xaf, 0x24, 0x68, + 0x76, 0x18, 0x6b, 0x48, 0x39, 0x87, 0xf8, 0x92, 0x95, 0x87, 0x10, 0xc4, 0x64, 0xe5, 0x61, 0x84, + 0xf0, 0x46, 0xe5, 0x63, 0xc6, 0x4a, 0x95, 0xbb, 0x00, 0x01, 0x98, 0x87, 0x12, 0x7d, 0xa9, 0x5c, + 0xa6, 0xa2, 0xc1, 0x21, 0x8e, 0x03, 0x62, 0xcc, 0xd4, 0x8a, 0x7d, 0x17, 0x51, 0x3b, 0x30, 0x5d, + 0x1a, 0x24, 0x36, 0xff, 0x3a, 0x0f, 0xe5, 0x57, 0x86, 0x69, 0x79, 0xc4, 0x32, 0xac, 0x1e, 0x41, + 0x67, 0x90, 0x63, 0x89, 0x32, 0x1a, 0x07, 0x55, 0x7c, 0x2b, 0x1a, 0x07, 0x43, 0xe0, 0x0f, 0x5e, + 0x63, 0x5a, 0x9b, 0x78, 0x89, 0x6a, 0x1d, 0x06, 0xa2, 0x5b, 0x0c, 0xb3, 0xa1, 0x13, 0x7d, 0x03, + 0x79, 0xf1, 0x3a, 0x20, 0x22, 0x28, 0x84, 0xe5, 0x34, 0xef, 0x25, 0x77, 0x26, 0x6d, 0x25, 0x55, + 0x8d, 0xcb, 0xf8, 0xa8, 0x9e, 0x09, 0x40, 0x00, 0x46, 0x46, 0x1d, 0x1a, 0xc3, 0x2e, 0x9b, 0x6b, + 0xe9, 0x0c, 0x42, 0xe7, 0x63, 0xa6, 0xf3, 0x01, 0x6e, 0x46, 0x75, 0xf6, 0x7d, 0x5e, 0xaa, 0xf7, + 0x8f, 0x60, 0x76, 0xd7, 0x70, 0x2f, 0x50, 0x24, 0xf5, 0x29, 0x1f, 0x93, 0x34, 0x9b, 0x49, 0x5d, + 0x42, 0xcb, 0x03, 0xa6, 0x65, 0x85, 0x47, 0x12, 0x55, 0xcb, 0x85, 0xe1, 0xd2, 0x9c, 0x82, 0xfa, + 0x90, 0xe7, 0xdf, 0x96, 0x44, 0xfd, 0x17, 0xfa, 0x3e, 0x25, 0xea, 0xbf, 0xf0, 0xe7, 0x28, 0xb7, + 0x6b, 0x19, 0x41, 0x51, 0x7e, 0xcc, 0x81, 0x22, 0x6f, 0xf6, 0x22, 0x1f, 0x7e, 0x34, 0x57, 0xd3, + 0xba, 0x85, 0xae, 0x87, 0x4c, 0xd7, 0x7d, 0xdc, 0x88, 0xad, 0x95, 0xe0, 0x7c, 0xae, 0x3d, 0xfd, + 0x96, 0x86, 0x7e, 0x0c, 0x10, 0xe0, 0xb7, 0xb1, 0x03, 0x10, 0x85, 0x82, 0x63, 0x07, 0x20, 0x06, + 0xfd, 0xe2, 0x0d, 0xa6, 0x77, 0x1d, 0x3f, 0x8c, 0xea, 0xf5, 0x1c, 0xc3, 0x72, 0xdf, 0x10, 0xe7, + 0x23, 0x8e, 0xd1, 0xb9, 0x17, 0xe6, 0x88, 0x1e, 0x86, 0x7f, 0x9b, 0x83, 0x59, 0x5a, 0x80, 0xd2, + 0x3c, 0x1d, 0xdc, 0xdb, 0xa3, 0x96, 0xc4, 0xd0, 0xb2, 0xa8, 0x25, 0xf1, 0x2b, 0x7f, 0x38, 0x4f, + 0xb3, 0x9f, 0x1b, 0x10, 0xc6, 0x40, 0x1d, 0x6d, 0x43, 0x59, 0xb9, 0xd8, 0xa3, 0x04, 0x61, 0x61, + 0x18, 0x2e, 0x1a, 0xf9, 0x13, 0x50, 0x01, 0x7c, 0x97, 0xe9, 0x5b, 0xe2, 0x91, 0x9f, 0xe9, 0xeb, + 0x73, 0x0e, 0xaa, 0xf0, 0x2d, 0x54, 0xd4, 0xcb, 0x3f, 0x4a, 0x90, 0x17, 0x81, 0xf8, 0xa2, 0x51, + 0x2e, 0x09, 0x3b, 0x08, 0x1f, 0x7c, 0xff, 0x27, 0x15, 0x92, 0x8d, 0x2a, 0x1e, 0x40, 0x41, 0xa0, + 0x01, 0x49, 0xb3, 0x0c, 0xe3, 0x81, 0x49, 0xb3, 0x8c, 0x40, 0x09, 0xe1, 0xda, 0x8e, 0x69, 0xa4, + 0x17, 0x1e, 0x99, 0x49, 0x84, 0xb6, 0x97, 0xc4, 0x4b, 0xd3, 0x16, 0x80, 0x5b, 0x69, 0xda, 0x94, + 0xcb, 0x66, 0x9a, 0xb6, 0x73, 0xe2, 0x89, 0xe3, 0x22, 0x2f, 0x71, 0x28, 0x45, 0x98, 0x1a, 0xbd, + 0xf1, 0x4d, 0x2c, 0x49, 0xa5, 0x77, 0xa0, 0x50, 0x84, 0x6e, 0x74, 0x05, 0x10, 0x60, 0x15, 0xd1, + 0x7a, 0x2a, 0x11, 0xf0, 0x8c, 0xd6, 0x53, 0xc9, 0x70, 0x47, 0x38, 0x34, 0x04, 0x7a, 0x79, 0xe5, + 0x4f, 0x35, 0xff, 0x4c, 0x03, 0x14, 0x87, 0x35, 0xd0, 0xb3, 0x64, 0xe9, 0x89, 0x30, 0x6a, 0xf3, + 0xc3, 0x77, 0x63, 0x4e, 0x8a, 0xf6, 0x81, 0x49, 0x3d, 0xc6, 0x3d, 0x7a, 0x4b, 0x8d, 0xfa, 0x73, + 0x0d, 0xaa, 0x21, 0x4c, 0x04, 0xbd, 0x9f, 0xb2, 0xa6, 0x11, 0x14, 0xb6, 0xf9, 0xe4, 0x56, 0xbe, + 0xa4, 0x42, 0x53, 0xd9, 0x01, 0xb2, 0xe2, 0xfe, 0xa9, 0x06, 0xb5, 0x30, 0x86, 0x82, 0x52, 0x64, + 0xc7, 0x50, 0xdc, 0xe6, 0xfa, 0xed, 0x8c, 0x37, 0x2f, 0x4f, 0x50, 0x6c, 0x0f, 0xa0, 0x20, 0x50, + 0x97, 0xa4, 0x8d, 0x1f, 0xc6, 0x7f, 0x93, 0x36, 0x7e, 0x04, 0xb2, 0x49, 0xd8, 0xf8, 0x8e, 0x3d, + 0x20, 0xca, 0x31, 0x13, 0xb0, 0x4c, 0x9a, 0xb6, 0x9b, 0x8f, 0x59, 0x04, 0xd3, 0x49, 0xd3, 0x16, + 0x1c, 0x33, 0x89, 0xc7, 0xa0, 0x14, 0x61, 0xb7, 0x1c, 0xb3, 0x28, 0x9c, 0x93, 0x70, 0xcc, 0x98, + 0x42, 0xe5, 0x98, 0x05, 0xc8, 0x49, 0xd2, 0x31, 0x8b, 0xc1, 0xd9, 0x49, 0xc7, 0x2c, 0x0e, 0xbe, + 0x24, 0xac, 0x23, 0xd3, 0x1b, 0x3a, 0x66, 0x0b, 0x09, 0x20, 0x0b, 0xfa, 0x30, 0xc5, 0x89, 0x89, + 0x28, 0x79, 0xf3, 0xa3, 0x77, 0xe4, 0x4e, 0xdd, 0xe3, 0xdc, 0xfd, 0x72, 0x8f, 0xff, 0x8d, 0x06, + 0x8b, 0x49, 0x00, 0x0d, 0x4a, 0xd1, 0x93, 0x82, 0xae, 0x37, 0x37, 0xde, 0x95, 0xfd, 0x66, 0x6f, + 0xf9, 0xbb, 0xfe, 0x45, 0xfd, 0xdf, 0xbf, 0x5e, 0xd5, 0xfe, 0xf3, 0xeb, 0x55, 0xed, 0x7f, 0xbe, + 0x5e, 0xd5, 0xfe, 0xf6, 0x7f, 0x57, 0x67, 0xce, 0xf2, 0xec, 0x87, 0x7a, 0xdf, 0xf9, 0xff, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xc6, 0xc3, 0xa2, 0xb2, 0x2f, 0x38, 0x00, 0x00, } diff --git a/etcdserver/etcdserverpb/rpc.proto b/etcdserver/etcdserverpb/rpc.proto index b089035fe795..8060ca0160f0 100644 --- a/etcdserver/etcdserverpb/rpc.proto +++ b/etcdserver/etcdserverpb/rpc.proto @@ -776,6 +776,22 @@ message LeaseRevokeResponse { ResponseHeader header = 1; } +message LeaseCheckpoint { + // ID is the lease ID to checkpoint. + int64 ID = 1; + + // Remaining_TTL is the remaining time until expiry of the lease. + int64 remaining_TTL = 2; +} + +message LeaseCheckpointRequest { + repeated LeaseCheckpoint checkpoints = 1; +} + +message LeaseCheckpointResponse { + ResponseHeader header = 1; +} + message LeaseKeepAliveRequest { // ID is the lease ID for the lease to keep alive. int64 ID = 1; diff --git a/etcdserver/server.go b/etcdserver/server.go index 5f6110bbf6c8..86ff6e1d0066 100644 --- a/etcdserver/server.go +++ b/etcdserver/server.go @@ -519,7 +519,7 @@ func NewServer(cfg ServerConfig) (srv *EtcdServer, err error) { // always recover lessor before kv. When we recover the mvcc.KV it will reattach keys to its leases. // If we recover mvcc.KV first, it will attach the keys to the wrong lessor before it recovers. - srv.lessor = lease.NewLessor(srv.be, int64(math.Ceil(minTTL.Seconds()))) + srv.lessor = lease.NewLessor(srv.getLogger(), srv.be, lease.LessorConfig{MinLeaseTTL: int64(math.Ceil(minTTL.Seconds())), CheckpointInterval: cfg.LeaseCheckpointInterval}) srv.kv = mvcc.New(srv.getLogger(), srv.be, srv.lessor, &srv.consistIndex) if beExist { kvindex := srv.kv.ConsistentIndex() @@ -576,6 +576,10 @@ func NewServer(cfg ServerConfig) (srv *EtcdServer, err error) { return nil, err } + srv.lessor.SetCheckpointer(func(ctx context.Context, cp *pb.LeaseCheckpointRequest) { + srv.raftRequestOnce(ctx, pb.InternalRaftRequest{LeaseCheckpoint: cp}) + }) + // TODO: move transport initialization near the definition of remote tr := &rafthttp.Transport{ Logger: cfg.Logger, diff --git a/integration/cluster.go b/integration/cluster.go index e3924e64d11f..a3db95e960aa 100644 --- a/integration/cluster.go +++ b/integration/cluster.go @@ -148,6 +148,8 @@ type ClusterConfig struct { // UseIP is true to use only IP for gRPC requests. UseIP bool + + LeaseCheckpointInterval time.Duration } type cluster struct { @@ -290,6 +292,7 @@ func (c *cluster) mustNewMember(t *testing.T) *member { clientMaxCallSendMsgSize: c.cfg.ClientMaxCallSendMsgSize, clientMaxCallRecvMsgSize: c.cfg.ClientMaxCallRecvMsgSize, useIP: c.cfg.UseIP, + leaseCheckpointInterval: c.cfg.LeaseCheckpointInterval, }) m.DiscoveryURL = c.cfg.DiscoveryURL if c.cfg.UseGRPC { @@ -575,6 +578,7 @@ type memberConfig struct { clientMaxCallSendMsgSize int clientMaxCallRecvMsgSize int useIP bool + leaseCheckpointInterval time.Duration } // mustNewMember return an inited member with the given name. If peerTLS is @@ -665,6 +669,7 @@ func mustNewMember(t *testing.T, mcfg memberConfig) *member { m.clientMaxCallSendMsgSize = mcfg.clientMaxCallSendMsgSize m.clientMaxCallRecvMsgSize = mcfg.clientMaxCallRecvMsgSize m.useIP = mcfg.useIP + m.LeaseCheckpointInterval = mcfg.leaseCheckpointInterval m.InitialCorruptCheck = true diff --git a/integration/v3_lease_test.go b/integration/v3_lease_test.go index 7ec2d3c764e0..4e47e6c0a07a 100644 --- a/integration/v3_lease_test.go +++ b/integration/v3_lease_test.go @@ -25,7 +25,9 @@ import ( "github.com/coreos/etcd/mvcc/mvccpb" "github.com/coreos/etcd/pkg/testutil" + "google.golang.org/grpc/codes" "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" ) // TestV3LeasePrmote ensures the newly elected leader can promote itself @@ -222,6 +224,56 @@ func TestV3LeaseKeepAlive(t *testing.T) { }) } +// TestV3LeaseCheckpoint ensures a lease checkpoint results in a remaining TTL being persisted +// across leader elections. +func TestV3LeaseCheckpoint(t *testing.T) { + var ttl int64 = 300 + leaseInterval := 2 * time.Second + defer testutil.AfterTest(t) + clus := NewClusterV3(t, &ClusterConfig{Size: 3, LeaseCheckpointInterval: leaseInterval}) + defer clus.Terminate(t) + + // create lease + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + c := toGRPC(clus.RandClient()) + lresp, err := c.Lease.LeaseGrant(ctx, &pb.LeaseGrantRequest{TTL: ttl}) + if err != nil { + t.Fatal(err) + } + + // wait for a checkpoint to occur + time.Sleep(leaseInterval + 1*time.Second) + + // Force a leader election + leaderId := clus.WaitLeader(t) + leader := clus.Members[leaderId] + leader.Stop(t) + time.Sleep(time.Duration(3*electionTicks) * tickDuration) + leader.Restart(t) + newLeaderId := clus.WaitLeader(t) + c2 := toGRPC(clus.Client(newLeaderId)) + + time.Sleep(250 * time.Millisecond) + + // Check the TTL of the new leader + var ttlresp *pb.LeaseTimeToLiveResponse + for i := 0; i < 10; i++ { + if ttlresp, err = c2.Lease.LeaseTimeToLive(ctx, &pb.LeaseTimeToLiveRequest{ID: lresp.ID}); err != nil { + if status, ok := status.FromError(err); ok && status.Code() == codes.Unavailable { + time.Sleep(time.Millisecond * 250) + } else { + t.Fatal(err) + } + } + } + + expectedTTL := ttl - int64(leaseInterval.Seconds()) + if ttlresp.TTL < expectedTTL-1 || ttlresp.TTL > expectedTTL { + t.Fatalf("expected lease to be checkpointed after restart such that %d < TTL <%d, but got TTL=%d", expectedTTL-1, expectedTTL, ttlresp.TTL) + } +} + // TestV3LeaseExists creates a lease on a random client and confirms it exists in the cluster. func TestV3LeaseExists(t *testing.T) { defer testutil.AfterTest(t) diff --git a/lease/lease_queue.go b/lease/lease_queue.go index 261df9509374..24767de1a295 100644 --- a/lease/lease_queue.go +++ b/lease/lease_queue.go @@ -16,9 +16,10 @@ package lease // LeaseWithTime contains lease object with expire information. type LeaseWithTime struct { - id LeaseID - expiration int64 - index int + id LeaseID + // Unix nanos timestamp. + time int64 + index int } type LeaseQueue []*LeaseWithTime @@ -26,7 +27,7 @@ type LeaseQueue []*LeaseWithTime func (pq LeaseQueue) Len() int { return len(pq) } func (pq LeaseQueue) Less(i, j int) bool { - return pq[i].expiration < pq[j].expiration + return pq[i].time < pq[j].time } func (pq LeaseQueue) Swap(i, j int) { diff --git a/lease/lease_queue_test.go b/lease/lease_queue_test.go index 201911fd0cc7..2387ae028150 100644 --- a/lease/lease_queue_test.go +++ b/lease/lease_queue_test.go @@ -34,7 +34,7 @@ func TestLeaseQueue(t *testing.T) { exp = time.Now().UnixNano() } le.leaseMap[LeaseID(i)] = &Lease{ID: LeaseID(i)} - heap.Push(&le.leaseHeap, &LeaseWithTime{id: LeaseID(i), expiration: exp}) + heap.Push(&le.leaseHeap, &LeaseWithTime{id: LeaseID(i), time: exp}) } // first element must be front diff --git a/lease/leasehttp/http_test.go b/lease/leasehttp/http_test.go index 1148111d724e..2159cff03f6c 100644 --- a/lease/leasehttp/http_test.go +++ b/lease/leasehttp/http_test.go @@ -24,14 +24,16 @@ import ( "github.com/coreos/etcd/lease" "github.com/coreos/etcd/mvcc/backend" + "go.uber.org/zap" ) func TestRenewHTTP(t *testing.T) { + lg := zap.NewNop() be, tmpPath := backend.NewTmpBackend(time.Hour, 10000) defer os.Remove(tmpPath) defer be.Close() - le := lease.NewLessor(be, int64(5)) + le := lease.NewLessor(lg, be, lease.LessorConfig{MinLeaseTTL: int64(5)}) le.Promote(time.Second) l, err := le.Grant(1, int64(5)) if err != nil { @@ -51,11 +53,12 @@ func TestRenewHTTP(t *testing.T) { } func TestTimeToLiveHTTP(t *testing.T) { + lg := zap.NewNop() be, tmpPath := backend.NewTmpBackend(time.Hour, 10000) defer os.Remove(tmpPath) defer be.Close() - le := lease.NewLessor(be, int64(5)) + le := lease.NewLessor(lg, be, lease.LessorConfig{MinLeaseTTL: int64(5)}) le.Promote(time.Second) l, err := le.Grant(1, int64(5)) if err != nil { @@ -92,11 +95,12 @@ func TestTimeToLiveHTTPTimeout(t *testing.T) { } func testApplyTimeout(t *testing.T, f func(*lease.Lease, string) error) { + lg := zap.NewNop() be, tmpPath := backend.NewTmpBackend(time.Hour, 10000) defer os.Remove(tmpPath) defer be.Close() - le := lease.NewLessor(be, int64(5)) + le := lease.NewLessor(lg, be, lease.LessorConfig{MinLeaseTTL: int64(5)}) le.Promote(time.Second) l, err := le.Grant(1, int64(5)) if err != nil { diff --git a/lease/leasepb/lease.pb.go b/lease/leasepb/lease.pb.go index 4ab937672776..ca7dd8560fc2 100644 --- a/lease/leasepb/lease.pb.go +++ b/lease/leasepb/lease.pb.go @@ -40,8 +40,9 @@ var _ = math.Inf const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package type Lease struct { - ID int64 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` - TTL int64 `protobuf:"varint,2,opt,name=TTL,proto3" json:"TTL,omitempty"` + ID int64 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` + TTL int64 `protobuf:"varint,2,opt,name=TTL,proto3" json:"TTL,omitempty"` + RemainingTTL int64 `protobuf:"varint,3,opt,name=RemainingTTL,proto3" json:"RemainingTTL,omitempty"` } func (m *Lease) Reset() { *m = Lease{} } @@ -97,6 +98,11 @@ func (m *Lease) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintLease(dAtA, i, uint64(m.TTL)) } + if m.RemainingTTL != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintLease(dAtA, i, uint64(m.RemainingTTL)) + } return i, nil } @@ -174,6 +180,9 @@ func (m *Lease) Size() (n int) { if m.TTL != 0 { n += 1 + sovLease(uint64(m.TTL)) } + if m.RemainingTTL != 0 { + n += 1 + sovLease(uint64(m.RemainingTTL)) + } return n } @@ -277,6 +286,25 @@ func (m *Lease) Unmarshal(dAtA []byte) error { break } } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field RemainingTTL", wireType) + } + m.RemainingTTL = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowLease + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.RemainingTTL |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipLease(dAtA[iNdEx:]) @@ -572,20 +600,21 @@ var ( func init() { proto.RegisterFile("lease.proto", fileDescriptorLease) } var fileDescriptorLease = []byte{ - // 233 bytes of a gzipped FileDescriptorProto + // 253 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0xce, 0x49, 0x4d, 0x2c, 0x4e, 0xd5, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x07, 0x73, 0x0a, 0x92, 0xa4, 0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0x62, 0xfa, 0x20, 0x16, 0x44, 0x5a, 0x4a, 0x2d, 0xb5, 0x24, 0x39, 0x45, 0x1f, 0x44, 0x14, 0xa7, 0x16, 0x95, 0xa5, 0x16, 0x21, 0x31, 0x0b, 0x92, 0xf4, 0x8b, 0x0a, 0x92, - 0x21, 0xea, 0x94, 0x34, 0xb9, 0x58, 0x7d, 0x40, 0x06, 0x09, 0xf1, 0x71, 0x31, 0x79, 0xba, 0x48, + 0x21, 0xea, 0x94, 0x7c, 0xb9, 0x58, 0x7d, 0x40, 0x06, 0x09, 0xf1, 0x71, 0x31, 0x79, 0xba, 0x48, 0x30, 0x2a, 0x30, 0x6a, 0x30, 0x07, 0x31, 0x79, 0xba, 0x08, 0x09, 0x70, 0x31, 0x87, 0x84, 0xf8, - 0x48, 0x30, 0x81, 0x05, 0x40, 0x4c, 0xa5, 0x12, 0x2e, 0x11, 0xb0, 0x52, 0xcf, 0xbc, 0x92, 0xd4, - 0xa2, 0xbc, 0xc4, 0x9c, 0xa0, 0xd4, 0xc2, 0xd2, 0xd4, 0xe2, 0x12, 0xa1, 0x18, 0x2e, 0x31, 0xb0, - 0x78, 0x48, 0x66, 0x6e, 0x6a, 0x48, 0xbe, 0x4f, 0x66, 0x59, 0x2a, 0x54, 0x06, 0x6c, 0x1a, 0xb7, - 0x91, 0x8a, 0x1e, 0xb2, 0xdd, 0x7a, 0xd8, 0xd5, 0x06, 0xe1, 0x30, 0x43, 0xa9, 0x82, 0x4b, 0x14, - 0xcd, 0xd6, 0xe2, 0x82, 0xfc, 0xbc, 0xe2, 0x54, 0xa1, 0x78, 0x2e, 0x71, 0x0c, 0x2d, 0x10, 0x29, - 0xa8, 0xbd, 0xaa, 0x04, 0xec, 0x85, 0x28, 0x0e, 0xc2, 0x65, 0x8a, 0x93, 0xc4, 0x89, 0x87, 0x72, - 0x0c, 0x17, 0x1e, 0xca, 0x31, 0x9c, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, 0x1c, 0xe3, 0x83, 0x47, - 0x72, 0x8c, 0x33, 0x1e, 0xcb, 0x31, 0x24, 0xb1, 0x81, 0xc3, 0xce, 0x18, 0x10, 0x00, 0x00, 0xff, - 0xff, 0x9f, 0xf2, 0x42, 0xe0, 0x91, 0x01, 0x00, 0x00, + 0x48, 0x30, 0x81, 0x05, 0x40, 0x4c, 0x21, 0x25, 0x2e, 0x9e, 0xa0, 0xd4, 0xdc, 0xc4, 0xcc, 0xbc, + 0xcc, 0xbc, 0x74, 0x90, 0x14, 0x33, 0x58, 0x0a, 0x45, 0x4c, 0xa9, 0x84, 0x4b, 0x04, 0x6c, 0x9c, + 0x67, 0x5e, 0x49, 0x6a, 0x51, 0x5e, 0x62, 0x4e, 0x50, 0x6a, 0x61, 0x69, 0x6a, 0x71, 0x89, 0x50, + 0x0c, 0x97, 0x18, 0x58, 0x3c, 0x24, 0x33, 0x37, 0x35, 0x24, 0xdf, 0x27, 0xb3, 0x2c, 0x15, 0x2a, + 0x03, 0xb6, 0x91, 0xdb, 0x48, 0x45, 0x0f, 0xd9, 0x7d, 0x7a, 0xd8, 0xd5, 0x06, 0xe1, 0x30, 0x43, + 0xa9, 0x82, 0x4b, 0x14, 0xcd, 0xd6, 0xe2, 0x82, 0xfc, 0xbc, 0xe2, 0x54, 0xa1, 0x78, 0x2e, 0x71, + 0x0c, 0x2d, 0x10, 0x29, 0xa8, 0xbd, 0xaa, 0x04, 0xec, 0x85, 0x28, 0x0e, 0xc2, 0x65, 0x8a, 0x93, + 0xc4, 0x89, 0x87, 0x72, 0x0c, 0x17, 0x1e, 0xca, 0x31, 0x9c, 0x78, 0x24, 0xc7, 0x78, 0xe1, 0x91, + 0x1c, 0xe3, 0x83, 0x47, 0x72, 0x8c, 0x33, 0x1e, 0xcb, 0x31, 0x24, 0xb1, 0x81, 0xc3, 0xd7, 0x18, + 0x10, 0x00, 0x00, 0xff, 0xff, 0xa9, 0x9f, 0x8b, 0x6c, 0xb5, 0x01, 0x00, 0x00, } diff --git a/lease/leasepb/lease.proto b/lease/leasepb/lease.proto index be414b993ed9..1169d9f10a98 100644 --- a/lease/leasepb/lease.proto +++ b/lease/leasepb/lease.proto @@ -13,6 +13,7 @@ option (gogoproto.goproto_enum_prefix_all) = false; message Lease { int64 ID = 1; int64 TTL = 2; + int64 RemainingTTL = 3; } message LeaseInternalRequest { diff --git a/lease/lessor.go b/lease/lessor.go index 47e84a24181a..462659ca6c21 100644 --- a/lease/lessor.go +++ b/lease/lessor.go @@ -16,6 +16,7 @@ package lease import ( "container/heap" + "context" "encoding/binary" "errors" "math" @@ -23,8 +24,10 @@ import ( "sync" "time" + pb "github.com/coreos/etcd/etcdserver/etcdserverpb" "github.com/coreos/etcd/lease/leasepb" "github.com/coreos/etcd/mvcc/backend" + "go.uber.org/zap" ) // NoLease is a special LeaseID representing the absence of a lease. @@ -41,6 +44,13 @@ var ( // maximum number of leases to revoke per second; configurable for tests leaseRevokeRate = 1000 + // maximum number of lease checkpoints per second; configurable for tests + leaseCheckpointRate = 1000 + + // Limit the total number of scheduled checkpoints, checkpoint should be best effort and it is + // better to throttle checkpointing than to degrade performance. + maxScheduledCheckpoints = 10000 + ErrNotPrimary = errors.New("not a primary lessor") ErrLeaseNotFound = errors.New("lease not found") ErrLeaseExists = errors.New("lease already exists") @@ -57,6 +67,10 @@ type TxnDelete interface { // RangeDeleter is a TxnDelete constructor. type RangeDeleter func() TxnDelete +// Checkpointer permits checkpointing of lease remaining TTLs to the consensus log. Defined here to +// avoid circular dependency with mvcc. +type Checkpointer func(ctx context.Context, lc *pb.LeaseCheckpointRequest) + type LeaseID int64 // Lessor owns leases. It can grant, revoke, renew and modify leases for lessee. @@ -66,6 +80,8 @@ type Lessor interface { // new TxnDeletes. SetRangeDeleter(rd RangeDeleter) + SetCheckpointer(cp Checkpointer) + // Grant grants a lease that expires at least after TTL seconds. Grant(id LeaseID, ttl int64) (*Lease, error) // Revoke revokes a lease with given ID. The item attached to the @@ -73,6 +89,10 @@ type Lessor interface { // will be returned. Revoke(id LeaseID) error + // Checkpoint applies the remainingTTL of a lease. The remainingTTL is used in Promote to set + // the expiry of leases to less than the full TTL when possible. + Checkpoint(id LeaseID, remainingTTL int64) error + // Attach attaches given leaseItem to the lease with given LeaseID. // If the lease does not exist, an error will be returned. Attach(id LeaseID, items []LeaseItem) error @@ -123,14 +143,19 @@ type lessor struct { // demotec will be closed if the lessor is demoted. demotec chan struct{} - leaseMap map[LeaseID]*Lease - leaseHeap LeaseQueue - itemMap map[LeaseItem]LeaseID + leaseMap map[LeaseID]*Lease + leaseHeap LeaseQueue + leaseCheckpointHeap LeaseQueue + itemMap map[LeaseItem]LeaseID // When a lease expires, the lessor will delete the // leased range (or key) by the RangeDeleter. rd RangeDeleter + // When a lease's deadline should be persisted to preserve the remaining TTL across leader + // elections and restarts, the lessor will checkpoint the lease by the Checkpointer. + cp Checkpointer + // backend to persist leases. We only persist lease ID and expiry for now. // The leased items can be recovered by iterating all the keys in kv. b backend.Backend @@ -144,23 +169,40 @@ type lessor struct { stopC chan struct{} // doneC is a channel whose closure indicates that the lessor is stopped. doneC chan struct{} + + lg *zap.Logger + + // Wait duration between lease checkpoints. + checkpointInterval time.Duration +} + +type LessorConfig struct { + MinLeaseTTL int64 + CheckpointInterval time.Duration } -func NewLessor(b backend.Backend, minLeaseTTL int64) Lessor { - return newLessor(b, minLeaseTTL) +func NewLessor(lg *zap.Logger, b backend.Backend, cfg LessorConfig) Lessor { + return newLessor(lg, b, cfg) } -func newLessor(b backend.Backend, minLeaseTTL int64) *lessor { +func newLessor(lg *zap.Logger, b backend.Backend, cfg LessorConfig) *lessor { + checkpointInterval := cfg.CheckpointInterval + if checkpointInterval == 0 { + checkpointInterval = 5 * time.Minute + } l := &lessor{ - leaseMap: make(map[LeaseID]*Lease), - itemMap: make(map[LeaseItem]LeaseID), - leaseHeap: make(LeaseQueue, 0), - b: b, - minLeaseTTL: minLeaseTTL, + leaseMap: make(map[LeaseID]*Lease), + itemMap: make(map[LeaseItem]LeaseID), + leaseHeap: make(LeaseQueue, 0), + leaseCheckpointHeap: make(LeaseQueue, 0), + b: b, + minLeaseTTL: cfg.MinLeaseTTL, + checkpointInterval: checkpointInterval, // expiredC is a small buffered chan to avoid unnecessary blocking. expiredC: make(chan []*Lease, 16), stopC: make(chan struct{}), doneC: make(chan struct{}), + lg: lg, } l.initAndRecover() @@ -193,6 +235,13 @@ func (le *lessor) SetRangeDeleter(rd RangeDeleter) { le.rd = rd } +func (le *lessor) SetCheckpointer(cp Checkpointer) { + le.mu.Lock() + defer le.mu.Unlock() + + le.cp = cp +} + func (le *lessor) Grant(id LeaseID, ttl int64) (*Lease, error) { if id == NoLease { return nil, ErrLeaseNotFound @@ -229,12 +278,17 @@ func (le *lessor) Grant(id LeaseID, ttl int64) (*Lease, error) { } le.leaseMap[id] = l - item := &LeaseWithTime{id: l.ID, expiration: l.expiry.UnixNano()} + item := &LeaseWithTime{id: l.ID, time: l.expiry.UnixNano()} heap.Push(&le.leaseHeap, item) l.persistTo(le.b) leaseTotalTTLs.Observe(float64(l.ttl)) leaseGranted.Inc() + + if le.isPrimary() { + le.scheduleCheckpointIfNeeded(l) + } + return l, nil } @@ -278,6 +332,21 @@ func (le *lessor) Revoke(id LeaseID) error { return nil } +func (le *lessor) Checkpoint(id LeaseID, remainingTTL int64) error { + le.mu.Lock() + defer le.mu.Unlock() + + if l, ok := le.leaseMap[id]; ok { + // when checkpointing, we only update the remainingTTL, Promote is responsible for applying this to lease expiry + l.remainingTTL = remainingTTL + if le.isPrimary() { + // schedule the next checkpoint as needed + le.scheduleCheckpointIfNeeded(l) + } + } + return nil +} + // Renew renews an existing lease. If the given lease does not exist or // has expired, an error will be returned. func (le *lessor) Renew(id LeaseID) (int64, error) { @@ -316,8 +385,15 @@ func (le *lessor) Renew(id LeaseID) (int64, error) { } } + // Clear remaining TTL when we renew if it is set + // By applying a RAFT entry only when the remainingTTL is already set, we limit the number + // of RAFT entries written per lease to a max of 2 per checkpoint interval. + if le.cp != nil && l.remainingTTL > 0 { + le.cp(context.Background(), &pb.LeaseCheckpointRequest{[]*pb.LeaseCheckpoint{{ID: int64(l.ID), Remaining_TTL: 0}}}) + } + l.refresh(0) - item := &LeaseWithTime{id: l.ID, expiration: l.expiry.UnixNano()} + item := &LeaseWithTime{id: l.ID, time: l.expiry.UnixNano()} heap.Push(&le.leaseHeap, item) leaseRenewed.Inc() @@ -355,7 +431,7 @@ func (le *lessor) Promote(extend time.Duration) { // refresh the expiries of all leases. for _, l := range le.leaseMap { l.refresh(extend) - item := &LeaseWithTime{id: l.ID, expiration: l.expiry.UnixNano()} + item := &LeaseWithTime{id: l.ID, time: l.expiry.UnixNano()} heap.Push(&le.leaseHeap, item) } @@ -393,8 +469,9 @@ func (le *lessor) Promote(extend time.Duration) { delay := time.Duration(rateDelay) nextWindow = baseWindow + delay l.refresh(delay + extend) - item := &LeaseWithTime{id: l.ID, expiration: l.expiry.UnixNano()} + item := &LeaseWithTime{id: l.ID, time: l.expiry.UnixNano()} heap.Push(&le.leaseHeap, item) + le.scheduleCheckpointIfNeeded(l) } } @@ -413,6 +490,8 @@ func (le *lessor) Demote() { l.forever() } + le.clearScheduledLeasesCheckpoints() + if le.demotec != nil { close(le.demotec) le.demotec = nil @@ -491,37 +570,67 @@ func (le *lessor) runLoop() { defer close(le.doneC) for { - var ls []*Lease + le.revokeExpiredLeases() + le.checkpointScheduledLeases() - // rate limit - revokeLimit := leaseRevokeRate / 2 - - le.mu.RLock() - if le.isPrimary() { - ls = le.findExpiredLeases(revokeLimit) - } - le.mu.RUnlock() - - if len(ls) != 0 { - select { - case <-le.stopC: - return - case le.expiredC <- ls: - default: - // the receiver of expiredC is probably busy handling - // other stuff - // let's try this next time after 500ms - } + select { + case <-time.After(500 * time.Millisecond): + case <-le.stopC: + return } + } +} + +// revokeExpiredLeases finds all leases past their expiry and sends them to epxired channel for +// to be revoked. +func (le *lessor) revokeExpiredLeases() { + var ls []*Lease + // rate limit + revokeLimit := leaseRevokeRate / 2 + + le.mu.RLock() + if le.isPrimary() { + ls = le.findExpiredLeases(revokeLimit) + } + le.mu.RUnlock() + + if len(ls) != 0 { select { - case <-time.After(500 * time.Millisecond): case <-le.stopC: return + case le.expiredC <- ls: + default: + // the receiver of expiredC is probably busy handling + // other stuff + // let's try this next time after 500ms } } } +// checkpointScheduledLeases finds all scheduled lease checkpoints that are due and +// submits them to the checkpointer to persist them to the consensus log. +func (le *lessor) checkpointScheduledLeases() { + var cps []*pb.LeaseCheckpoint + + // rate limit + checkpointLimit := leaseCheckpointRate / 2 + + le.mu.Lock() + if le.isPrimary() { + cps = le.findDueScheduledCheckpoints(checkpointLimit) + } + le.mu.Unlock() + + if len(cps) != 0 { + le.cp(context.Background(), &pb.LeaseCheckpointRequest{cps}) + } +} + +func (le *lessor) clearScheduledLeasesCheckpoints() { + le.leaseCheckpointHeap = make(LeaseQueue, 0) +} + // expireExists returns true if expiry items exist. // It pops only when expiry item exists. // "next" is true, to indicate that it may exist in next attempt. @@ -539,7 +648,7 @@ func (le *lessor) expireExists() (l *Lease, ok bool, next bool) { return nil, false, true } - if time.Now().UnixNano() < item.expiration { + if time.Now().UnixNano() < item.time { // Candidate expirations are caught up, reinsert this item // and no need to revoke (nothing is expiry) return l, false, false @@ -580,6 +689,61 @@ func (le *lessor) findExpiredLeases(limit int) []*Lease { return leases } +func (le *lessor) scheduleCheckpointIfNeeded(lease *Lease) { + if le.cp == nil { + return + } + + // checkpointing is best effort + if le.leaseCheckpointHeap.Len() >= maxScheduledCheckpoints { + return + } + + if lease.RemainingTTL() > int64(le.checkpointInterval.Seconds()) { + if le.lg != nil { + le.lg.Debug("Scheduling lease checkpoint", + zap.Int64("leaseID", int64(lease.ID)), + zap.Duration("intervalSeconds", le.checkpointInterval), + ) + } + heap.Push(&le.leaseCheckpointHeap, &LeaseWithTime{ + id: lease.ID, + time: time.Now().Add(le.checkpointInterval).UnixNano(), + }) + } +} + +func (le *lessor) findDueScheduledCheckpoints(checkpointLimit int) []*pb.LeaseCheckpoint { + if le.cp == nil { + return nil + } + + now := time.Now() + cps := []*pb.LeaseCheckpoint{} + for le.leaseCheckpointHeap.Len() > 0 && len(cps) < checkpointLimit { + lt := le.leaseCheckpointHeap[0] + if lt.time > now.UnixNano() { + return cps + } + heap.Pop(&le.leaseCheckpointHeap) + if l, ok := le.leaseMap[lt.id]; ok { + if now.Before(l.expiry) { + remainingTTL := int64(math.Ceil(l.expiry.Sub(now).Seconds())) + if remainingTTL < l.ttl { + if le.lg != nil { + le.lg.Debug("Checkpointing lease", + zap.Int64("leaseID", int64(lt.id)), + zap.Int64("remainingTTL", remainingTTL), + ) + } + cps = append(cps, &pb.LeaseCheckpoint{ID: int64(lt.id), Remaining_TTL: remainingTTL}) + } + } + } + } + return cps +} + func (le *lessor) initAndRecover() { tx := le.b.BatchTx() tx.Lock() @@ -609,14 +773,16 @@ func (le *lessor) initAndRecover() { } } heap.Init(&le.leaseHeap) + heap.Init(&le.leaseCheckpointHeap) tx.Unlock() le.b.ForceCommit() } type Lease struct { - ID LeaseID - ttl int64 // time to live in seconds + ID LeaseID + ttl int64 // time to live of the lease in seconds + remainingTTL int64 // remaining time to live in seconds, if zero valued it is considered unset and the full ttl should be used // expiryMu protects concurrent accesses to expiry expiryMu sync.RWMutex // expiry is time when lease should expire. no expiration when expiry.IsZero() is true @@ -635,7 +801,7 @@ func (l *Lease) expired() bool { func (l *Lease) persistTo(b backend.Backend) { key := int64ToBytes(int64(l.ID)) - lpb := leasepb.Lease{ID: int64(l.ID), TTL: l.ttl} + lpb := leasepb.Lease{ID: int64(l.ID), TTL: l.ttl, RemainingTTL: l.remainingTTL} val, err := lpb.Marshal() if err != nil { panic("failed to marshal lease proto item") @@ -651,9 +817,18 @@ func (l *Lease) TTL() int64 { return l.ttl } +// RemainingTTL returns the last checkpointed remaining TTL of the lease. +// TODO(jpbetz): do not expose this utility method +func (l *Lease) RemainingTTL() int64 { + if l.remainingTTL > 0 { + return l.remainingTTL + } + return l.ttl +} + // refresh refreshes the expiry of the lease. func (l *Lease) refresh(extend time.Duration) { - newExpiry := time.Now().Add(extend + time.Duration(l.ttl)*time.Second) + newExpiry := time.Now().Add(extend + time.Duration(l.RemainingTTL())*time.Second) l.expiryMu.Lock() defer l.expiryMu.Unlock() l.expiry = newExpiry @@ -697,16 +872,25 @@ func int64ToBytes(n int64) []byte { return bytes } +type leaseCheckpoint struct { + id LeaseID + nextCheckpoint *time.Time +} + // FakeLessor is a fake implementation of Lessor interface. // Used for testing only. type FakeLessor struct{} func (fl *FakeLessor) SetRangeDeleter(dr RangeDeleter) {} +func (fl *FakeLessor) SetCheckpointer(cp Checkpointer) {} + func (fl *FakeLessor) Grant(id LeaseID, ttl int64) (*Lease, error) { return nil, nil } func (fl *FakeLessor) Revoke(id LeaseID) error { return nil } +func (fl *FakeLessor) Checkpoint(id LeaseID, remainingTTL int64) error { return nil } + func (fl *FakeLessor) Attach(id LeaseID, items []LeaseItem) error { return nil } func (fl *FakeLessor) GetLease(item LeaseItem) LeaseID { return 0 } diff --git a/lease/lessor_bench_test.go b/lease/lessor_bench_test.go index a3be6aa95b25..dd779b43c10e 100644 --- a/lease/lessor_bench_test.go +++ b/lease/lessor_bench_test.go @@ -19,6 +19,7 @@ import ( "testing" "github.com/coreos/etcd/mvcc/backend" + "go.uber.org/zap" ) func BenchmarkLessorFindExpired1(b *testing.B) { benchmarkLessorFindExpired(1, b) } @@ -54,8 +55,9 @@ func BenchmarkLessorRevoke100000(b *testing.B) { benchmarkLessorRevoke(100000, func BenchmarkLessorRevoke1000000(b *testing.B) { benchmarkLessorRevoke(1000000, b) } func benchmarkLessorFindExpired(size int, b *testing.B) { + lg := zap.NewNop() be, tmpPath := backend.NewDefaultTmpBackend() - le := newLessor(be, minLeaseTTL) + le := newLessor(lg, be, LessorConfig{MinLeaseTTL: minLeaseTTL}) defer le.Stop() defer cleanup(be, tmpPath) le.Promote(0) @@ -71,8 +73,9 @@ func benchmarkLessorFindExpired(size int, b *testing.B) { } func benchmarkLessorGrant(size int, b *testing.B) { + lg := zap.NewNop() be, tmpPath := backend.NewDefaultTmpBackend() - le := newLessor(be, minLeaseTTL) + le := newLessor(lg, be, LessorConfig{MinLeaseTTL: minLeaseTTL}) defer le.Stop() defer cleanup(be, tmpPath) for i := 0; i < size; i++ { @@ -85,8 +88,9 @@ func benchmarkLessorGrant(size int, b *testing.B) { } func benchmarkLessorRevoke(size int, b *testing.B) { + lg := zap.NewNop() be, tmpPath := backend.NewDefaultTmpBackend() - le := newLessor(be, minLeaseTTL) + le := newLessor(lg, be, LessorConfig{MinLeaseTTL: minLeaseTTL}) defer le.Stop() defer cleanup(be, tmpPath) for i := 0; i < size; i++ { @@ -102,8 +106,9 @@ func benchmarkLessorRevoke(size int, b *testing.B) { } func benchmarkLessorRenew(size int, b *testing.B) { + lg := zap.NewNop() be, tmpPath := backend.NewDefaultTmpBackend() - le := newLessor(be, minLeaseTTL) + le := newLessor(lg, be, LessorConfig{MinLeaseTTL: minLeaseTTL}) defer le.Stop() defer cleanup(be, tmpPath) for i := 0; i < size; i++ { diff --git a/lease/lessor_test.go b/lease/lessor_test.go index 3a39e846f729..b034ca0a1494 100644 --- a/lease/lessor_test.go +++ b/lease/lessor_test.go @@ -15,6 +15,7 @@ package lease import ( + "context" "fmt" "io/ioutil" "os" @@ -25,7 +26,9 @@ import ( "testing" "time" + pb "github.com/coreos/etcd/etcdserver/etcdserverpb" "github.com/coreos/etcd/mvcc/backend" + "go.uber.org/zap" ) const ( @@ -37,11 +40,12 @@ const ( // The granted lease should have a unique ID with a term // that is greater than minLeaseTTL. func TestLessorGrant(t *testing.T) { + lg := zap.NewNop() dir, be := NewTestBackend(t) defer os.RemoveAll(dir) defer be.Close() - le := newLessor(be, minLeaseTTL) + le := newLessor(lg, be, LessorConfig{MinLeaseTTL: minLeaseTTL}) defer le.Stop() le.Promote(0) @@ -98,11 +102,12 @@ func TestLessorGrant(t *testing.T) { // TestLeaseConcurrentKeys ensures Lease.Keys method calls are guarded // from concurrent map writes on 'itemSet'. func TestLeaseConcurrentKeys(t *testing.T) { + lg := zap.NewNop() dir, be := NewTestBackend(t) defer os.RemoveAll(dir) defer be.Close() - le := newLessor(be, minLeaseTTL) + le := newLessor(lg, be, LessorConfig{MinLeaseTTL: minLeaseTTL}) defer le.Stop() le.SetRangeDeleter(func() TxnDelete { return newFakeDeleter(be) }) @@ -146,11 +151,12 @@ func TestLeaseConcurrentKeys(t *testing.T) { // the backend. // The revoked lease cannot be got from Lessor again. func TestLessorRevoke(t *testing.T) { + lg := zap.NewNop() dir, be := NewTestBackend(t) defer os.RemoveAll(dir) defer be.Close() - le := newLessor(be, minLeaseTTL) + le := newLessor(lg, be, LessorConfig{MinLeaseTTL: minLeaseTTL}) defer le.Stop() var fd *fakeDeleter le.SetRangeDeleter(func() TxnDelete { @@ -198,11 +204,12 @@ func TestLessorRevoke(t *testing.T) { // TestLessorRenew ensures Lessor can renew an existing lease. func TestLessorRenew(t *testing.T) { + lg := zap.NewNop() dir, be := NewTestBackend(t) defer be.Close() defer os.RemoveAll(dir) - le := newLessor(be, minLeaseTTL) + le := newLessor(lg, be, LessorConfig{MinLeaseTTL: minLeaseTTL}) defer le.Stop() le.Promote(0) @@ -234,12 +241,13 @@ func TestLessorRenew(t *testing.T) { func TestLessorRenewExtendPileup(t *testing.T) { oldRevokeRate := leaseRevokeRate defer func() { leaseRevokeRate = oldRevokeRate }() + lg := zap.NewNop() leaseRevokeRate = 10 dir, be := NewTestBackend(t) defer os.RemoveAll(dir) - le := newLessor(be, minLeaseTTL) + le := newLessor(lg, be, LessorConfig{MinLeaseTTL: minLeaseTTL}) ttl := int64(10) for i := 1; i <= leaseRevokeRate*10; i++ { if _, err := le.Grant(LeaseID(2*i), ttl); err != nil { @@ -258,7 +266,7 @@ func TestLessorRenewExtendPileup(t *testing.T) { bcfg.Path = filepath.Join(dir, "be") be = backend.New(bcfg) defer be.Close() - le = newLessor(be, minLeaseTTL) + le = newLessor(lg, be, LessorConfig{MinLeaseTTL: minLeaseTTL}) defer le.Stop() // extend after recovery should extend expiration on lease pile-up @@ -283,11 +291,12 @@ func TestLessorRenewExtendPileup(t *testing.T) { } func TestLessorDetach(t *testing.T) { + lg := zap.NewNop() dir, be := NewTestBackend(t) defer os.RemoveAll(dir) defer be.Close() - le := newLessor(be, minLeaseTTL) + le := newLessor(lg, be, LessorConfig{MinLeaseTTL: minLeaseTTL}) defer le.Stop() le.SetRangeDeleter(func() TxnDelete { return newFakeDeleter(be) }) @@ -323,11 +332,12 @@ func TestLessorDetach(t *testing.T) { // TestLessorRecover ensures Lessor recovers leases from // persist backend. func TestLessorRecover(t *testing.T) { + lg := zap.NewNop() dir, be := NewTestBackend(t) defer os.RemoveAll(dir) defer be.Close() - le := newLessor(be, minLeaseTTL) + le := newLessor(lg, be, LessorConfig{MinLeaseTTL: minLeaseTTL}) defer le.Stop() l1, err1 := le.Grant(1, 10) l2, err2 := le.Grant(2, 20) @@ -336,7 +346,7 @@ func TestLessorRecover(t *testing.T) { } // Create a new lessor with the same backend - nle := newLessor(be, minLeaseTTL) + nle := newLessor(lg, be, LessorConfig{MinLeaseTTL: minLeaseTTL}) defer nle.Stop() nl1 := nle.Lookup(l1.ID) if nl1 == nil || nl1.ttl != l1.ttl { @@ -350,13 +360,14 @@ func TestLessorRecover(t *testing.T) { } func TestLessorExpire(t *testing.T) { + lg := zap.NewNop() dir, be := NewTestBackend(t) defer os.RemoveAll(dir) defer be.Close() testMinTTL := int64(1) - le := newLessor(be, testMinTTL) + le := newLessor(lg, be, LessorConfig{MinLeaseTTL: testMinTTL}) defer le.Stop() le.Promote(1 * time.Second) @@ -402,13 +413,14 @@ func TestLessorExpire(t *testing.T) { } func TestLessorExpireAndDemote(t *testing.T) { + lg := zap.NewNop() dir, be := NewTestBackend(t) defer os.RemoveAll(dir) defer be.Close() testMinTTL := int64(1) - le := newLessor(be, testMinTTL) + le := newLessor(lg, be, LessorConfig{MinLeaseTTL: testMinTTL}) defer le.Stop() le.Promote(1 * time.Second) @@ -452,11 +464,12 @@ func TestLessorExpireAndDemote(t *testing.T) { } func TestLessorMaxTTL(t *testing.T) { + lg := zap.NewNop() dir, be := NewTestBackend(t) defer os.RemoveAll(dir) defer be.Close() - le := newLessor(be, minLeaseTTL) + le := newLessor(lg, be, LessorConfig{MinLeaseTTL: minLeaseTTL}) defer le.Stop() _, err := le.Grant(1, MaxLeaseTTL+1) @@ -465,6 +478,62 @@ func TestLessorMaxTTL(t *testing.T) { } } +func TestLessorCheckpointScheduling(t *testing.T) { + lg := zap.NewNop() + + dir, be := NewTestBackend(t) + defer os.RemoveAll(dir) + defer be.Close() + + le := newLessor(lg, be, LessorConfig{MinLeaseTTL: minLeaseTTL, CheckpointInterval: 1 * time.Second}) + le.minLeaseTTL = 1 + checkpointedC := make(chan struct{}) + le.SetCheckpointer(func(ctx context.Context, lc *pb.LeaseCheckpointRequest) { + close(checkpointedC) + if len(lc.Checkpoints) != 1 { + t.Errorf("expected 1 checkpoint but got %d", len(lc.Checkpoints)) + } + c := lc.Checkpoints[0] + if c.Remaining_TTL != 1 { + t.Errorf("expected checkpoint to be called with Remaining_TTL=%d but got %d", 1, c.Remaining_TTL) + } + }) + defer le.Stop() + le.Promote(0) + + _, err := le.Grant(1, 2) + if err != nil { + t.Fatal(err) + } + + // TODO: Is there any way to avoid doing this wait? Lease TTL granularity is in seconds. + select { + case <-checkpointedC: + case <-time.After(2 * time.Second): + t.Fatal("expected checkpointer to be called, but it was not") + } +} + +func TestLessorCheckpointsRestoredOnPromote(t *testing.T) { + lg := zap.NewNop() + dir, be := NewTestBackend(t) + defer os.RemoveAll(dir) + defer be.Close() + + le := newLessor(lg, be, LessorConfig{MinLeaseTTL: minLeaseTTL}) + defer le.Stop() + l, err := le.Grant(1, 10) + if err != nil { + t.Fatal(err) + } + le.Checkpoint(l.ID, 5) + le.Promote(0) + remaining := l.Remaining().Seconds() + if !(remaining > 4 && remaining < 5) { + t.Fatalf("expected expiry to be less than 1s in the future, but got %f seconds", remaining) + } +} + type fakeDeleter struct { deleted []string tx backend.BatchTx