Skip to content

test(compat): add ceralive-srtla-send-rs blocking pair; docs: ADR-003 Rust sender adoption - #27

Merged
andrescera merged 1 commit into
mainfrom
test/compat-srtla-send-rs
Jun 13, 2026
Merged

test(compat): add ceralive-srtla-send-rs blocking pair; docs: ADR-003 Rust sender adoption#27
andrescera merged 1 commit into
mainfrom
test/compat-srtla-send-rs

Conversation

@andrescera

Copy link
Copy Markdown
Member

Affected repo & language: srtla — Bash (compat harness/scenarios), YAML/Python (matrix registry), Markdown (docs/ADR)

What

Registers the CERALIVE Rust fork (srtla-send-rs, the ADR-003 cutover sender) as a blocking compatibility pair against our C srtla_rec, and commits ADR-003. The compat harness gains a forkbin sender kind that runs the fork's pre-built release binary (resolved from SRTLA_SEND_RS_BIN, or a srtla_send_rs on PATH). The five behavioral scenarios are made sender-agnostic so the same assertions validate both the C sender and the Rust fork.

Why

ADR-003 adopts the Rust fork as the shipping srtla_send via direct cutover. The cutover gate requires the fork to pass the blocking compat matrix against the C receiver, and the failure/stress scenarios must keep working once the C sender is retired from the .deb. The fork uses different log wording than the C sender and is silent without RUST_LOG, so the scenarios had to learn both vocabularies without weakening any pass criterion.

How to verify

  • cmake -B build -DBUILD_COMPAT_TESTS=ON && cmake --build build -j
  • Fetch the fork binary: gh release download v1.0.0 -R CERALIVE/srtla-send-rs --pattern "*amd64*.deb", verify SHA256 803f0ed4…, extract /usr/bin/srtla_send.
  • SRTLA_SEND_RS_BIN=<that binary> bash tests/compat/run-matrix.sh --tier blocking → all 7 pairs PASS (incl. ceralive-send-rsxours).
  • Falsifiable: SRTLA_SEND_RS_BIN=… bash tests/compat/run-matrix.sh --pair ceralive-send-rsxours --scenario port-mismatch → FAIL (exit 1).
  • Scenarios vs the fork (point --build-dir at a dir whose srtla_send is the fork): receiver-restart, sighup-reload, link-drop, reorder-stress PASS.
  • python3 tests/compat/validate-matrix.py → PASS (7 blocking pairs). ctest --test-dir build → 178/178 green.

Risks

  • The Rust fork emits no logs unless RUST_LOG is set; each scenario's sender launch prefixes RUST_LOG="${RUST_LOG:-info}" (a no-op for the C sender). Removing that prefix would blind the scenario greps to the fork.
  • jitter-stress's privileged netns/netem path is environment-sensitive and does not validate cleanly on every host for either sender (the C baseline also fails it on the QA host: no second link / zero throughput). Its 0-reaps criterion was left unrelaxed; the fork additionally exhibits socket-reconnection churn under ±200 ms jitter while keeping the bonded stream healthy (both links registered, disconnects==0). Tracked as a follow-up, not a cutover blocker.
  • The matrix entry pins the fork by release tag/commit + .deb SHA256 (package Version is 3.0.0 from the upstream Cargo.toml); pin by SHA/commit, not version.

Checklist

  • Docs updated (Rule A): AGENTS.md COMPAT section, docs/COMPATIBILITY.md ecosystem table, ADR-003 committed
  • Started from updated main; branched off origin/main (Rule B)
  • git grep -n '.omo' -- ':!.gitignore' returns nothing (Rule D)
  • Tests pass; QA evidence captured (blocking matrix 7/7, falsifiability FAIL, ctest 178/178)

… Rust sender adoption

Register the CERALIVE Rust fork (srtla-send-rs, ADR-003 cutover sender) as a
blocking compat pair against our C srtla_rec, and commit ADR-003.

matrix.yaml: new sender entry pinned to the v1.0.0 release tag (commit b867c7d)
with both-arch .deb SHA256s. It is a release-artifact pin (no Dockerfile), so it
carries no 'build:' key; gen-ci-matrix.sh --images skips it by design while
--pairs includes it. validate-matrix.py's blocking-pair count moves 6 -> 7.

run-matrix.sh: a new 'forkbin' sender kind resolves the pre-built binary from
SRTLA_SEND_RS_BIN (or a srtla_send_rs on PATH) and runs it like a local sender;
absent, the pair SKIPs like a missing Docker image. Mirrors the SRTLA_BUILD_DIR
override convention for 'ours'.

scenarios: made sender-agnostic so the same behavioral assertions validate both
the C sender and the Rust fork. The fork logs different wording and is silent
without RUST_LOG, so each sender launch now prefixes RUST_LOG=${RUST_LOG:-info}
(a no-op for the C sender) and the join/link-fail greps accept both vocabularies
(e.g. 'Added connection via IP' | 'added uplink ... via IP'; 'connection failed'
| 'timed out; attempting full socket reconnection'). Pass criteria are unchanged
-- the C sender still matches via the first alternative.

Verify: tests/compat/run-matrix.sh --tier blocking passes all 7 pairs incl. the
fork; --pair ceralive-send-rsxours --scenario port-mismatch still FAILS
(falsifiable); ctest is green (178/178).

Risks: the fork is silent without RUST_LOG -- removing the env prefix would blind
the scenario greps to it. jitter-stress's privileged netns path is environment-
sensitive and currently does not validate on every host for either sender.
@andrescera
andrescera merged commit eca1685 into main Jun 13, 2026
9 checks passed
@andrescera
andrescera deleted the test/compat-srtla-send-rs branch July 17, 2026 17:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant