mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
lease: remove minExpiry and add helper funcs
This commit is contained in:
parent
2566699a48
commit
12912501bd
@ -33,10 +33,12 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
minLeaseTerm = 5 * time.Second
|
minLeaseTTL = int64(5)
|
||||||
|
|
||||||
leaseBucketName = []byte("lease")
|
leaseBucketName = []byte("lease")
|
||||||
forever = time.Unix(math.MaxInt64, 0)
|
// do not use maxInt64 since it can overflow time which will add
|
||||||
|
// the offset of unix time (1970yr to seconds).
|
||||||
|
forever = time.Unix(math.MaxInt64>>1, 0)
|
||||||
|
|
||||||
ErrNotPrimary = errors.New("not a primary lessor")
|
ErrNotPrimary = errors.New("not a primary lessor")
|
||||||
)
|
)
|
||||||
@ -147,16 +149,19 @@ func newLessor(lessorID uint8, b backend.Backend, dr DeleteableRange) *lessor {
|
|||||||
// 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.
|
||||||
func (le *lessor) Grant(ttl int64) *Lease {
|
func (le *lessor) Grant(ttl int64) *Lease {
|
||||||
// TODO: define max TTL
|
|
||||||
expiry := time.Now().Add(time.Duration(ttl) * time.Second)
|
|
||||||
expiry = minExpiry(time.Now(), expiry)
|
|
||||||
|
|
||||||
id := LeaseID(le.idgen.Next())
|
id := LeaseID(le.idgen.Next())
|
||||||
|
|
||||||
le.mu.Lock()
|
le.mu.Lock()
|
||||||
defer le.mu.Unlock()
|
defer le.mu.Unlock()
|
||||||
|
|
||||||
l := &Lease{ID: id, TTL: ttl, expiry: expiry, itemSet: make(map[leaseItem]struct{})}
|
l := &Lease{ID: id, TTL: ttl, itemSet: make(map[leaseItem]struct{})}
|
||||||
|
|
||||||
|
if le.primary {
|
||||||
|
l.refresh()
|
||||||
|
} else {
|
||||||
|
l.forever()
|
||||||
|
}
|
||||||
|
|
||||||
if _, ok := le.leaseMap[id]; ok {
|
if _, ok := le.leaseMap[id]; ok {
|
||||||
panic("lease: unexpected duplicate ID!")
|
panic("lease: unexpected duplicate ID!")
|
||||||
}
|
}
|
||||||
@ -202,8 +207,7 @@ func (le *lessor) Renew(id LeaseID) error {
|
|||||||
return fmt.Errorf("lease: cannot find lease %x", id)
|
return fmt.Errorf("lease: cannot find lease %x", id)
|
||||||
}
|
}
|
||||||
|
|
||||||
expiry := time.Now().Add(time.Duration(l.TTL) * time.Second)
|
l.refresh()
|
||||||
l.expiry = minExpiry(time.Now(), expiry)
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -215,7 +219,7 @@ func (le *lessor) Promote() {
|
|||||||
|
|
||||||
// refresh the expiries of all leases.
|
// refresh the expiries of all leases.
|
||||||
for _, l := range le.leaseMap {
|
for _, l := range le.leaseMap {
|
||||||
l.expiry = minExpiry(time.Now(), time.Now().Add(time.Duration(l.TTL)*time.Second))
|
l.refresh()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -225,7 +229,7 @@ func (le *lessor) Demote() {
|
|||||||
|
|
||||||
// set the expiries of all leases to forever
|
// set the expiries of all leases to forever
|
||||||
for _, l := range le.leaseMap {
|
for _, l := range le.leaseMap {
|
||||||
l.expiry = forever
|
l.forever()
|
||||||
}
|
}
|
||||||
|
|
||||||
le.primary = false
|
le.primary = false
|
||||||
@ -375,18 +379,24 @@ func (l Lease) removeFrom(b backend.Backend) {
|
|||||||
b.BatchTx().Unlock()
|
b.BatchTx().Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
type leaseItem struct {
|
// refresh refreshes the expiry of the lease. It extends the expiry at least
|
||||||
key string
|
// minLeaseTTL second.
|
||||||
|
func (l *Lease) refresh() {
|
||||||
|
ttl := l.TTL
|
||||||
|
if l.TTL < minLeaseTTL {
|
||||||
|
ttl = minLeaseTTL
|
||||||
|
}
|
||||||
|
|
||||||
|
l.expiry = time.Now().Add(time.Second * time.Duration(ttl))
|
||||||
}
|
}
|
||||||
|
|
||||||
// minExpiry returns a minimal expiry. A minimal expiry is the larger on
|
// forever sets the expiry of lease to be forever.
|
||||||
// between now + minLeaseTerm and the given expectedExpiry.
|
func (l *Lease) forever() {
|
||||||
func minExpiry(now time.Time, expectedExpiry time.Time) time.Time {
|
l.expiry = forever
|
||||||
minExpiry := time.Now().Add(minLeaseTerm)
|
}
|
||||||
if expectedExpiry.Sub(minExpiry) < 0 {
|
|
||||||
expectedExpiry = minExpiry
|
type leaseItem struct {
|
||||||
}
|
key string
|
||||||
return expectedExpiry
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func int64ToBytes(n int64) []byte {
|
func int64ToBytes(n int64) []byte {
|
||||||
|
@ -34,6 +34,7 @@ func TestLessorGrant(t *testing.T) {
|
|||||||
defer be.Close()
|
defer be.Close()
|
||||||
|
|
||||||
le := newLessor(1, be, &fakeDeleteable{})
|
le := newLessor(1, be, &fakeDeleteable{})
|
||||||
|
le.Promote()
|
||||||
|
|
||||||
l := le.Grant(1)
|
l := le.Grant(1)
|
||||||
gl := le.get(l.ID)
|
gl := le.get(l.ID)
|
||||||
@ -41,8 +42,8 @@ func TestLessorGrant(t *testing.T) {
|
|||||||
if !reflect.DeepEqual(gl, l) {
|
if !reflect.DeepEqual(gl, l) {
|
||||||
t.Errorf("lease = %v, want %v", gl, l)
|
t.Errorf("lease = %v, want %v", gl, l)
|
||||||
}
|
}
|
||||||
if l.expiry.Sub(time.Now()) < minLeaseTerm-time.Second {
|
if l.expiry.Sub(time.Now()) < time.Duration(minLeaseTTL)*time.Second-time.Second {
|
||||||
t.Errorf("term = %v, want at least %v", l.expiry.Sub(time.Now()), minLeaseTerm-time.Second)
|
t.Errorf("term = %v, want at least %v", l.expiry.Sub(time.Now()), time.Duration(minLeaseTTL)*time.Second-time.Second)
|
||||||
}
|
}
|
||||||
|
|
||||||
nl := le.Grant(1)
|
nl := le.Grant(1)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user