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

  1. Check S3 delete permissions on the lease key
  2. 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.