Env: gortex v0.61.0, Windows 11 Pro, during a long gortex init bulk index.
Observed
Every other 5-minute tick while the bulk indexer is writing:
2026/07/21 07:56:32 store_sqlite: wal checkpoint incomplete mode=PASSIVE busy=0 wal_frames=0 checkpointed_frames=0 error="context deadline exceeded"
2026/07/21 08:06:31 store_sqlite: wal checkpoint incomplete mode=PASSIVE busy=0 wal_frames=0 checkpointed_frames=0 error="context deadline exceeded"
Analysis (internal/graph/store_sqlite/store.go)
walCheckpointInterval = 5 * time.Minute, walPassiveCheckpointTimeout = 1 * time.Second (store.go:522–531).
- The periodic path is documented as best-effort with a non-blocking gate; the 1s context "only protects an unexpected writer-pool wait or a slow driver call".
- During a bulk index the writer pool is occupied ~continuously, so the 1s context expires before the PRAGMA ever runs — which is why every stat in the log line is zero (
busy=0 wal_frames=0 checkpointed_frames=0): they're the zero-value result struct, not measurements.
So the message reads like a checkpoint that ran and failed ("incomplete"), when it actually never started. Functionally benign (the WAL is checkpointed later), but it's exactly the kind of line a user pastes into a bug report.
Suggestion
- When the context expires during acquisition (before the PRAGMA), log at debug as
wal checkpoint skipped: writer busy (or once per bulk phase), reserving the current warning for a checkpoint that genuinely ran and returned an error / left frames behind.
- Alternatively suppress the periodic warning entirely while a bulk/import phase is active.
Env: gortex
v0.61.0, Windows 11 Pro, during a longgortex initbulk index.Observed
Every other 5-minute tick while the bulk indexer is writing:
Analysis (internal/graph/store_sqlite/store.go)
walCheckpointInterval = 5 * time.Minute,walPassiveCheckpointTimeout = 1 * time.Second(store.go:522–531).busy=0 wal_frames=0 checkpointed_frames=0): they're the zero-value result struct, not measurements.So the message reads like a checkpoint that ran and failed ("incomplete"), when it actually never started. Functionally benign (the WAL is checkpointed later), but it's exactly the kind of line a user pastes into a bug report.
Suggestion
wal checkpoint skipped: writer busy(or once per bulk phase), reserving the current warning for a checkpoint that genuinely ran and returned an error / left frames behind.