feat(e2e): three-container robot topology with dc-uploader as its own container - #460
Merged
Minipada merged 1 commit intoSep 1, 2026
Merged
Conversation
… container Completes #440's split-deployment scenario 2: dc-ros, vector and dc-uploader now run as three separate Compose-managed containers. - compose.split.yaml gains a dc-uploader service running the same image as dc-ros under a dedicated entrypoint (entrypoint_uploader.sh), configured entirely by DC_UPLOADER_* env vars — no ROS params, no depends_on with either sibling container. dc-ros launches with the new run_uploader:=false argument (dc_bringup.launch.py) so it no longer spawns its own dc_uploader subprocess. - Volumes stay scoped to their owner: the intent queue and Files volume is shared between dc-ros and dc-uploader only; the config/buffer volumes stay scoped to dc-ros/vector as before. Object-storage credentials live only in dc-uploader's environment — e2e_split_params.yaml's rustfs destination no longer carries them, so they never reach the ROS container. - dc_bridge gains shipper.bind_host, decoupling the address Vector's fluent source binds to from vector_forward_host (where the Bridge connects). Found while getting the harness to actually run: Vector's fluent source rejects a hostname for its own listen address, so reusing vector_forward_host for both roles (fine when both are localhost) breaks once the Shipper listens inside its own container. Defaults to vector_forward_host, so every deployment that doesn't set it is unchanged. - run_split.sh fixes two more pre-existing bugs that blocked it from ever completing a real run: the RustFS reachability probe needs --entrypoint python3 (without it, dc-e2e's own ENTRYPOINT swallows the probe args and the container always exits non-zero), and the bucket-creation step needs the compose service name ("rustfs"), not the container_name, since aws-cli rejects the latter's underscores as an invalid endpoint hostname. It also now starts dc-uploader alongside dc-ros and restarts it independently in steady state, proving #447's per-container restart requirement without adding restart-timing jitter to the outage window's zero-loss measurement. Verified end to end: full workspace rebuild, colcon test (0 failures), and three consecutive run_split.sh runs against the built image, the last two passing zero-loss cleanly. Closes #447 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NXoTNC1SzLuMNpfduKrSGA Signed-off-by: David Bensoussan <d.bensoussan@proton.me>
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## jazzy #460 +/- ##
==========================================
+ Coverage 71.45% 71.46% +0.01%
==========================================
Files 124 124
Lines 7562 7563 +1
==========================================
+ Hits 5403 5404 +1
Misses 2159 2159
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
github-actions
Bot
deleted the
feature/447-three-container-robot-topology-with-the
branch
September 1, 2026 05:41
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.
Summary
Completes #440's split-deployment scenario 2 (the last of the three components):
dc-ros,vectoranddc-uploadernow run as three separate Compose-managed containers, building on #445 (dc-ros + vector split) and #446 (dc_uploader extracted into its own process).compose.split.yamlgains adc-uploaderservice running the same image asdc-rosunder a dedicated entrypoint (entrypoint_uploader.sh, which execs the installeddc_uploaderbinary directly — noros2 launch), configured entirely byDC_UPLOADER_*environment variables. Nodepends_onwith either sibling container.dc-roslaunches with a newrun_uploader:=falselaunch argument (dc_bringup.launch.py) so it no longer also spawns its owndc_uploadersubprocess.dc-ros(writer) anddc-uploader(reader) only; the rendered-config and buffer volumes stay scoped todc-ros/vectoras before, untouched bydc-uploader.dc-uploader's environment.e2e_split_params.yaml'srustfsdestination no longer carriesaccess_key_id/secret_access_keyat all — the Bridge only needs the bucket name to write upload intents, never the keys — so those credentials never reach the ROS container.dc_bridgegainsshipper.bind_host, decoupling the address Vector'sfluentsource binds to fromvector_forward_host(where the Bridge itself connects). Found while getting the harness to actually run: Vector'sfluentsource rejects a hostname for its own listen address ("data did not match any variant of untagged enum FluentModeDe"), so reusingvector_forward_hostfor both roles — fine when both are127.0.0.1— breaks once the Shipper listens inside its own container reached by DNS name. Defaults tovector_forward_host, so every deployment that doesn't set it is unchanged.run_split.shfixes two more pre-existing bugs that blocked it from ever completing a real run (neither ever exercised before —run_split.sh's own full execution was left unchecked in Two-container split: ROS stack and Shipper under Compose #445's test plan): the RustFS reachability probe needs--entrypoint python3(without it,dc-e2e's ownENTRYPOINTswallows the probe args as extraros2 launcharguments and the container always exits non-zero, regardless of RustFS's actual reachability), and the bucket-creation step needs the compose service name (rustfs), not thecontainer_name, sinceaws-cli's endpoint validation rejects the latter's underscores as an invalid hostname. It also now startsdc-uploaderalongsidedc-rosand restarts it independently in steady state, directly exercising Three-container robot topology with the Uploader as its own container #447's per-container restart requirement — placed in steady state rather than layered onto the outage/dc-ros-restart window, since restarting two containers back to back was found to add enough jitter to the DDS→Shipper handoff to occasionally cost a Record outside the harness's per-restart kill-point tolerance.Test plan
prek run --all-files --skip build-doc— all hooks passbash -n+shellcheckclean on the touched/new shell scriptscompose.split.yaml/e2e_split_params.yamlparse as valid YAMLcolcon test: 0 failures (TEST_RESULT=0)tools/e2e/scripts/run_split.shexecuted end to end against the built image, three times: the first surfaced the two pre-existing harness bugs above (fixed), the second surfaced real record loss from the double-restart timing (fixed by decoupling the restarts), the last two passed cleanly —ZERO-LOSS VERIFICATION PASSED (22 sources checked, 0 violations)Closes #447