func (le *lessor) initAndRecover() { tx := le.b.BatchTx() tx.Lock() tx.UnsafeCreateBucket(leaseBucketName) _, vs := tx.UnsafeRange(leaseBucketName, int64ToBytes(0), int64ToBytes(math.MaxInt64), 0) // TODO: copy vs and do decoding outside tx lock if lock contention becomes an issue. for i := range vs { var lpb leasepb.Lease err := lpb.Unmarshal(vs[i]) if err != nil { tx.Unlock() panic("failed to unmarshal lease proto item") } ID := LeaseID(lpb.ID) if lpb.TTL < le.minLeaseTTL { lpb.TTL = le.minLeaseTTL } le.leaseMap[ID] = &Lease{ ID: ID, ttl: lpb.TTL, // itemSet will be filled in when recover key-value pairs // set expiry to forever, refresh when promoted itemSet: make(map[LeaseItem]struct{}), expiry: forever, revokec: make(chan struct{}), } } tx.Unlock() le.b.ForceCommit() }