benbjohnson/litestream · error
enforce retention for %s: %w
Error message
enforce retention for %s: %w
What it means
ReplicateCommand.runOnce failed to enforce snapshot retention (Store.EnforceSnapshotRetention) with -enforce-retention. The retention pass lists and deletes old LTX files on the replica; failure is a backend list/delete error or corrupted replica state.
Source
Thrown at cmd/litestream/replicate.go:426
if err = db.Replica.Sync(ctx); err != nil {
err = fmt.Errorf("sync replica for %s: %w", db.Path(), err)
return
}
// Force a snapshot if requested.
if c.forceSnapshot {
slog.Info("taking snapshot", "path", db.Path())
if _, err = db.Snapshot(ctx); err != nil {
err = fmt.Errorf("snapshot %s: %w", db.Path(), err)
return
}
}
// Enforce retention if requested.
if c.enforceRetention {
slog.Info("enforcing retention", "path", db.Path())
if err = c.Store.EnforceSnapshotRetention(ctx, db); err != nil {
err = fmt.Errorf("enforce retention for %s: %w", db.Path(), err)
return
}
}
}
slog.Info("one-shot replication complete")
}
// Close closes all open databases.
func (c *ReplicateCommand) Close(ctx context.Context) error {
for _, monitor := range c.directoryMonitors {
monitor.Close()
}
c.directoryMonitors = nil
if c.Server != nil {
if err := c.Server.Close(); err != nil {
slog.Error("error closing control server", "error", err)View on GitHub (pinned to 4ed7a308f6)
Solutions
- Check the wrapped backend error for list/delete permission issues
- Verify retention configuration values are sane
- Retry the replicate run
Defensive patterns
Strategy: retry
When it happens
Trigger: Thrown at cmd/litestream/replicate.go:426 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/22eb329b820ddc92.
Report an issue: GitHub.