rig: drive several RPZ upstreams at once, with churn - #208
Open
johanix wants to merge 1 commit into
Open
Conversation
pop's job is to merge several feeds into one zone with the conflicts resolved,
so a single upstream tests the transport but not the point. Four tests, in
increasing order of how much they can catch:
- two upstreams with distinct names are merged into the union;
- a name carried by BOTH upstreams survives being dropped from one, and goes
away only when the last source carrying it drops it. This is the case a
single feed cannot produce: the removal is real for the source that dropped
it, while the served zone must not change at all;
- sustained churn across three upstreams, converging after every round, and
then the IXFR chain from before the churn must rebuild exactly what AXFR
serves at the end. Convergence alone only says the full-zone view is right;
the chain check says a downstream that saw nothing but deltas ends up in
the same place, and churn from several sources at once is where those two
could plausibly diverge;
- a burst of 40 changes with no pause, then 20 more on top of an unsettled
state, so several land between one poll and the next and sources change
while pop is mid-transfer on another. The claim is only that nothing is
LOST, not that anything is fast.
The churn driver is seeded and records every operation, replayed into the test
log on failure. These bugs depend on the order adds and removals interleave
across sources, so "it failed once" without the sequence is nearly useless.
Expected state is read back from the feeds rather than tracked in parallel: a
model maintained alongside them can drift from what was actually published, and
then the test is checking the model against itself.
Comparisons are exact, not subset. A name that should have gone away but did
not is precisely what this is looking for.
All pass, including under -race, and repeatedly.
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
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.
Rig only — two new files, no pop code. Stacked on #207, which it uses (
IXFR,ApplyIXFR,ZoneBody) and depends on; #207 in turn needs #206. GitHub will retarget this to main automatically once #207 lands.Why
pop's job is to merge several feeds into one zone with the conflicts resolved. A single upstream tests the transport but not the point, and every rig test so far has used exactly one.
The tests, in increasing order of what they can catch
Two upstreams are merged into the union.
A name carried by both upstreams survives removal from one. This is the case a single feed cannot produce: the removal is genuine for the source that dropped it, but the name is still denylisted elsewhere, so the served zone must not change at all — and it must disappear only when the last source carrying it lets go. pop gets both directions right.
Sustained churn across three upstreams, converging after every round, and then the IXFR chain from before the churn must rebuild exactly what AXFR serves at the end:
Both halves are needed. Convergence alone says the full-zone view is right; the chain check says a downstream that saw nothing but deltas ends up in the same place. Churn from several sources at once is where those two could plausibly diverge.
A burst of 40 changes with no pause, then 20 more on top of an unsettled state, so several land between one poll and the next and sources change while pop is mid-transfer on another. The claim is only that nothing is lost, not that anything is fast.
Harness decisions
Seeded, and every operation is recorded and replayed into the test log on failure. These bugs depend on the order adds and removals interleave across sources; "it failed once" without the sequence is nearly useless.
Expected state is read back from the feeds, not tracked in a parallel model. A model maintained alongside them can drift from what was actually published, and then the test is checking the model against itself.
Comparisons are exact, not subset. A name that should have gone away but did not is precisely what this is hunting; a "contains" check would sail straight past it.
Verification
All pass, including under
-race, and three consecutive runs with no flakiness. Full suite green.