MCPcopy
hub / github.com/benbjohnson/litestream / AcquireLease

Method AcquireLease

s3/leaser.go:90–136  ·  view source on GitHub ↗
(ctx context.Context)

Source from the content-addressed store, hash-verified

88}
89
90func (l *Leaser) AcquireLease(ctx context.Context) (*litestream.Lease, error) {
91 existing, etag, err := l.readLease(ctx)
92 if err != nil && !errors.Is(err, os.ErrNotExist) {
93 return nil, fmt.Errorf("read existing lease: %w", err)
94 }
95
96 if existing != nil && !existing.IsExpired() {
97 return nil, &litestream.LeaseExistsError{
98 Owner: existing.Owner,
99 ExpiresAt: existing.ExpiresAt,
100 }
101 }
102
103 var generation int64 = 1
104 if existing != nil {
105 generation = existing.Generation + 1
106 }
107
108 newLease := &litestream.Lease{
109 Generation: generation,
110 ExpiresAt: time.Now().Add(l.TTL),
111 Owner: l.Owner,
112 }
113
114 newETag, err := l.writeLease(ctx, newLease, etag)
115 if err != nil {
116 var leaseErr *litestream.LeaseExistsError
117 if errors.As(err, &leaseErr) {
118 if current, _, readErr := l.readLease(ctx); readErr == nil && current != nil {
119 return nil, &litestream.LeaseExistsError{
120 Owner: current.Owner,
121 ExpiresAt: current.ExpiresAt,
122 }
123 }
124 }
125 return nil, err
126 }
127
128 newLease.ETag = newETag
129 l.logger.Debug("lease acquired",
130 "generation", newLease.Generation,
131 "owner", newLease.Owner,
132 "expires_at", newLease.ExpiresAt,
133 "etag", newLease.ETag)
134
135 return newLease, nil
136}
137
138func (l *Leaser) RenewLease(ctx context.Context, lease *litestream.Lease) (*litestream.Lease, error) {
139 if lease == nil {

Callers

nothing calls this directly

Implementers 1

Leasers3/leaser.go

Calls 4

readLeaseMethod · 0.95
writeLeaseMethod · 0.95
IsMethod · 0.80
IsExpiredMethod · 0.80

Tested by

no test coverage detected