Files
codex/codex-rs/state/migrations/0008_backfill_state.sql
jif-oai 4033f905c6 feat: resumable backfill (#10745)
## Summary

This PR makes SQLite rollout backfill resumable and repeatable instead
of one-shot-on-db-create.

## What changed

- Added a persisted backfill state table:
  - state/migrations/0008_backfill_state.sql
- Tracks status (pending|running|complete), last_watermark, and
last_success_at.
- Added backfill state model/types in codex-state:
  - BackfillState, BackfillStatus (state/src/model/backfill_state.rs)
- Added runtime APIs to manage backfill lifecycle/progress:
  - get_backfill_state
  - mark_backfill_running
  - checkpoint_backfill
  - mark_backfill_complete
- Updated core startup behavior:
- Backfill now runs whenever state is not Complete (not only when DB
file is newly created).
- Reworked backfill execution:
- Collect rollout files, derive deterministic watermark per path, sort,
resume from last_watermark.
- Process in batches (BACKFILL_BATCH_SIZE = 200), checkpoint after each
batch.
  - Mark complete with last_success_at at the end.

## Why

Previous behavior could leave users permanently partially backfilled if
the process exited during initial async backfill. This change allows
safe continuation across restarts and avoids restarting from scratch.
2026-02-05 14:34:34 +00:00

18 lines
398 B
SQL

CREATE TABLE backfill_state (
id INTEGER PRIMARY KEY CHECK (id = 1),
status TEXT NOT NULL,
last_watermark TEXT,
last_success_at INTEGER,
updated_at INTEGER NOT NULL
);
INSERT INTO backfill_state (id, status, last_watermark, last_success_at, updated_at)
VALUES (
1,
'pending',
NULL,
NULL,
CAST(strftime('%s', 'now') AS INTEGER)
)
ON CONFLICT(id) DO NOTHING;