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) 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, } } tx.Unlock() le.b.ForceCommit() }
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) le.leaseMap[id] = &lease{ id: id, ttl: lpb.TTL, // itemSet will be filled in when recover key-value pairs expiry: minExpiry(time.Now(), time.Now().Add(time.Second*time.Duration(lpb.TTL))), } } tx.Unlock() le.b.ForceCommit() }
func (l Lease) persistTo(b backend.Backend) { key := int64ToBytes(int64(l.ID)) lpb := leasepb.Lease{ID: int64(l.ID), TTL: int64(l.TTL)} val, err := lpb.Marshal() if err != nil { panic("failed to marshal lease proto item") } b.BatchTx().Lock() b.BatchTx().UnsafePut(leaseBucketName, key, val) b.BatchTx().Unlock() }