mirror of
https://github.com/openai/codex.git
synced 2026-05-15 08:42:34 +00:00
## Why `bootstrap` starts a detached pid-backed updater loop, but before this change that updater could keep running an old executable image even after `install.sh` replaced the managed standalone binary under `CODEX_HOME`. That left the updater itself behind the binary it had just rolled out, especially when the app-server was stopped or when the managed binary changed without a version-string change. ## What changed - Track updater identity from the executable contents rather than only the reported CLI version. - Force the managed app-server restart path when the managed binary contents differ from the running updater image, then re-exec the updater from the managed binary once the rollout is in a safe state. - Distinguish a genuinely absent managed app-server from a managed process that exists but is not yet probeable, so self-refresh does not skip a required restart. - Keep the restart/re-exec decision under the daemon operation lock so `bootstrap` cannot race the handoff. - Update `app-server-daemon/README.md` to document the resulting standalone and out-of-band update behavior. ## Verification - `cargo test -p codex-app-server-daemon` - `just fix -p codex-app-server-daemon` Added focused unit coverage for: - content-based updater refresh decisions - safe updater re-exec outcomes across restart states
32 lines
867 B
Rust
32 lines
867 B
Rust
use pretty_assertions::assert_eq;
|
|
|
|
use super::update_modes_for_identities;
|
|
use crate::RestartMode;
|
|
use crate::UpdaterRefreshMode;
|
|
use crate::managed_install::executable_identity_from_bytes;
|
|
|
|
#[test]
|
|
fn unchanged_updater_uses_version_based_restart() {
|
|
assert_eq!(
|
|
update_modes_for_identities(
|
|
&executable_identity_from_bytes(b"same"),
|
|
&executable_identity_from_bytes(b"same"),
|
|
),
|
|
(RestartMode::IfVersionChanged, UpdaterRefreshMode::None)
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn changed_updater_forces_refresh_even_when_version_may_match() {
|
|
assert_eq!(
|
|
update_modes_for_identities(
|
|
&executable_identity_from_bytes(b"old"),
|
|
&executable_identity_from_bytes(b"new"),
|
|
),
|
|
(
|
|
RestartMode::Always,
|
|
UpdaterRefreshMode::ReexecIfManagedBinaryChanged,
|
|
)
|
|
);
|
|
}
|