Skip to content

Fix engine state corruption on rollback timeout during initial boot#239

Merged
thiagoesteves merged 1 commit into
mainfrom
fix/engine-rollback-nil-deployment
Jul 8, 2026
Merged

Fix engine state corruption on rollback timeout during initial boot#239
thiagoesteves merged 1 commit into
mainfrom
fix/engine-rollback-nil-deployment

Conversation

@thiagoesteves

@thiagoesteves thiagoesteves commented Jul 7, 2026

Copy link
Copy Markdown
Owner

When the engine worker initializes with an already installed application, initialize_version arms the rollback timer without setting deployment_to_terminate (that field is only set by full deployments). If the application failed to report running within the rollback timeout, the timeout handler restored the current instance with nil, and the next schedule tick crashed the engine worker when accessing the deployment state, leading to a supervisor restart loop.

The rollback now falls back to an empty deployment when there is no previous deployment to return to, keeping the engine alive after ghosting the version.

Risk assessment:

  • Impact: the engine worker survives a rollback of the very first deployment after a DeployEx restart. The version is still ghosted and the node is still stopped, as before.
  • Blast radius: the :timeout_rollback handler in Deployer.Engine.Worker. Rollbacks of regular full deployments keep the exact same behavior since deployment_to_terminate is always set on that path.
  • Regression risk: low. The new fallback only triggers where the code previously crashed.
  • Rollback: revert this commit.

Co-Authored-By: Claude Fable 5 noreply@anthropic.com

When the engine worker initializes with an already installed application,
initialize_version arms the rollback timer without setting
deployment_to_terminate (that field is only set by full deployments). If
the application failed to report running within the rollback timeout, the
timeout handler restored the current instance with nil, and the next
schedule tick crashed the engine worker when accessing the deployment
state, leading to a supervisor restart loop.

The rollback now falls back to an empty deployment when there is no
previous deployment to return to, keeping the engine alive after
ghosting the version.

Risk assessment:
- Impact: the engine worker survives a rollback of the very first
  deployment after a DeployEx restart. The version is still ghosted and
  the node is still stopped, as before.
- Blast radius: the :timeout_rollback handler in Deployer.Engine.Worker.
  Rollbacks of regular full deployments keep the exact same behavior
  since deployment_to_terminate is always set on that path.
- Regression risk: low. The new fallback only triggers where the code
  previously crashed.
- Rollback: revert this commit.
@thiagoesteves thiagoesteves self-assigned this Jul 7, 2026
@thiagoesteves thiagoesteves moved this to In Progress in DeployEx Project Jul 7, 2026
@thiagoesteves thiagoesteves marked this pull request as ready for review July 8, 2026 11:38
@thiagoesteves thiagoesteves merged commit feb51fd into main Jul 8, 2026
3 checks passed
@thiagoesteves thiagoesteves deleted the fix/engine-rollback-nil-deployment branch July 8, 2026 11:38
@github-project-automation github-project-automation Bot moved this from In Progress to Done in DeployEx Project Jul 8, 2026
thiagoesteves added a commit that referenced this pull request Jul 8, 2026
…guide (#244)

* Update changelog with 0.9.5 entries and document changelog maintenance

Add the missing 0.9.5 entries for the merged PRs: #239, #240, #241 and
#242 as bug fixes, and #237 (CloudWatch log group retention) as an
enhancement. Document the changelog maintenance rules in AGENTS.md so
agents know how to add entries, and remove the outdated note that said
the changelog must not be edited manually.

Risk assessment:
- Impact: documentation only, no runtime behavior changes.
- Blast radius: CHANGELOG.md and AGENTS.md.
- Regression risk: none, docs-only diff.
- Rollback: revert this commit.

* Updated changelog
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

1 participant