Three defects the first live daemon run found - #239
Merged
Conversation
The Stage 2 execution tests ran against a real Docker daemon for the first
time, on the Node B deployment. Both failed. Neither was deployment plumbing.
1. The sandbox command wrapper assumed GNU coreutils.
Every agent command was wrapped in `timeout --signal=TERM 30s`. The long
option and the unit suffix are GNU. Against BusyBox -- Alpine, the small
acceptance image -- every command in the sandbox returned 1 with
timeout: unrecognized option: signal=TERM
which reads as the agent's command failing rather than the harness's own
wrapper being unportable. That misattribution is the failure this
repository has paid for most often. `-s TERM` with bare seconds is
accepted by GNU and BusyBox alike.
The existing test asserted `"7s" in exec_call` -- it pinned the GNU
spelling rather than the portability, which is how this shipped.
2. There were two copies of the daemon check, and only one was fixed.
`DockerItemEnvironment.check()` still carried the `--format` template
defect that `DockerEnvironmentFactory.check()` had removed hours earlier:
an unreachable daemon reported a Go reflect error instead of naming the
daemon. Both now share `_diagnosis`/`_server_version`, and a test asserts
the two answer identically so they cannot drift again.
3. `serve` crash-looped instead of coming up degraded.
A local fleet configured with no routes exited 2, so the API and GUI never
came up and the sentence explaining why was visible only to whoever read
container logs -- while the process manager restarted it every 60 seconds.
Three lines away, the missing-reviewer case already argues the opposite:
"Not fatal, and not silent: preflight blocks the start with exactly this
reason, so the fleet may as well exist and say why now." The two now
agree. Nothing unsafe is permitted by starting: preflight still refuses a
project whose roles are not routed, and a fleet with no routes claims
nothing.
All three were invisible to local runs and to CI, because this is the first
environment with a real daemon, a BusyBox sandbox image and a supervisor.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The Stage 2 execution tests ran against a real Docker daemon for the first time, on the Node B deployment. Both failed. Neither was deployment plumbing.
1. The sandbox command wrapper assumed GNU coreutils
Every agent command was wrapped in
timeout --signal=TERM 30s. The long option and the unit suffix are GNU. Against BusyBox — Alpine, the small acceptance image — every command in the sandbox returned 1 withtimeout: unrecognized option: signal=TERM.Read literally that looks like the agent's command failing, not the harness's wrapper being unportable. That misattribution is the failure this repository has paid for most often (#216 blamed the model for four passes).
The existing unit test asserted
"7s" in exec_call— it pinned the GNU spelling rather than the portability, which is exactly how this shipped. It now asserts the portable form, and a second test fails if--signalor a unit suffix returns.2. Two copies of the daemon check, one of them fixed
DockerItemEnvironment.check()still carried the--formattemplate defect thatDockerEnvironmentFactory.check()had removed hours earlier, so an unreachable daemon reported a Go reflect error instead of naming the daemon. Both now share the helpers, with a test that they answer identically.3.
servecrash-looped instead of coming up degradedA local fleet configured with no routes exited 2 — the API and GUI never came up to say why, and the supervisor restarted it every 60 seconds. Three lines away, the missing-reviewer case already argues the opposite: "Not fatal, and not silent: preflight blocks the start with exactly this reason." The two now agree. Nothing unsafe is permitted: preflight still refuses to start a project whose roles are not routed, and a fleet with no routes claims nothing.
All three were invisible to local runs and to CI, because this is the first environment with a real daemon, a BusyBox sandbox image and a supervisor.