benbjohnson/litestream · error
compaction interval must be greater than 0
Error message
compaction interval must be greater than 0
What it means
Sentinel error ErrInvalidCompactionInterval is returned by Config.Validate when any compaction levels[<i>].interval entry is <= 0. Compaction levels define how L0 LTX files are compacted at higher levels, and each level requires a positive interval. Wrapped in ConfigValidationError with Field "levels[<i>].interval".
Source
Thrown at cmd/litestream/main.go:55
)
// Version is set via -ldflags "-X main.Version=..." on release and Makefile
// builds; otherwise it is resolved from embedded VCS build info at startup.
var Version = defaultVersion
func init() {
bi, _ := debug.ReadBuildInfo()
Version = resolveVersion(Version, bi)
}
// errStop is a terminal error for indicating program should quit.
var errStop = errors.New("stop")
// Sentinel errors for configuration validation
var (
ErrInvalidSnapshotInterval = errors.New("snapshot interval must be greater than 0")
ErrInvalidSnapshotRetention = errors.New("snapshot retention must be greater than 0")
ErrInvalidCompactionInterval = errors.New("compaction interval must be greater than 0")
ErrInvalidSyncInterval = errors.New("sync interval must be greater than 0")
ErrInvalidL0Retention = errors.New("l0 retention must not be negative")
ErrInvalidL0RetentionCheckInterval = errors.New("l0 retention check interval must be greater than 0")
ErrInvalidShutdownSyncTimeout = errors.New("shutdown-sync-timeout must be >= 0")
ErrInvalidShutdownSyncInterval = errors.New("shutdown sync interval must be greater than 0")
ErrInvalidHeartbeatURL = errors.New("heartbeat URL must be a valid HTTP or HTTPS URL")
ErrInvalidHeartbeatInterval = errors.New("heartbeat interval must be at least 1 minute")
ErrConfigFileNotFound = errors.New("config file not found")
)
// ConfigValidationError wraps a validation error with additional context
type ConfigValidationError struct {
Err error
Field string
Value interface{}
}
func (e *ConfigValidationError) Error() string {View on GitHub (pinned to 4ed7a308f6)
Solutions
- Give every levels[i] entry a positive interval (e.g. interval: "1h").
- Remove the empty/zero interval level entry if it is not needed.
- Fix whatever generator/template emitted a zero interval for that level.
Example fix
# before
levels:
- level: 2
interval: 0
# after
levels:
- level: 2
interval: 1h Defensive patterns
Strategy: validation
Validate before calling
for i, lvl := range cfg.Levels {
if lvl.Interval <= 0 {
return fmt.Errorf("levels[%d].interval must be > 0", i)
}
} Try / catch
if err := cfg.Validate(); err != nil {
var ve *main.ConfigValidationError
if errors.As(err, &ve) && errors.Is(ve.Err, main.ErrInvalidCompactionInterval) {
return fmt.Errorf("compaction level invalid: %s=%v", ve.Field, ve.Value)
}
return err
} Prevention
- When adding a levels[] entry, always specify both level and a positive interval.
- Check every element of the levels array, not just the first, after template rendering.
- Test generated configs with cfg.Validate() in unit tests.
When it happens
Trigger: A levels[] array in the config (or per-db levels) containing an entry with interval: 0 or a negative value; loading such a config and running Validate — also asserted in main_test.go via errors.Is(err, ErrInvalidCompactionInterval).
Common situations: Adding a new compaction level and forgetting its interval; templated configs where a level's interval variable is empty/zero; hand-editing YAML/TOML and dropping the value.
Understand the failure class
Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.
Related errors
- snapshot interval must be greater than 0
- snapshot retention must be greater than 0
- sync interval must be greater than 0
- l0 retention must not be negative
- l0 retention check interval must be greater than 0
AI-assisted analysis of benbjohnson/litestream@4ed7a308f6 (2026-09-06).
Data as JSON: /api/errors/6def2dda94e8ce05.
Report an issue: GitHub.