Skip to content

daemon: refresh updater after validated binary rollout#21853

Merged
euroelessar merged 1 commit into
mainfrom
ruslan/app-server-daemon-updater-self-refresh
May 11, 2026
Merged

daemon: refresh updater after validated binary rollout#21853
euroelessar merged 1 commit into
mainfrom
ruslan/app-server-daemon-updater-self-refresh

Conversation

@euroelessar
Copy link
Copy Markdown
Collaborator

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

@euroelessar euroelessar marked this pull request as ready for review May 9, 2026 04:23
Copy link
Copy Markdown
Collaborator

@owenlin0 owenlin0 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

btw, it seems like if we somehow get stuck with RestartIfRunningOutcome::NotReady it'd block the updater from refreshing. worth addressing?

also, as a follow up, may be worth adding some way to debug if the auto-updater refresh failed for whatever reason. perhaps logs written to stderr and we can pipe it somewhere on disk

@euroelessar euroelessar force-pushed the ruslan/app-server-daemon-updater-self-refresh branch from ff0bd8d to 669f9df Compare May 11, 2026 18:31
@euroelessar euroelessar force-pushed the ruslan/app-server-daemon-updater-self-refresh branch from 669f9df to ec91ad6 Compare May 11, 2026 19:03
@euroelessar euroelessar merged commit e3f481d into main May 11, 2026
26 checks passed
@euroelessar euroelessar deleted the ruslan/app-server-daemon-updater-self-refresh branch May 11, 2026 19:37
@github-actions github-actions Bot locked and limited conversation to collaborators May 11, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants