benbjohnson/litestream · error

get lock file: %w

Error message

get lock file: %w

What it means

Wraps s3.GetObject failure in the S3 leaser's readLease. Fires when reading the distributed lease lock file fails for reasons other than absence (which maps to os.ErrNotExist), so current lease state cannot be checked during AcquireLease.

Source

Thrown at s3/leaser.go:213

	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) {
			return nil, "", os.ErrNotExist
		}
		return nil, "", fmt.Errorf("get lock file: %w", err)
	}
	defer out.Body.Close()

	var lease litestream.Lease
	if err := json.NewDecoder(out.Body).Decode(&lease); err != nil {
		return nil, "", fmt.Errorf("decode lock file: %w", err)
	}

	etag := ""
	if out.ETag != nil {
		etag = *out.ETag
	}
	lease.ETag = etag

	return &lease, etag, nil
}

func (l *Leaser) writeLease(ctx context.Context, lease *litestream.Lease, etag string) (string, error) {

View on GitHub (pinned to 4ed7a308f6)

Solutions

  1. Verify GetObject permission and bucket access
  2. Retry once S3 is reachable
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at s3/leaser.go:213 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/bfaf064deecb57c2. Report an issue: GitHub.