mirror of
https://github.com/openai/codex.git
synced 2026-05-05 03:47:01 +00:00
fix(sqlite): don't hard fail migrator if DB is newer (#16924)
## Description This PR makes the SQLite state runtime tolerate databases that have already been migrated by a newer Codex binary. Today, if an older CLI sees migration versions in `_sqlx_migrations` that it doesn't know about, startup fails. This change relaxes that check for the runtime migrators we use in `codex-state` so older binaries can keep opening the DB in that case. ## Why We can end up with mixed-version CLIs running against the same local state DB. In that setup, treating "the database is ahead of me" as a hard error is unnecessarily strict and breaks the older client even when the migration history is otherwise fine. ## Follow-up We still clean up versioned `state_*.sqlite` and `logs_*.sqlite` files during init, so older binaries can treat newer DB files as legacy. That should probably be tightened separately if we want mixed-version local usage to be fully safe.
This commit is contained in:
@@ -1,4 +1,29 @@
|
||||
use std::borrow::Cow;
|
||||
|
||||
use sqlx::migrate::Migrator;
|
||||
|
||||
pub(crate) static STATE_MIGRATOR: Migrator = sqlx::migrate!("./migrations");
|
||||
pub(crate) static LOGS_MIGRATOR: Migrator = sqlx::migrate!("./logs_migrations");
|
||||
|
||||
/// Allow an older Codex binary to open a database that has already been
|
||||
/// migrated by a newer binary running in parallel.
|
||||
///
|
||||
/// We intentionally ignore applied migration versions that are newer than the
|
||||
/// embedded migration set. Known migration versions are still validated by
|
||||
/// checksum, so this only relaxes the "database is ahead of me" case.
|
||||
fn runtime_migrator(base: &'static Migrator) -> Migrator {
|
||||
Migrator {
|
||||
migrations: Cow::Borrowed(base.migrations.as_ref()),
|
||||
ignore_missing: true,
|
||||
locking: base.locking,
|
||||
no_tx: base.no_tx,
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn runtime_state_migrator() -> Migrator {
|
||||
runtime_migrator(&STATE_MIGRATOR)
|
||||
}
|
||||
|
||||
pub(crate) fn runtime_logs_migrator() -> Migrator {
|
||||
runtime_migrator(&LOGS_MIGRATOR)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user