benbjohnson/litestream · error
delete lease: %w
Error message
delete lease: %w
What it means
Leaser.ReleaseLease's DeleteObject (with IfMatch on the lease ETag) failed with an unexpected error — not not-found (already released) and not precondition-failed (not held). Connectivity, credentials, or bucket access problem during release.
Source
Thrown at s3/leaser.go:192
}
if lease.ETag == "" {
return ErrLeaseETagRequired
}
key := l.lockKey()
_, err := l.s3.DeleteObject(ctx, &s3.DeleteObjectInput{
Bucket: aws.String(l.Bucket),
Key: aws.String(key),
IfMatch: aws.String(lease.ETag),
})
if err != nil {
if isNotExists(err) || isNotFoundError(err) {
return ErrLeaseAlreadyReleased
}
if isPreconditionFailed(err) {
return litestream.ErrLeaseNotHeld
}
return fmt.Errorf("delete lease: %w", err)
}
l.logger.Debug("lease released",
"generation", lease.Generation,
"owner", lease.Owner)
return nil
}
func (l *Leaser) readLease(ctx context.Context) (*litestream.Lease, string, error) {
key := l.lockKey()
out, err := l.s3.GetObject(ctx, &s3.GetObjectInput{
Bucket: aws.String(l.Bucket),
Key: aws.String(key),
})
if err != nil {
if isNotExists(err) || isNotFoundError(err) {View on GitHub (pinned to 4ed7a308f6)
Solutions
- Check S3 delete permissions on the lease key
- Retry release after the backend error clears; the lease will expire on its TTL otherwise
Defensive patterns
Strategy: retry
When it happens
Trigger: Thrown at s3/leaser.go:192 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of benbjohnson/litestream@4ed7a308f6 (2026-09-06).
Data as JSON: /api/errors/4bf260bc687d2cf0.
Report an issue: GitHub.