benbjohnson/litestream · error
open database for follow: %w
Error message
open database for follow: %w
What it means
Wraps file-open failure in Replica.follow at the start of the continuous restore loop. Fires when the restored database file cannot be opened for follow mode (polling and applying new LTX files), aborting continuous restore.
Source
Thrown at replica.go:807
rdrs = nil
maxTXID := infos[len(infos)-1].MaxTXID
if err := WriteTXIDFile(opt.OutputPath, maxTXID); err != nil {
return fmt.Errorf("write initial txid file: %w", err)
}
return r.follow(ctx, opt.OutputPath, maxTXID, opt.FollowInterval)
}
return nil
}
// follow enters a continuous restore loop, polling for new LTX files and
// applying them to the restored database. It blocks until the context is
// cancelled (e.g. Ctrl+C). Returns nil on clean shutdown.
func (r *Replica) follow(ctx context.Context, outputPath string, lastTXID ltx.TXID, interval time.Duration) error {
f, err := os.OpenFile(outputPath, os.O_RDWR, 0)
if err != nil {
return fmt.Errorf("open database for follow: %w", err)
}
defer func() {
_ = f.Sync()
_ = f.Close()
}()
// Read page size from SQLite header (offset 16, 2 bytes, big-endian).
var buf [2]byte
if _, err := f.ReadAt(buf[:], 16); err != nil {
return fmt.Errorf("read page size from database header: %w", err)
}
pageSize := uint32(buf[0])<<8 | uint32(buf[1])
if pageSize == 1 {
pageSize = 65536
}
if interval <= 0 {
interval = DefaultFollowIntervalView on GitHub (pinned to 4ed7a308f6)
Solutions
- Verify the restored file exists and is writable by the litestream process
- Re-run the restore
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at replica.go:807 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/5553b722b1e9cb79.
Report an issue: GitHub.