mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
*: enforce max lease TTL with 9,000,000,000 seconds
math.MaxInt64 / time.Second is 9,223,372,036. 9,000,000,000 is easier to remember/document.
This commit is contained in:
parent
4704232cb6
commit
db21941d1d
@ -44,3 +44,6 @@ var (
|
|||||||
// Some options are exposed to "clientv3.Config".
|
// Some options are exposed to "clientv3.Config".
|
||||||
// Defaults will be overridden by the settings in "clientv3.Config".
|
// Defaults will be overridden by the settings in "clientv3.Config".
|
||||||
var defaultCallOpts = []grpc.CallOption{defaultFailFast, defaultMaxCallSendMsgSize, defaultMaxCallRecvMsgSize}
|
var defaultCallOpts = []grpc.CallOption{defaultFailFast, defaultMaxCallSendMsgSize, defaultMaxCallRecvMsgSize}
|
||||||
|
|
||||||
|
// MaxLeaseTTL is the maximum lease TTL value
|
||||||
|
const MaxLeaseTTL = 9000000000
|
@ -31,8 +31,9 @@ var (
|
|||||||
ErrGRPCFutureRev = status.New(codes.OutOfRange, "etcdserver: mvcc: required revision is a future revision").Err()
|
ErrGRPCFutureRev = status.New(codes.OutOfRange, "etcdserver: mvcc: required revision is a future revision").Err()
|
||||||
ErrGRPCNoSpace = status.New(codes.ResourceExhausted, "etcdserver: mvcc: database space exceeded").Err()
|
ErrGRPCNoSpace = status.New(codes.ResourceExhausted, "etcdserver: mvcc: database space exceeded").Err()
|
||||||
|
|
||||||
ErrGRPCLeaseNotFound = status.New(codes.NotFound, "etcdserver: requested lease not found").Err()
|
ErrGRPCLeaseNotFound = status.New(codes.NotFound, "etcdserver: requested lease not found").Err()
|
||||||
ErrGRPCLeaseExist = status.New(codes.FailedPrecondition, "etcdserver: lease already exists").Err()
|
ErrGRPCLeaseExist = status.New(codes.FailedPrecondition, "etcdserver: lease already exists").Err()
|
||||||
|
ErrGRPCLeaseTTLTooLarge = status.New(codes.OutOfRange, "etcdserver: too large lease TTL").Err()
|
||||||
|
|
||||||
ErrGRPCMemberExist = status.New(codes.FailedPrecondition, "etcdserver: member ID already exist").Err()
|
ErrGRPCMemberExist = status.New(codes.FailedPrecondition, "etcdserver: member ID already exist").Err()
|
||||||
ErrGRPCPeerURLExist = status.New(codes.FailedPrecondition, "etcdserver: Peer URLs already exists").Err()
|
ErrGRPCPeerURLExist = status.New(codes.FailedPrecondition, "etcdserver: Peer URLs already exists").Err()
|
||||||
@ -80,8 +81,9 @@ var (
|
|||||||
ErrorDesc(ErrGRPCFutureRev): ErrGRPCFutureRev,
|
ErrorDesc(ErrGRPCFutureRev): ErrGRPCFutureRev,
|
||||||
ErrorDesc(ErrGRPCNoSpace): ErrGRPCNoSpace,
|
ErrorDesc(ErrGRPCNoSpace): ErrGRPCNoSpace,
|
||||||
|
|
||||||
ErrorDesc(ErrGRPCLeaseNotFound): ErrGRPCLeaseNotFound,
|
ErrorDesc(ErrGRPCLeaseNotFound): ErrGRPCLeaseNotFound,
|
||||||
ErrorDesc(ErrGRPCLeaseExist): ErrGRPCLeaseExist,
|
ErrorDesc(ErrGRPCLeaseExist): ErrGRPCLeaseExist,
|
||||||
|
ErrorDesc(ErrGRPCLeaseTTLTooLarge): ErrGRPCLeaseTTLTooLarge,
|
||||||
|
|
||||||
ErrorDesc(ErrGRPCMemberExist): ErrGRPCMemberExist,
|
ErrorDesc(ErrGRPCMemberExist): ErrGRPCMemberExist,
|
||||||
ErrorDesc(ErrGRPCPeerURLExist): ErrGRPCPeerURLExist,
|
ErrorDesc(ErrGRPCPeerURLExist): ErrGRPCPeerURLExist,
|
||||||
@ -131,8 +133,9 @@ var (
|
|||||||
ErrFutureRev = Error(ErrGRPCFutureRev)
|
ErrFutureRev = Error(ErrGRPCFutureRev)
|
||||||
ErrNoSpace = Error(ErrGRPCNoSpace)
|
ErrNoSpace = Error(ErrGRPCNoSpace)
|
||||||
|
|
||||||
ErrLeaseNotFound = Error(ErrGRPCLeaseNotFound)
|
ErrLeaseNotFound = Error(ErrGRPCLeaseNotFound)
|
||||||
ErrLeaseExist = Error(ErrGRPCLeaseExist)
|
ErrLeaseExist = Error(ErrGRPCLeaseExist)
|
||||||
|
ErrLeaseTTLTooLarge = Error(ErrGRPCLeaseTTLTooLarge)
|
||||||
|
|
||||||
ErrMemberExist = Error(ErrGRPCMemberExist)
|
ErrMemberExist = Error(ErrGRPCMemberExist)
|
||||||
ErrPeerURLExist = Error(ErrGRPCPeerURLExist)
|
ErrPeerURLExist = Error(ErrGRPCPeerURLExist)
|
||||||
|
@ -52,8 +52,9 @@ var toGRPCErrorMap = map[error]error{
|
|||||||
etcdserver.ErrKeyNotFound: rpctypes.ErrGRPCKeyNotFound,
|
etcdserver.ErrKeyNotFound: rpctypes.ErrGRPCKeyNotFound,
|
||||||
etcdserver.ErrCorrupt: rpctypes.ErrGRPCCorrupt,
|
etcdserver.ErrCorrupt: rpctypes.ErrGRPCCorrupt,
|
||||||
|
|
||||||
lease.ErrLeaseNotFound: rpctypes.ErrGRPCLeaseNotFound,
|
lease.ErrLeaseNotFound: rpctypes.ErrGRPCLeaseNotFound,
|
||||||
lease.ErrLeaseExists: rpctypes.ErrGRPCLeaseExist,
|
lease.ErrLeaseExists: rpctypes.ErrGRPCLeaseExist,
|
||||||
|
lease.ErrLeaseTTLTooLarge: rpctypes.ErrGRPCLeaseTTLTooLarge,
|
||||||
|
|
||||||
auth.ErrRootUserNotExist: rpctypes.ErrGRPCRootUserNotExist,
|
auth.ErrRootUserNotExist: rpctypes.ErrGRPCRootUserNotExist,
|
||||||
auth.ErrRootRoleNotExist: rpctypes.ErrGRPCRootRoleNotExist,
|
auth.ErrRootRoleNotExist: rpctypes.ErrGRPCRootRoleNotExist,
|
||||||
|
@ -29,6 +29,9 @@ import (
|
|||||||
// NoLease is a special LeaseID representing the absence of a lease.
|
// NoLease is a special LeaseID representing the absence of a lease.
|
||||||
const NoLease = LeaseID(0)
|
const NoLease = LeaseID(0)
|
||||||
|
|
||||||
|
// MaxLeaseTTL is the maximum lease TTL value
|
||||||
|
const MaxLeaseTTL = 9000000000
|
||||||
|
|
||||||
var (
|
var (
|
||||||
forever = time.Time{}
|
forever = time.Time{}
|
||||||
|
|
||||||
@ -37,9 +40,10 @@ var (
|
|||||||
// maximum number of leases to revoke per second; configurable for tests
|
// maximum number of leases to revoke per second; configurable for tests
|
||||||
leaseRevokeRate = 1000
|
leaseRevokeRate = 1000
|
||||||
|
|
||||||
ErrNotPrimary = errors.New("not a primary lessor")
|
ErrNotPrimary = errors.New("not a primary lessor")
|
||||||
ErrLeaseNotFound = errors.New("lease not found")
|
ErrLeaseNotFound = errors.New("lease not found")
|
||||||
ErrLeaseExists = errors.New("lease already exists")
|
ErrLeaseExists = errors.New("lease already exists")
|
||||||
|
ErrLeaseTTLTooLarge = errors.New("too large lease TTL")
|
||||||
)
|
)
|
||||||
|
|
||||||
// TxnDelete is a TxnWrite that only permits deletes. Defined here
|
// TxnDelete is a TxnWrite that only permits deletes. Defined here
|
||||||
@ -198,6 +202,10 @@ func (le *lessor) Grant(id LeaseID, ttl int64) (*Lease, error) {
|
|||||||
return nil, ErrLeaseNotFound
|
return nil, ErrLeaseNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ttl > MaxLeaseTTL {
|
||||||
|
return nil, ErrLeaseTTLTooLarge
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: when lessor is under high load, it should give out lease
|
// TODO: when lessor is under high load, it should give out lease
|
||||||
// with longer TTL to reduce renew load.
|
// with longer TTL to reduce renew load.
|
||||||
l := &Lease{
|
l := &Lease{
|
||||||
|
@ -451,6 +451,20 @@ func TestLessorExpireAndDemote(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestLessorMaxTTL(t *testing.T) {
|
||||||
|
dir, be := NewTestBackend(t)
|
||||||
|
defer os.RemoveAll(dir)
|
||||||
|
defer be.Close()
|
||||||
|
|
||||||
|
le := newLessor(be, minLeaseTTL)
|
||||||
|
defer le.Stop()
|
||||||
|
|
||||||
|
_, err := le.Grant(1, MaxLeaseTTL+1)
|
||||||
|
if err != ErrLeaseTTLTooLarge {
|
||||||
|
t.Fatalf("grant unexpectedly succeeded")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type fakeDeleter struct {
|
type fakeDeleter struct {
|
||||||
deleted []string
|
deleted []string
|
||||||
tx backend.BatchTx
|
tx backend.BatchTx
|
||||||
|
Loading…
x
Reference in New Issue
Block a user