feat(tools/e2e): add limits harness two-tier topology composer (#381) - #401
Merged
Minipada merged 3 commits intoAug 19, 2026
Merged
Conversation
Brings up N real DC stacks + M synthetic senders behind an aggregating Shipper (a standalone Vector instance) to shared Postgres/RustFS, with each real stack's own local Shipper relaying its Records to the aggregator over Vector's native inter-instance protocol (an ADR-0003 custom_config_files passthrough) instead of writing directly — standing in for #323's motivating scenario, a robot with no direct path to the cloud. Reuses verify_zero_loss.py unmodified; verified end-to-end against a locally built dc-e2e image. Two discoveries recorded in the script/README rather than worked around: Files bypass the two-tier chain entirely (the Uploader writes directly, no Vector hop), and the aggregator's single postgres sink is a shared bottleneck that pushed at-least-once re-delivery past verify_zero_loss.py's zero-tolerance memory-timestamp check under two concurrent real stacks in this sandbox — real_stacks defaults to 1 (still configurable) so the scenario passes reliably on its own, per #381's own "before any ramping logic exists" scope. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AgLSYTiwwZcD1hiVePPWNz Signed-off-by: David Bensoussan <d.bensoussan@proton.me>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AgLSYTiwwZcD1hiVePPWNz Signed-off-by: David Bensoussan <d.bensoussan@proton.me>
…arness-two-tier-topology-compose Signed-off-by: David Bensoussan <d.bensoussan@proton.me> # Conflicts: # progress.txt # tools/e2e/README.md
Minipada
deleted the
feature/381-limits-harness-two-tier-topology-compose
branch
August 19, 2026 20:17
3 tasks
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## jazzy #401 +/- ##
=======================================
Coverage 68.09% 68.09%
=======================================
Files 102 102
Lines 6320 6320
=======================================
Hits 4303 4303
Misses 2017 2017
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:
|
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
tools/e2e/scripts/run_limits_two_tier.sh, a new sibling E2E scenario that brings up a shared Postgres + RustFS, an aggregating Shipper (standalone Vector instance, no dc_bridge/ROS involved), N real DC stacks, and M synthetic senders (scripts/load_driver.py, Limits harness: synthetic load driver (shipper ingest protocol sender) #378) on a dedicated podman bridge network.params/e2e_limits_forward_sink.toml(an ADR-0003custom_config_filespassthrough) relays itsdc.<tag>route branches to the aggregating Shipper over Vector's native inter-instance relay protocol instead, standing in for Limits harness: measure where the pipeline saturates, on four axes #323's motivating scenario (a robot with no direct route to the cloud). The aggregating Shipper's ownpostgressink is the only thing that writes Measurement/synth Records into the realdc_recordstable.verify_zero_loss.pyunmodified, per the acceptance criteria. Verified end-to-end for real against a locally builtdc-e2eimage (rebuiltContainerfile.e2eon the existing cached workspace image — no dc_bridge/measurement_server C++ touched by this ticket):ZERO-LOSS VERIFICATION PASSED (25 sources checked, 0 violations)at default settings.postgressink is a shared bottleneck no single-tier scenario has; two real stacks reliably produced enough at-least-once re-delivery (confirmed genuine repeats, not loss, via direct Postgres queries) to tripverify_zero_loss.py's zero-tolerance memory-timestamp check.DC_E2E_LIMITS_REAL_STACKSstays configurable but defaults to 1 so the scenario passes reliably on its own, per Limits harness: two-tier topology composer (aggregating Shipper stack) #381's "before any ramping logic exists, at a fixed, non-saturating load" scope — finding the actual bottleneck is the ramp controller's job (Limits harness: measure where the pipeline saturates, on four axes #323's next piece).Test plan
prek run --all-files --skip build-doc— all hooks passshellcheck tools/e2e/scripts/run_limits_two_tier.sh— cleandc-e2eimage (default settings):ZERO-LOSS VERIFICATION PASSED (25 sources checked, 0 violations)vector-sink/vector-source relay mechanism standalone against the pinned Vector build before writing any ROS-side configci.yaml(same asrun_retention.sh/run_incident.sh/run_degraded.sh/run_load_driver_shipper_test.sh) — left for a future decision, matching those siblingsCloses #381
🤖 Generated with Claude Code
https://claude.ai/code/session_01AgLSYTiwwZcD1hiVePPWNz