Skip to content

fix(core): close the retry-queue orphan window by confirming shard residency after the add - #437

Merged
astubbs merged 8 commits into
masterfrom
fix/retry-queue-requeue-orphan-window
Sep 7, 2026
Merged

astubbs merged 8 commits into
masterfrom
fix/retry-queue-requeue-orphan-window

Conversation

@astubbs

@astubbs astubbs commented Sep 3, 2026 •

Copy link
Copy Markdown
Owner

No fork issue exists for this defect. It was raised as a Codex P1 during review of #431, verified there as real and pre-existing, and left for its owner with that review thread deliberately open.

Description

WorkManager.onFailureResult re-validates staleness against the LIVE partition map immediately before sm.onFailure(wc), and its own comment said that no epoch check placed there can ever be atomic with the actions that follow. A rebalance completing in that gap on the broker-poll thread left a queue-only orphan: the revoke sweep removed the container from its shard and then from the retry queue, finding nothing there yet, and the controller then added it. Under PARTITION or UNORDERED ordering the emptied shard object survives - only KEY ordering garbage-collects one - so the shard-present guard passed.

What it costs a user. Work is handed out by scanning shards, so that container is never selected, never completed and never swept. Once its retry delay elapses the entry survives the flooring in getNumberOfWorkQueuedInShardsAwaitingSelection on a drained pipeline, so isRecordsAwaitingProcessing() reads true, AbstractParallelEoSStreamProcessor.drain() never transitions to closing, and a draining close hangs to its timeout on an instance with no work in it.

The bound is the partition's absence, not the instance's lifetime - corrected in 48d193dfe after the same over-claim was caught on the displacement sibling. RetryQueue keys by topic, partition and offset, never by container identity, and ShardManager.onSuccess removes by that key unconditionally, as its first statement, before it looks up any shard - so it is a removal route that does not go through shard contents, and any later container at those coordinates clears the entry. The orphan is created by a revocation, so none arrives until that partition is reassigned here. What makes the consequence hold regardless is that a draining close is exactly the window in which no reassignment can occur.

Reachability was established, not assumed. RetryQueueRequeueWindowTest drives the interleave deterministically - RequeueWindowWorkManager overrides the live epoch check, computes the real answer, then runs the full production revoke path before returning it. Every arm asserts two preconditions (the race fired, and the check answered not stale), so an arm that stops exercising the window fails rather than passing vacuously. Predictions were stated before the run and all held. Against unmodified master, 3 of 6 arms are red: the two window arms and the drain arm.

The recorded consequence was wrong, and is corrected here

Both the comment at onFailureResult and the in-flight note raised on #431 said the harm was the broker-poller load gate being misled via ShardManager.getWorkableRecords() - a confluentinc#857-family stall. Measured, that does not hold in either half:

  • Not permanent. parkedForRetry is queueSize - readyToRetry, so the orphan contributes only while its retry delay is still running; once it passes, the orphan counts in both terms and the contribution is exactly zero.
  • Not the stall direction. While the contribution is non-zero it makes workable read LOW, so isSufficientlyLoaded() reads false and the consumer fetches MORE.

RetryQueueRequeueWindowTest#aQueueOnlyOrphanCostsTheDrainFigureAndNotTheLoadGate measures both halves against an orphan built directly, so it stays checked whether or not the window is open, and the false claim cannot be re-derived.

The fix, and why the obvious ones were rejected

A residency test before the add only narrows the window - it is another check-then-act, and the sweep lands between that answer and the add exactly as it lands between the epoch check and the call. That is what made this a note rather than a patch.

ShardManager.onFailure now adds to the retry queue and then confirms the container is still resident in its shard, undoing the add if it is not. The last action is a removal driven by a read taken after the add, and the competing sweep's own action is also a removal, so at least one of the two always observes the entry. All four interleavings settle with the pair whole; the argument is on the method. Residency is by reference, so once the read sees a departed container the answer cannot go stale in the dangerous direction. This is the shape ProcessingShard.includeInSelection already used for the selection claim, and the predicate is now shared as ProcessingShard.isResident.

It does NOT collide with what #431 established

That PR establishes that the rebalance callbacks may not wait on the retry queue's lock - they run on the broker-poll thread inside consumer.poll(), where the whole group waits - and makes them decline the lock rather than block on it. The textbook fix here, moving the shard map and the queue under one lock, would reverse that decision, because it puts the poll thread's revoke path behind the retry queue's fair lock. This change adds no lock and makes no thread wait, and touches nothing on the poll thread's side of the interleaving; the controller does one extra map read and, in the rare losing case, one extra queue removal.

Correction to the record, which was repeated from the original note: #431 has NOT shipped. It is an open draft, so master is still shard-first. Anything describing the declining sweep as landed - including the in-flight note that first recorded this defect - is describing that branch, not master. The defect was reproduced on master regardless, so nothing about its reachability depended on the wrong version.

BUT the two PRs must meet: #431 needs a second queue removal

Raised in review and verified by demonstration, not by reading the diff. The confirmation above is ordering-dependent, and the ordering it depends on is the sweep's, not this method's. It holds against master's shard-first sweep. #431 reverses that order deliberately - to decline the lock safely it asks the queue first, and tryRemove returns true when it acquired the lock whether or not anything was present ("there was no entry" and "I removed the entry" are the same answer to the caller's question). Against that ordering:

  1. sweep tryRemove - lock acquired, queue empty because the controller has not added yet, returns true;
  2. controller retryQueue.add(wc);
  3. controller isResident(wc) -> true, the shard removal has not happened yet, so the add stands;
  4. sweep removeWorkAtOffset - the container leaves its shard.

Orphan, through the few instructions between the sweep's two steps - which is precisely the widening the original note attributed to #431, and it matters more than that note thought.

What #431 must add is small: repeat the queue removal AFTER the shard removal. That closes the half where the controller's add lands inside the sweep; the residency confirmation closes the half where the add arrives after the sweep has finished. Neither half is redundant and neither closes the other.

Three arms pin this, and only one of them can actually fire. aQueueFirstSweepDefeatsTheOneShotConfirmation models the queue-first ordering and asserts the orphan appears - red-by-design documentation, green while master is shard-first. Its matched control aShardFirstSweepIsCaughtByTheConfirmation runs identical steps with only the sweep's internal order changed and asserts no orphan. Same magnitude, different position: the pair is what establishes ordering as the responsible term.

Both of those hand-build the sweep, so neither can go red when production's ordering changes - review caught that the "cannot pass each other silently" claim was resting on a future author remembering, which is "enforce the invariant, don't document it" going the wrong way. theProductionSweepsQueueRemovalIsGatedOnItsShardRemoval supplies what they cannot: it drives the REAL revoke sweep over two partitions - one container still shard-resident (the control, without which "the departed one's entry survived" would also pass on a sweep that never ran) and one that has left its shard keeping its queue entry - and asserts the single property the confirmation depends on, that the queue removal is reached only through a non-null shard removal. Verified by ablation: splice a queue-first removal into removeWorkFromShardFor and exactly that arm goes red, alone, with a message naming the paired removal #431 has to add.

The javadoc on ShardManager.onFailure now states this precondition instead of reading as ordering-independent, and docs/inflight/pr-431-must-pair-its-queue-removal-with-the-shard-removal.md carries the coordination from the other side.

Evidence

  • Control arms, same magnitude and different position. The same rebalance one seam earlier (checkpoint 3's lookup) is caught by the live check and produces no orphan - which is what isolates this to the gap between the check and the add rather than to "a rebalance during a failure result" in general. One seam later leaves the pair whole, because the sweep finds the container in its shard.
  • Ablation. With the fix, all six arms pass. Removing only the post-add residency undo, leaving every other change in place, turns exactly those three arms red again and no others.
  • Core unit suite green with no failures, errors or unexpected skips, and every bin/check-all.sh gate passing. Reproduce: ./mvnw -Pci -pl parallel-consumer-core -am test and bin/check-all.sh.

Duplication follow-up, and a file this PR otherwise did not touch

The dups: clones report flagged one clone introduced by this PR: 19 lines shared between RetryQueueRequeueWindowTest and WorkManagerStaleCheckDoubleLookupTest. That is real - the new test copied the latter's racing-double harness, which is exactly the duplication the report exists to catch, as opposed to clones already on the base branch. It was fixed for that reason and not to clear a red check.

dups: similarity was red on an earlier head for an INHERITED breach - JStreamParallelEoSStreamProcessor against JStreamParallelStreamProcessor, neither file touched by this branch, both arrived with an origin/master merge. Out of scope here by the same rule that put the harness clone in scope, and green again on the current head.

Factored out into RacingSeamWorkManager, a shared abstract test double holding the one-shot arming mechanism (arm, raceHasFired, fireOnceIfArmed) and the constructor. Each subclass keeps only its own seam: the pre-existing one overrides checkpoint 3's two-argument staleness lookup, the new one overrides the live single-argument check and adds its own live-check bookkeeping.

This changes WorkManagerStaleCheckDoubleLookupTest, a pre-existing master file this PR did not otherwise touch - flagged so a reviewer is not surprised by it. The change is mechanical: the double now extends the shared base instead of carrying its own copy, and the rationale for keeping the fired-flag separate from the armed slot moved to the base class rather than being deleted. No assertion, arm, or scenario was altered on either side, and both classes run green with the same test counts as before.

The module-construction block (PCModuleTestEnv + MockConsumer + PARTITION ordering) is not deduplicated here: it is pre-existing across nine test files on master, so it is base-branch duplication and out of this PR's scope.

Defect-class sweep

The class is a container leaving a shard without its paired retry-queue removal. Every site that removes a container from a shard was checked. Paired, and dismissed: ProcessingShard.onSuccess (paired by ShardManager.onSuccess, which removes from the queue first), and removeWorkAtOffset's three callers - removeWorkFromShardFor, removeStaleContainersFromShard via ShardManager.removeStaleContainers, and getWorkIfAvailable's last-resort branch.

One is not paired: ProcessingShard.addWorkContainer's displacement branch retires the container it displaced and releases its selection claim, but cannot remove its retry-queue entry - the shard holds no reference to the queue. The pairing gap is demonstrated by probe; production reachability is not established, and that open question is what decides its urgency. Recorded at the site and in docs/inflight/bug-shard-displacement-orphans-the-retry-queue-entry.md. Not fixed here - it needs a design choice about whether the shard should own the queue handle.

Its cost was over-claimed in the first version of that note and of the code comment, and is corrected here. Both said the displaced container's entry was one nothing could ever remove, holding a draining close open - the same permanence as the defect this PR fixes. It is not: RetryQueue keys by topic, partition and offset alone (WorkContainerKey.of), and ShardManager.onSuccess removes by that key unconditionally, so the replacement admitted at the same offset clears the entry at its own first terminal event (success removes it, failure re-adds the same key which add replaces rather than duplicates, a sweep that finds the replacement removes it by key). What is wrong inside that bounded window is the figure - the surviving entry carries the displaced container's retry-due time, so ready-to-retry and getLowestRetryTime read one high. The note's impact tag moves from stall to misdirection; the demonstrated pairing gap and the unestablished reachability are unchanged. Same shape of over-claim as the load-gate one below, which is why it is called out at both sites rather than quietly reworded.

Records

The solved problem is written up in docs/solutions/runtime-errors/retry-queue-orphan-window-between-the-requeue-check-and-the-add.md. The in-flight note that tracked this defect (docs/inflight/bug-retry-queue-orphan-window-between-the-requeue-check-and-the-add.md) exists only on #431's branch, not on master, so this PR cannot retire it; it should be deleted when either lands, since the knowledge now has a durable owner.

Checklist

  • Docs updated - solutions write-up, one new in-flight note, javadoc at every changed site, and the false consequence corrected at WorkManager.onFailureResult
  • User-facing feature documentation data added under docs/features/ - N/A - internal concurrency fix; no user-facing option or behaviour change beyond a close that no longer hangs
  • Tests added/updated - RetryQueueRequeueWindowTest (8 arms: 2 window, 1 drain, 1 characterisation, 2 control, plus the sweep-ordering pair)
  • docs/inflight/ working note (pr-/branch-) started at the PR's first commit - docs/inflight/pr-431-must-pair-its-queue-removal-with-the-shard-removal.md carries the cross-PR coordination; the defect's own record is the solutions write-up, and the sibling defect found has its own bug- note
  • Title & body reflect the final content of this PR
  • Ran ce-simplify and ce-code-review locally - N/A - this ran as ce-debug end to end. Two dedupe passes were done in-flight rather than as a separate simplify run: the residency predicate into ProcessingShard.isResident, and the racing-double harness into RacingSeamWorkManager in response to the dups: clones report. Prefer @claude review this on the PR, which is the only route that opens inline review threads.

Review rounds on this PR

  • Codex, three P1s, all upheld and fixed in 3a2e331d4: couple the sweep-ordering arms to the production sweep (above); name RetryQueue.remove's discarded result at the undo in ShardManager.onFailure - now logged, saying which of the two racing removals won, rather than assigned to an ignored local, because a dead store in main code trades an Error Prone finding for a SpotBugs DLS_DEAD_LOCAL_STORE one (already recorded as tried-and-rejected in docs/inflight/static-error-prone-rule-registry.md); and name the synthetic sweep's discarded results in the test - the shard removal's return is now asserted to be the container under test, and the queue removal's is named with why it is deliberately not asserted.
  • claude[bot]: no correctness issues, nothing blocking. It independently re-walked all three shard-removal sites against the ordering precondition and confirmed them, and ruled out a key-vs-reference concern at the undo (onFailure runs only on the controller thread; the only concurrent actor removes through this window, never adds).
  • origin/master merged in (ada7a6c16). That is also what cleared the red Integration Tests lane at source: master quarantined RegistrationRaceStaleResidentIT in ci(build): check in the Maven wrapper jar, and quarantine a test that fails its own setup guard #440 as a master-state flapper that fails its own saturation/pause-point setup guard, which is the failure this branch's earlier heads hit - tracked with cross-branch evidence in docs/inflight/test-untracked-ci-flakes.md, and never this PR's regression.

Open items for the reviewer, not blocking this diff:

  • Whether ProcessingShard.addWorkContainer's displacement branch is reachable in production with a queue-resident container - if it is, it is the same defect at a second site and needs its own fix.
  • Whether the commits should be re-cut as red-test-then-fix - answered: squash-merge, so no re-cut. One defect, one fix; the remaining commits are a javadoc/test precondition statement, a harness dedupe, a records correction and a review round.
  • Whichever of this PR and fix(core): the rebalance callbacks decline the retry queue's write lock instead of waiting for it #431 lands second owns retiring the coordination note, inverting the queue-first assertion, and dropping the ordering caveat from the javadoc.

astubbs and others added 2 commits September 3, 2026 23:46
…sidency after the add

WorkManager.onFailureResult re-validates staleness against the LIVE partition map immediately before
sm.onFailure(wc), and its own comment said no epoch check there can ever be atomic with the actions
that follow. A rebalance completing in that gap on the broker-poll thread left a queue-only orphan:
the revoke sweep removed the container from its shard and then from the retry queue, finding nothing
there yet; the controller then added it. Under PARTITION or UNORDERED ordering the emptied shard
object survives - only KEY ordering garbage-collects one - so the shard-present guard passed.

What that costs a user: work is handed out by scanning shards, so a container in no shard is never
selected, never completed and never swept, and every route that removes a retry-queue entry reaches
it through shard contents. The entry is there for the life of the instance. Once its retry delay
elapses it survives the flooring in getNumberOfWorkQueuedInShardsAwaitingSelection on a drained
pipeline, so isRecordsAwaitingProcessing() reads true forever and
AbstractParallelEoSStreamProcessor.drain() never transitions to closing - A DRAINING CLOSE HANGS TO
ITS TIMEOUT on an instance with no work in it.

The recorded consequence was wrong, and is corrected here. Both the comment at onFailureResult and
the in-flight note raised on #431 said the harm was the broker-poller load
gate being misled via ShardManager.getWorkableRecords(). Measured, that does not hold in either
half: parkedForRetry is queueSize - readyToRetry, so the orphan's contribution is exactly zero once
its delay passes, and while it is non-zero it makes the figure read LOW, which fetches sooner rather
than stalling. RetryQueueRequeueWindowTest#aQueueOnlyOrphanCostsTheDrainFigureAndNotTheLoadGate
measures both halves so the claim cannot be re-derived.

The fix, and why the obvious one was rejected. A residency test BEFORE the add only narrows the
window - it is another check-then-act, and the sweep lands between that answer and the add exactly
as it lands between the epoch check and the call. Moving the shard map and the queue under one lock
would close it but puts the poll thread's revoke path behind the retry queue's fair lock, reversing
what #431 established deliberately. Instead ShardManager.onFailure adds and
THEN confirms residency, undoing the add if the container has left: the last action is a removal
driven by a read taken after the add, and the sweep's own action is also a removal, so at least one
of the two always observes the entry. All four interleavings settle with the pair whole; the
argument is on the method. No lock added, nothing waits, and the poll thread's side is untouched.
This is the shape ProcessingShard.includeInSelection already used for the selection claim, and the
residency predicate is now shared as ProcessingShard.isResident.

Evidence. RetryQueueRequeueWindowTest drives the interleave deterministically by overriding the live
epoch check and running the full production revoke path inside it; every arm asserts that the race
fired and that the check answered not-stale, so an arm that stops exercising the window fails rather
than passing vacuously. Predictions were stated before the run and all held, including the
refutation: 3 of 6 arms red on master (the two window arms and the drain arm), the load-gate
characterisation and both control arms green. Control arms are same-magnitude-different-position -
the same rebalance one seam earlier is caught by the live check, one seam later leaves the pair
whole. Ablation: with the fix all six pass; removing only the post-add residency undo turns exactly
those three red again and no others. Core unit suite 686 run / 0 failures / 8 skipped, whole-reactor
unit build green, bin/check-all.sh 16 passed 0 failed.

Defect-class sweep. Sites that remove a container from a shard were checked for a paired queue
removal: ProcessingShard.onSuccess (paired by ShardManager.onSuccess), removeWorkAtOffset via
removeWorkFromShardFor, via removeStaleContainers, and via getWorkIfAvailable's last-resort branch
are all paired. One is NOT: ProcessingShard.addWorkContainer's displacement branch, which cannot
remove from a queue the shard holds no reference to. The pairing gap is demonstrated; production
reachability is not established, and that open question decides its urgency. Recorded at the site
and in docs/inflight/bug-shard-displacement-orphans-the-retry-queue-entry.md, not fixed here.

Records. The solved problem is written up in
docs/solutions/runtime-errors/retry-queue-orphan-window-between-the-requeue-check-and-the-add.md.
The in-flight note that tracked this defect lives only on #431's branch and
should be deleted when either lands, since the knowledge now has a durable owner.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…nd pin what #431 must add

Review raised that the four-interleaving argument on ShardManager.onFailure reads as
ordering-independent when it is not, and that #431's queue-first sweep defeats it. Both are
correct. Verified by demonstration rather than by reading the diff.

The hole. #431 reverses the sweep's two removals - it asks the queue first, because a
declined lock must abandon the paired shard removal so the pair never splits. RetryQueue.tryRemove
returns true whenever it acquired the lock, present or not, deliberately: "there was no entry" and
"I removed the entry" are the same answer to the caller's question. So the sweep's queue removal
passes over an empty queue, the controller then adds and reads residency while the container is
still resident, and the shard removal happens afterwards - neither party removes the entry. That is
the orphan this fix exists to prevent, through the few instructions between the sweep's two steps,
which is exactly the widening the original note attributed to that PR.

Why the fix still stands on master, and what closes the rest. Master is shard-first, which is what
makes the departure observable to the residency read BEFORE the sweep's queue removal, and every
case in the argument turns on that. #431 needs to repeat the queue removal AFTER the shard
removal: that closes the half where the controller's add lands inside the sweep, while the residency
confirmation closes the half where the add arrives after the sweep has finished. Neither half is
redundant and neither closes the other. No lock is added on either side, so nothing here reverses
#431's decision to keep the broker-poll thread out of a wait.

Evidence, and the instrument that stops the two changes passing each other silently. Two arms run
the sweep's two removals AROUND the controller's re-queue, changing nothing but the order of those
two removals: aQueueFirstSweepDefeatsTheOneShotConfirmation asserts the orphan APPEARS - red-by-
design documentation, green while master is shard-first - and its matched control
aShardFirstSweepIsCaughtByTheConfirmation asserts it does not. Same magnitude, different position,
so the ordering is established as the responsible term rather than assumed. When #431 lands
with the paired removal, that assertion has to be consciously inverted.

Records. The javadoc now states the precondition instead of implying none; the solutions write-up
carries the interaction; and docs/inflight/pr-431-must-pair-its-queue-removal-with-the-shard-
removal.md carries the coordination from #431's side, naming who owns the retirement.

Also corrected: the original note described #431's declining sweep as shipped. It is an open
draft and master is still shard-first. The defect was reproduced on master regardless, so nothing
about its reachability depended on the wrong version.

Core unit suite green, whole-reactor unit build green, bin/check-all.sh 16 passed 0 failed - two
gates caught real problems on the way and are fixed here: bare #431 refs, and a
"this branch" self-reference in the new note.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

Scanned Files

None

@github-actions

github-actions Bot commented Sep 3, 2026 •

Copy link
Copy Markdown

✅ Duplicate Code Report

Two engines run in parallel for cross-validation. Each has its own thresholds tuned to its baseline - the real safety net is the per-engine "max increase vs base" check.

✅ PMD CPD

PR Base Change
Clones 26 26 ➖ 0
Duplicated lines 857 857 ➖ 0
Duplication 0.37% 0.37% ➖ 0
Rule Limit Status
Max duplication 0.5% ✅ Pass (0.37%)
Max increase vs base +0.1% ✅ Pass (+0.00%)

No new clones introduced by this PR.

✅ jscpd (language-agnostic)

PR Base Change
Clones 96 95 🫤 +1
Duplicated lines 1361 1339 :face_with_raised_eyebrow: +22
Duplication 0.83% 0.83% ➖ 0
Rule Limit Status
Max duplication 2% ✅ Pass (0.83%)
Max increase vs base +0.1% ✅ Pass (+0.00%)
⚠️ 2 new clones introduced
  • 15 lines: parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerRevokeSweepNpeTest.java:1 <-> parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerStaleCheckDoubleLookupTest.java:1
  • 18 lines: parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueRequeueWindowTest.java:1 <-> parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerStaleCheckDoubleLookupTest.java:1

Powered by astubbs/duplicate-code-cross-check

@github-actions

github-actions Bot commented Sep 3, 2026 •

Copy link
Copy Markdown

📌 Duplicate code detection tool report

The tool analyzed your source code and found the following degree of similarity between the files:

🆕 New file similarities introduced

File A File B Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueRequeueWindowTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerStaleCheckDoubleLookupTest.java 43.9
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueRequeueWindowTest.java 40.3
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueRequeueWindowTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 33.9
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerRevokeSweepNpeTest.java 31.4
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/PollContextInternalTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueTest.java 31.3
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueRequeueWindowTest.java 30.4

🔺 Increased similarities

File A File B Base (%) PR (%) Change
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 36.4 44.5 +8.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 31.9 38.7 +6.9
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 34.9 37.0 +2.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 35.1 37.2 +2.0
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 38.0 39.6 +1.5
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 36.0 37.1 +1.2
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardAvailableCountOwnershipTest.java 34.2 35.1 +0.8
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 32.1 32.4 +0.3
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorConfigurationTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/SubmitWorkToPoolShutdownRaceTest.java 37.3 37.5 +0.2
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java 36.2 36.4 +0.2
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/ThrowableUtils.java 31.0 31.1 +0.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkContainer.java 32.5 32.7 +0.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ProducerManager.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java 34.6 34.7 +0.1
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalEagerProcessingIT.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java 35.7 35.9 +0.1
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/MetricsTeardownCannotBreakCloseTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/metrics/PCMetrics859Test.java 35.7 35.8 +0.1
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 43.2 43.3 +0.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/ThrowableUtils.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/ThrowableUtilsTest.java 33.1 33.2 +0.1
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerLincheckTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerLincheckTest.java 31.3 31.4 +0.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ProducerManager.java 30.6 30.7 +0.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/Java8StreamUtils.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/Java8StreamUtilsTest.java 35.6 35.6 +0.1

...and 37 more

Full similarity report
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/BootstrapResetTripleWriteProbes.java

📄 jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/BootstrapResetTripleWriteProbes.java

File Similarity (%)
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CommitPathVisibilityProbes.java 38.63
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java 34.73
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CalibrationProbes.java

📄 jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CalibrationProbes.java

File Similarity (%)
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CommitPathVisibilityProbes.java 37.44
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java 36.58
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CommitPathVisibilityProbes.java

📄 jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CommitPathVisibilityProbes.java

File Similarity (%)
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java 55.2 ⚠️
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/BootstrapResetTripleWriteProbes.java 38.63
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CalibrationProbes.java 37.44
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java

📄 jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java

File Similarity (%)
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CommitPathVisibilityProbes.java 55.2 ⚠️
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CalibrationProbes.java 36.58
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/BootstrapResetTripleWriteProbes.java 34.73
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 55.6 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 37.68
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 32.01
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 30.16
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 30.14
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 55.04 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 54.91 ⚠️
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 43.0
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 41.0
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 33.14
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 32.73
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java 31.23
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 54.91 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 47.88
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 41.08
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 38.43
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 33.74
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/PCRetriableExceptionTest.java 32.49
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/ThrowableUtils.java 31.12
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 55.6 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 46.78
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerOptions.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerOptions.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 32.31
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 55.04 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 51.85 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 47.88
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 40.18
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 34.02
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java 33.4
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 51.85 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 41.0
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 38.61
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 38.43
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContext.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContext.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/RecordContextInternal.java 46.01
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PollContextInternalTest.java 40.47
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java 36.35
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ProducerManager.java 30.7
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/RecordContextInternal.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/RecordContextInternal.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContext.java 46.01
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/SubmitWorkToPoolShutdownRaceTest.java 41.47
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java 39.38
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 37.13
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/BrokerPollSystem.java 35.69
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ProducerManager.java 34.12
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerOptions.java 32.31
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerManager.java 31.64
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java 30.53
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java 30.2
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/BrokerPollSystem.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/BrokerPollSystem.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 35.69
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ConsumerManagerPauseCacheTest.java 30.22
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerManager.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerManager.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 31.64
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/DynamicLoadFactor.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/DynamicLoadFactor.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/LoadFactorCeilingReportingTest.java 30.23
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ExternalEnginePipelineBufferTest.java 41.22
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 39.38
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 35.24
parallel-consumer-reactor/src/main/java/bz/stub/parallelconsumer/reactor/ReactorProcessor.java 30.44
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 49.38
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 47.53
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 46.78
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 37.68
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCInternalRuntimeException.java 36.91
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 36.3
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 31.33
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCInternalRuntimeException.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCInternalRuntimeException.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 36.91
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 33.4
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 31.23
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PCModuleCollaboratorOwnershipTest.java 30.21
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ProducerManager.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ProducerManager.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java 34.69
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 34.12
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 30.7
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/Java8StreamUtils.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/Java8StreamUtils.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/Java8StreamUtilsTest.java 35.64
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/JavaUtils.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/JavaUtils.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/CollectionUtils.java 35.97
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/ThrowableUtils.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/ThrowableUtils.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/ThrowableUtilsTest.java 33.2
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java 31.12
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/metrics/PCMetrics.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/metrics/PCMetrics.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/metrics/PCMetrics859Test.java 41.21
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/MetricsTeardownCannotBreakCloseTest.java 30.82
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 31.66
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 31.33
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 30.85
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 30.16
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/CorruptOffsetMetadataException.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/CorruptOffsetMetadataException.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/UnsupportedOffsetEncodingException.java 36.99
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/UnknownOffsetMetadataMagicException.java 32.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodedOffsetPair.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodedOffsetPair.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetMapCodecManager.java 36.75
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 36.3
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 47.53
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 44.11
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 33.51
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 32.65
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 49.38
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 44.11
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 32.01
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetEncoding.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetEncoding.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/UnknownOffsetMetadataMagicException.java 37.75
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/WorkManagerOffsetMapCodecManagerTest.java 31.04
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetMapCodecManager.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetMapCodecManager.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodedOffsetPair.java 36.75
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 57.98 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 33.51
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 31.66
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 30.14
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 57.98 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 32.65
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 30.85
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/UnknownOffsetMetadataMagicException.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/UnknownOffsetMetadataMagicException.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/UnsupportedOffsetEncodingException.java 50.21 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetEncoding.java 37.75
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/CorruptOffsetMetadataException.java 32.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/UnsupportedOffsetEncodingException.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/UnsupportedOffsetEncodingException.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/UnknownOffsetMetadataMagicException.java 50.21 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/CorruptOffsetMetadataException.java 36.99
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 32.36
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionStateManager.java 32.17
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 30.2
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionStateManager.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionStateManager.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 42.95
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java 32.17
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 44.52
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 39.58
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 37.17
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardAvailableCountOwnershipTest.java 35.06
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkContainer.java 32.68
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueRequeueWindowTest.java 30.36
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 44.52
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueRequeueWindowTest.java 40.33
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 38.74
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 36.95
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerRevokeSweepNpeTest.java 31.4
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkContainer.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkContainer.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkClaimStateMachineTest.java 49.89
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TransactionalBulkCommitTest.java 37.61
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 32.68
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java

📄 parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionStateManager.java 42.95
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 37.17
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 37.13
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 36.95
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java 32.36
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/KafkaSanityTests.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/KafkaSanityTests.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/LoopingResumingIteratorTest.java 34.16
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 58.21 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 45.44
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/Rebalance857CommitSyncDeadlockProbeBase.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/Rebalance857CommitSyncDeadlockProbeBase.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/RebalanceEoSDeadlockTest.java 33.16
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/RebalanceEoSDeadlockTest.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/RebalanceEoSDeadlockTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/Rebalance857CommitSyncDeadlockProbeBase.java 33.16
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 53.37 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 45.44
parallel-consumer-vertx/src/test-integration/java/bz/stub/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 30.13
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionTimeoutsTest.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionTimeoutsTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java 33.77
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalBatchVisibilityIT.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalBatchVisibilityIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalCrashReplayIT.java 46.33
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalPartialResultSetIT.java 36.67
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TransactionalClaim.java 33.9
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalVisibilityIT.java 32.55
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalEagerProcessingIT.java 31.21
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalCrashReplayIT.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalCrashReplayIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalBatchVisibilityIT.java 46.33
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TransactionalClaim.java 35.4
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalEagerProcessingIT.java 33.09
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalEagerProcessingIT.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalEagerProcessingIT.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java 35.85
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TransactionalClaim.java 33.22
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalCrashReplayIT.java 33.09
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalBatchVisibilityIT.java 31.21
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalPartialResultSetIT.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalPartialResultSetIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalBatchVisibilityIT.java 36.67
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalVisibilityIT.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalVisibilityIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalBatchVisibilityIT.java 32.55
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 58.21 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 53.37 ⚠️
parallel-consumer-vertx/src/test-integration/java/bz/stub/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 36.33
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 42.66
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkKeyOrderIT.java 40.75
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 37.4
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 33.86
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 32.96
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ProgressProbe.java 30.16
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 43.28
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 42.66
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 39.09
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkKeyOrderIT.java 51.64 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 43.28
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 37.4
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 33.94
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkCooperativeDrainIT.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkCooperativeDrainIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkDrainIT.java 38.62
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkCooperativeIT.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkCooperativeIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 39.81
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkDrainIT.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkDrainIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkCooperativeDrainIT.java 38.62
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkCooperativeIT.java 39.81
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 32.96
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkKeyOrderIT.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkKeyOrderIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 51.64 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 40.75
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 39.09
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 33.94
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 33.86
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ProgressProbe.java 31.62
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/DiagnosticQuietCap.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/DiagnosticQuietCap.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/DiagnosticQuietCapIT.java 51.17 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/DiagnosticQuietCapIT.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/DiagnosticQuietCapIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/DiagnosticQuietCap.java 51.17 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/KeyOrderLedger.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/KeyOrderLedger.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/KeyOrderLedgerIT.java 30.49
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/KeyOrderLedgerIT.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/KeyOrderLedgerIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/KeyOrderLedger.java 30.49
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ProgressProbe.java

📄 parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ProgressProbe.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 31.62
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 30.16
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorConfigurationTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorConfigurationTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/SubmitWorkToPoolShutdownRaceTest.java 37.52
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorTestBase.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorTestBase.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessorTest.java 31.84
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/BatchTestBase.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/BatchTestBase.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 30.46
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CheckQuarantineOwnersScriptTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CheckQuarantineOwnersScriptTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineRegistryScriptTest.java 44.62
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineLaneReportScriptTest.java 39.99
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitRejectionTestBase.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitRejectionTestBase.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitResponseTimeoutSymptomTest.java 30.65
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitResponseTimeoutSymptomTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitResponseTimeoutSymptomTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerTestBase.java 32.67
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitRejectionTestBase.java 30.65
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java

File Similarity (%)
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorBatchTest.java 52.43 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java 50.64 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 44.46
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/BatchTestBase.java 30.46
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/JStreamLiveResultStreamTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/JStreamLiveResultStreamTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/Java8StreamUtilsTest.java 30.29
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MdcBoundaryProbe.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MdcBoundaryProbe.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MdcContextPropagationTest.java 35.28
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MdcContextPropagationTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MdcContextPropagationTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MdcBoundaryProbe.java 35.28
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerCommitTimeoutTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerCommitTimeoutTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerSaslAuthenticationTest.java 44.19
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerSaslAuthenticationTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerSaslAuthenticationTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerCommitTimeoutTest.java 44.19
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerTestBase.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerTestBase.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitResponseTimeoutSymptomTest.java 32.67
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/PCRetriableExceptionTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/PCRetriableExceptionTest.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java 32.49
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ParallelEoSSStreamProcessorRebalancedTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ParallelEoSSStreamProcessorRebalancedTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessorTest.java 32.17
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessorTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessorTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ParallelEoSSStreamProcessorRebalancedTest.java 32.17
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorTestBase.java 31.84
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/PollContextInternalTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/PollContextInternalTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueTest.java 31.3
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineLaneReportScriptTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineLaneReportScriptTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CheckQuarantineOwnersScriptTest.java 39.99
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineRegistryScriptTest.java 30.52
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineRegistryScriptTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineRegistryScriptTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CheckQuarantineOwnersScriptTest.java 44.62
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineLaneReportScriptTest.java 30.52
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/RunTagFilter.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/RunTagFilter.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/RunTagFilterTest.java 35.4
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/RunTagFilterTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/RunTagFilterTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/RunTagFilter.java 35.4
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java

File Similarity (%)
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 87.27 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 86.89 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 86.89 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 83.51 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 83.51 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 83.51 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 82.02 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 82.02 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TransactionalClaim.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TransactionalClaim.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalCrashReplayIT.java 35.4
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalBatchVisibilityIT.java 33.9
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalEagerProcessingIT.java 33.22
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ConsumerManagerCloseOwnershipTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ConsumerManagerCloseOwnershipTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ThreadConfinedConsumerTest.java 35.14
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ConsumerManagerPauseCacheTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ConsumerManagerPauseCacheTest.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/BrokerPollSystem.java 30.22
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/EpochAndRecordsMapRaceTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/EpochAndRecordsMapRaceTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerStaleContainerTest.java 33.46
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ExternalEnginePipelineBufferTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ExternalEnginePipelineBufferTest.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java 41.22
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/LoadFactorCeilingReportingTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/LoadFactorCeilingReportingTest.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/DynamicLoadFactor.java 30.23
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/MetricsTeardownCannotBreakCloseTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/MetricsTeardownCannotBreakCloseTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/metrics/PCMetrics859Test.java 35.78
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/metrics/PCMetrics.java 30.82
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PCModuleCollaboratorOwnershipTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PCModuleCollaboratorOwnershipTest.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java 30.21
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PollContextInternalTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PollContextInternalTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java 45.11
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 40.47
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProduceLockHandover.java 32.9
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProduceLockHandover.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProduceLockHandover.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java 36.45
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PollContextInternalTest.java 32.9
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PollContextInternalTest.java 45.11
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProduceLockHandover.java 36.45
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 36.35
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalEagerProcessingIT.java 35.85
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ProducerManager.java 34.69
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionTimeoutsTest.java 33.77
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 30.53
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/SubmitWorkToPoolShutdownRaceTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/SubmitWorkToPoolShutdownRaceTest.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 41.47
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorConfigurationTest.java 37.52
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 40.18
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 33.14
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ThreadConfinedConsumerTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ThreadConfinedConsumerTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ConsumerManagerCloseOwnershipTest.java 35.14
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TransactionalBulkCommitTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TransactionalBulkCommitTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkClaimStateMachineTest.java 74.87 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerTest.java 45.61
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkContainer.java 37.61
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/CollectionUtils.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/CollectionUtils.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/JavaUtils.java 35.97
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/Java8StreamUtilsTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/Java8StreamUtilsTest.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/Java8StreamUtils.java 35.64
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/JStreamLiveResultStreamTest.java 30.29
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/LoopingResumingIteratorTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/LoopingResumingIteratorTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/KafkaSanityTests.java 34.16
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/ThrowableUtilsTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/ThrowableUtilsTest.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/ThrowableUtils.java 33.2
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/metrics/PCMetrics859Test.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/metrics/PCMetrics859Test.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/metrics/PCMetrics.java 41.21
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/MetricsTeardownCannotBreakCloseTest.java 35.78
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/CorruptOffsetMetadataTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/CorruptOffsetMetadataTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/EncoderOutputSurvivesDecodeValidationTest.java 30.37
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/EncoderOutputSurvivesDecodeValidationTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/EncoderOutputSurvivesDecodeValidationTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/CorruptOffsetMetadataTest.java 30.37
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/OffsetCodecTestUtils.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/OffsetCodecTestUtils.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/WorkManagerOffsetMapCodecManagerTest.java 30.03
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/OffsetEncodingBackPressureTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/OffsetEncodingBackPressureTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/OffsetEncodingBackPressureUnitTest.java 37.07
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/OffsetEncodingBackPressureUnitTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/OffsetEncodingBackPressureUnitTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/OffsetEncodingBackPressureTest.java 37.07
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/WorkManagerOffsetMapCodecManagerTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/WorkManagerOffsetMapCodecManagerTest.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetEncoding.java 31.04
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/OffsetCodecTestUtils.java 30.03
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckToolchainProbeTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckToolchainProbeTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerLincheckTest.java 30.15
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/OffsetEncoderWidenedRangeRaceTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/OffsetEncoderWidenedRangeRaceTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateCommitEncodeShift894Test.java 44.12
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RacingEncodeWindowState.java 36.56
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateCommitEncodeShift894Test.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateCommitEncodeShift894Test.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/OffsetEncoderWidenedRangeRaceTest.java 44.12
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateCommitShiftCompounding894Test.java 40.06
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java 30.33
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateCommitShiftCompounding894Test.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateCommitShiftCompounding894Test.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateCommitEncodeShift894Test.java 40.06
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerLincheckTest.java 32.47
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateCommitEncodeShift894Test.java 30.33
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ProcessingShardStaleReplacement909Test.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ProcessingShardStaleReplacement909Test.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerStaleContainerTest.java 44.73
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RacingCommitCycleState.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RacingCommitCycleState.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RacingEncodeWindowState.java 58.75 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RacingEncodeWindowState.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RacingEncodeWindowState.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RacingCommitCycleState.java 58.75 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/OffsetEncoderWidenedRangeRaceTest.java 36.56
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueLincheckTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueLincheckTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerLincheckTest.java 40.17
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueRequeueWindowTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueRequeueWindowTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerStaleCheckDoubleLookupTest.java 43.86
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 40.33
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 33.94
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 30.36
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/PollContextInternalTest.java 31.3
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardAvailableCountOwnershipTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardAvailableCountOwnershipTest.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 35.06
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 31.34
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerLincheckTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerLincheckTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueLincheckTest.java 40.17
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java 32.47
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerLincheckTest.java 31.42
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckToolchainProbeTest.java 30.15
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerRevokeSweepNpeTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerRevokeSweepNpeTest.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 31.4
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerStaleContainerTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerStaleContainerTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ProcessingShardStaleReplacement909Test.java 44.73
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/EpochAndRecordsMapRaceTest.java 33.46
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 39.58
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 38.74
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueRequeueWindowTest.java 33.94
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardAvailableCountOwnershipTest.java 31.34
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkClaimStateMachineTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkClaimStateMachineTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TransactionalBulkCommitTest.java 74.87 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerTest.java 54.43 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkContainer.java 49.89
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerLincheckTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerLincheckTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerLincheckTest.java 31.42
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerStaleCheckDoubleLookupTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerStaleCheckDoubleLookupTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueRequeueWindowTest.java 43.86
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerTest.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkClaimStateMachineTest.java 54.43 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TransactionalBulkCommitTest.java 45.61
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/truth/CommitHistorySubject.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/truth/CommitHistorySubject.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/truth/LongPollingMockConsumerSubject.java 36.26
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/truth/LongPollingMockConsumerSubject.java

📄 parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/truth/LongPollingMockConsumerSubject.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/truth/CommitHistorySubject.java 36.26
parallel-consumer-examples/parallel-consumer-example-core/src/main/java/bz/stub/parallelconsumer/examples/core/CoreApp.java

📄 parallel-consumer-examples/parallel-consumer-example-core/src/main/java/bz/stub/parallelconsumer/examples/core/CoreApp.java

File Similarity (%)
parallel-consumer-examples/parallel-consumer-example-reactor/src/main/java/bz/stub/parallelconsumer/examples/reactor/ReactorApp.java 35.66
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/CoreAppTest.java

📄 parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/CoreAppTest.java

File Similarity (%)
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/ReactorAppTest.java 39.18
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/integrationTests/CoreAppMetricsIntegrationTest.java 36.56
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/VertxAppTest.java 35.04
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java

📄 parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 83.51 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 82.79 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 82.43 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.43 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 79.22 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 79.22 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 77.81 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 77.81 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java

📄 parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 82.02 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 81.31 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 80.96 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 80.96 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 77.81 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 77.81 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 77.81 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 76.42 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/integrationTests/CoreAppMetricsIntegrationTest.java

📄 parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/integrationTests/CoreAppMetricsIntegrationTest.java

File Similarity (%)
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/CoreAppTest.java 36.56
parallel-consumer-examples/parallel-consumer-example-reactor/src/main/java/bz/stub/parallelconsumer/examples/reactor/ReactorApp.java

📄 parallel-consumer-examples/parallel-consumer-example-reactor/src/main/java/bz/stub/parallelconsumer/examples/reactor/ReactorApp.java

File Similarity (%)
parallel-consumer-examples/parallel-consumer-example-vertx/src/main/java/bz/stub/parallelconsumer/examples/vertx/VertxApp.java 63.88 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/main/java/bz/stub/parallelconsumer/examples/core/CoreApp.java 35.66
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/ReactorAppTest.java

📄 parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/ReactorAppTest.java

File Similarity (%)
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/VertxAppTest.java 45.72
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/CoreAppTest.java 39.18
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java

📄 parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 83.51 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 82.79 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 82.43 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.43 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 79.22 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 79.22 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 77.81 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 77.81 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java

📄 parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 82.02 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 81.31 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 80.96 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 80.96 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 77.81 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 77.81 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 77.81 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 76.42 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/main/java/bz/stub/parallelconsumer/examples/vertx/VertxApp.java

📄 parallel-consumer-examples/parallel-consumer-example-vertx/src/main/java/bz/stub/parallelconsumer/examples/vertx/VertxApp.java

File Similarity (%)
parallel-consumer-examples/parallel-consumer-example-reactor/src/main/java/bz/stub/parallelconsumer/examples/reactor/ReactorApp.java 63.88 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java

📄 parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 83.51 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 82.79 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 82.43 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.43 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 79.22 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 79.22 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 77.81 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 77.81 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/VertxAppTest.java

📄 parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/VertxAppTest.java

File Similarity (%)
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/ReactorAppTest.java 45.72
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/CoreAppTest.java 35.04
parallel-consumer-mutiny/src/main/java/bz/stub/parallelconsumer/mutiny/MutinyProcessor.java

📄 parallel-consumer-mutiny/src/main/java/bz/stub/parallelconsumer/mutiny/MutinyProcessor.java

File Similarity (%)
parallel-consumer-reactor/src/main/java/bz/stub/parallelconsumer/reactor/ReactorProcessor.java 42.23
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java

📄 parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java

File Similarity (%)
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorBatchTest.java 81.38 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 50.64 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 48.27
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyMdcPropagationTest.java

📄 parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyMdcPropagationTest.java

File Similarity (%)
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorMdcPropagationTest.java 47.14
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyPCTest.java

📄 parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyPCTest.java

File Similarity (%)
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorPCTest.java 69.46 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java

📄 parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 86.89 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 86.14 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 85.77 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 82.43 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 82.43 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 82.43 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 80.96 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 80.96 ⚠️
parallel-consumer-reactor/src/main/java/bz/stub/parallelconsumer/reactor/ReactorProcessor.java

📄 parallel-consumer-reactor/src/main/java/bz/stub/parallelconsumer/reactor/ReactorProcessor.java

File Similarity (%)
parallel-consumer-mutiny/src/main/java/bz/stub/parallelconsumer/mutiny/MutinyProcessor.java 42.23
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java 30.44
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorBatchTest.java

📄 parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorBatchTest.java

File Similarity (%)
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java 81.38 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 52.43 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 49.96
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorMdcPropagationTest.java

📄 parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorMdcPropagationTest.java

File Similarity (%)
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyMdcPropagationTest.java 47.14
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorPCTest.java

📄 parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorPCTest.java

File Similarity (%)
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyPCTest.java 69.46 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java

📄 parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 86.89 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 86.14 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 85.77 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 82.43 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 82.43 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 82.43 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 80.96 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 80.96 ⚠️
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java

📄 parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 43.0
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 41.83
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java 37.91
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 37.75
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 34.02
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 33.74
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java

📄 parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java

File Similarity (%)
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java 43.32
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 41.83
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 41.08
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 38.61
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 32.73
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java

📄 parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java

File Similarity (%)
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java 40.34
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 37.75
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java 35.24
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java

📄 parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java

File Similarity (%)
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 43.32
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 40.34
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 37.91
parallel-consumer-vertx/src/test-integration/java/bz/stub/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java

📄 parallel-consumer-vertx/src/test-integration/java/bz/stub/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 36.33
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 30.13
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java

📄 parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 87.27 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 86.14 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 86.14 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 82.79 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 82.79 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 82.79 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 81.31 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 81.31 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java

📄 parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java

File Similarity (%)
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorBatchTest.java 49.96
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java 48.27
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 44.46

@github-actions

github-actions Bot commented Sep 3, 2026 •

Copy link
Copy Markdown

[superseded - a quarantined test changed outcome] 🧪🔒 Quarantine Lane Report

Quarantined test Outcome Owner Meaning
MultiInstanceRebalanceTest.largeNumberOfInstances 🟡🎲 passed (flapper) ⚠️ unowned proves nothing - passes most runs by nature

🔴 expected while the owner PR is open · 🟡🎲 flapper, pass proves nothing · 🚨 a deterministic quarantined test passing means its fix landed: delete its @Quarantined annotation + docs/quarantined-tests.md entry (a merge-blocking review thread has been opened). Lane: non-gating; rules: see the Quarantine Audit check.

Updated for 01cc033 · run 33802727233 · 2026-09-03 20:36 UTC

Superseded by a newer quarantine lane report.

@github-actions

github-actions Bot commented Sep 3, 2026 •

Copy link
Copy Markdown

⚠️ SpotBugs Report

333 bug(s) found (rule-level exclusions only - see docs/inflight/static-spotbugs-rule-registry.md). See the annotations on the Files Changed tab for details.

Updated for 48d193d · run 34070190212 · 2026-09-07 00:39 UTC

@codecov

codecov Bot commented Sep 3, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 82.40%. Comparing base (cc36b64) to head (48d193d).
⚠️ Report is 3 commits behind head on master.
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@             Coverage Diff              @@
##             master     #437      +/-   ##
============================================
+ Coverage     81.84%   82.40%   +0.55%     
- Complexity     1462     1474      +12     
============================================
  Files            95       95              
  Lines          5133     5148      +15     
  Branches        500      502       +2     
============================================
+ Hits           4201     4242      +41     
+ Misses          732      710      -22     
+ Partials        200      196       -4     
Flag Coverage Δ
chaos 52.75% <0.00%> (?)
integration 61.50% <25.00%> (+0.18%) ⬆️
performance 52.05% <0.00%> (?)
unit 78.49% <100.00%> (+0.33%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@github-actions

github-actions Bot commented Sep 3, 2026 •

Copy link
Copy Markdown

🟢 Throughput — OK

This branch measured about 9% slower than master, on the one test this measures. That is INSIDE this test's own run-to-run spread of about 17%, so read it as a reading and not as a result - re-running the same commit moves it by about as much.

What Value Meaning
Compared with master 0.910 above 1.00 is faster, below is slower
Subject test took 57.0s the test under measurement
Control tests took 32.2s the other tests in this same run
Subject ÷ controls, here 1.769 not a speed - a shape that cancels machine speed
Subject ÷ controls, master 1.609 median of recent master runs
Reported rate 64321 rec/s this machine only; not comparable across runners

Allowable range 🟢 ≥ 0.70 · 🟡 0.50–0.70 (about a 30% loss) · 🔴 < 0.50 (about a 50% loss)

What the numbers mean, and what they cannot tell you

The one that gets misread. Subject ÷ controls is a shape, not a speed. 1.7 means the subject took 1.7 times as long as the control tests in the same run - it says nothing about master on its own, and a reviewer has already read it as "1.7x faster than master". Only Compared with master answers that question.

Why a shape and not a rate. A rate depends on which runner you drew. A shape does not: every test here processes a fixed number of records, so a runner twice as slow doubles the subject and the controls together and leaves their ratio alone. That is the whole trick, and it is why the reported rate is shown last and labelled as this machine only.

Reading the comparison. master ÷ this run. Above 1.00 the subject is proportionally quicker here than on master; below 1.00 it is slower. 0.50 means it takes twice as long relative to its controls - that is the failing bound, not a small one.

By conservation, not by correction. Every test in this lane processes a fixed number of records, so within one run the ratio of one test's time to another's is invariant under machine speed — a runner twice as slow doubles both terms and leaves the ratio alone. There is no machine-index correction to be wrong, because nothing needed correcting. share = subjectSeconds / controlSeconds, both from this same run.

Per-method times, not class times. A class time is work + setup, and container startup and @BeforeAll do not scale with work — they are the non-conserved term, and leaving them in breaks the invariant.

Reference is the median of 9 recent perf baseline (master) run(s), read from their artifacts. There is no committed baseline to go stale, and a share is dimensionless, so an old entry stays comparable to a new one without re-baselining. Shares observed: 1.428 – 1.739.

What this still cannot do. It removes machine-to-machine variance. It does not remove this test's own run-to-run variance, measured at about 30% on a single unchanged commit while its controls stayed within 5%. That is a property of the test, not of the comparison, and no arithmetic here can touch it — which is why the reference is a median and the bounds are deliberately coarse. 🟡 means look at this; only 🔴 is outside the measured spread.

Runs used: e20e898, 9999144, cc36b64, 1941cdf, 05c02bb, 5706686, c668acb, fb5ea93, 6573781

Since the previous push: ratio 0.726 -> 0.91, share 2.215 -> 1.769, rate 27732 -> 64321 (+131.9%). One push of difference sits inside this test's measured spread - read it as movement, not as a result.

Updated for 48d193d · run 34070190212 · 2026-09-07 00:52 UTC

The dups: similarity check flagged one clone introduced by this PR - 19 lines shared between
RetryQueueRequeueWindowTest and WorkManagerStaleCheckDoubleLookupTest. Real, and exactly the case
the report exists for: the new test copied the existing racing-double harness rather than extending
it, which is the "reuse test utilities - search before you add" rule going the wrong way.

RacingSeamWorkManager now holds the part that was duplicated - the one-shot arming mechanism (arm,
raceHasFired, fireOnceIfArmed) and the constructor. Each subclass keeps only what actually differs,
which is its seam: the pre-existing double overrides checkpoint 3's two-argument staleness lookup,
the new one overrides the live single-argument check and adds its own live-check bookkeeping.

This edits WorkManagerStaleCheckDoubleLookupTest, a pre-existing master file this branch had not
otherwise touched. That is the right place for the fix rather than a second copy, but it is worth
knowing when reading the diff. The change is mechanical: no assertion, arm or scenario altered on
either side, and the reasoning for keeping the fired flag separate from the armed slot moved onto
the base class rather than being deleted - a cleared armed slot cannot tell "armed, then fired" from
"never armed", so a precondition built on it would pass on a test that forgot to arm.

Not deduplicated, deliberately: the module-construction block (PCModuleTestEnv + MockConsumer +
PARTITION ordering) is pre-existing across nine test files on master, so it is base-branch
duplication and out of this PR's scope.

Both classes green with the same counts as before (8 and 5). Core unit suite 688 run / 0 failures /
8 skipped - unchanged, so nothing was lost in the move. Whole-reactor unit build green;
bin/check-all.sh 16 passed, 0 failed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 3, 2026 •

Copy link
Copy Markdown

[superseded - a quarantined test changed outcome] 🧪🔒 Quarantine Lane Report

Quarantined test Outcome Owner Meaning
MultiInstanceRebalanceTest.largeNumberOfInstances 🔴 failing (expected) ⚠️ unowned quarantine holding

🔴 expected while the owner PR is open · 🟡🎲 flapper, pass proves nothing · 🚨 a deterministic quarantined test passing means its fix landed: delete its @Quarantined annotation + docs/quarantined-tests.md entry (a merge-blocking review thread has been opened). Lane: non-gating; rules: see the Quarantine Audit check.

Since the previous push: MultiInstanceRebalanceTest.largeNumberOfInstances: 🟡🎲 passed (flapper) → 🔴 failing.

Updated for 8ab9241 · run 33804017129 · 2026-09-03 20:49 UTC

Superseded by a newer quarantine lane report.

@github-actions

github-actions Bot commented Sep 6, 2026 •

Copy link
Copy Markdown

[superseded - a quarantined test changed outcome] 🧪🔒 Quarantine Lane Report

Quarantined test Outcome Owner Meaning
MultiInstanceRebalanceTest.largeNumberOfInstances 🟡🎲 passed (flapper) ⚠️ unowned proves nothing - passes most runs by nature

🔴 expected while the owner PR is open · 🟡🎲 flapper, pass proves nothing · 🚨 a deterministic quarantined test passing means its fix landed: delete its @Quarantined annotation + docs/quarantined-tests.md entry (a merge-blocking review thread has been opened). Lane: non-gating; rules: see the Quarantine Audit check.

Since the previous push: MultiInstanceRebalanceTest.largeNumberOfInstances: 🔴 failing → 🟡🎲 passed (flapper).

Updated for d2bedd6 · run 34064108674 · 2026-09-06 22:36 UTC

Superseded by a newer quarantine lane report.

@astubbs

astubbs commented Sep 6, 2026

Copy link
Copy Markdown
Owner Author

@claude review this

@astubbs

astubbs commented Sep 6, 2026

Copy link
Copy Markdown
Owner Author

@codex review

@claude

claude Bot commented Sep 6, 2026 •

Copy link
Copy Markdown

Claude finished @astubbs's task in 4m 59s —— View job


Review

  • Gather context (PR body, branch context, prior-art hits)
  • Read the changed source files (ProcessingShard.java, ShardManager.java, WorkManager.java)
  • Read the new test (RetryQueueRequeueWindowTest.java, RacingSeamWorkManager.java)
  • Check the docs/inflight notes added
  • Check CI signal (codecov failure, spotbugs, duplication reports)
  • Post review feedback

Summary

This is a careful, well-reasoned fix. I traced the core change and it holds up.

The fix itself (ShardManager.onFailure, state/ShardManager.java:462-482): adding to the retry queue before confirming shard residency, then undoing the add if residency fails, is the right shape to close a check-then-act window rather than merely narrow it. I verified the precondition the javadoc states - that this depends on the sweep removing shard-before-queue - against all three call sites that remove a container from a shard:

  • removeWorkFromShardFor (ShardManager.java:311-335) - shard removal, then queue removal. ✅
  • removeStaleContainers (ShardManager.java:556-562) - same order via .map(...).map(retryQueue::remove). ✅
  • getWorkIfAvailable's last-resort branch (ProcessingShard.java:349-360) - same order. ✅

All three match the required ordering, so the confirmation is sound against current master. The RetryQueueRequeueWindowTest suite is unusually rigorous - every arm asserts its own preconditions (race actually fired, live check answered "not stale") rather than just asserting the outcome, which is exactly what stops a reproduction silently degrading into a vacuous pass later.

Verified independently, not just read:

  • WorkManagerStaleCheckDoubleLookupTest's diff is mechanical, per git show 8ab9241b0 - no assertions changed, confirms the PR body's own characterization.
  • checkIfWorkIsStale(WorkContainer) was already public before this branch (checked against c30aaee15), so the new test double didn't need a visibility change to override it - no widened surface introduced for testing purposes alone.
  • The codecov failure (RegistrationRaceStaleResidentIT.freshArrivalCollidingWithStaleShardResidentMustStillGetProcessed) is pre-existing, master-state, and already tracked with cross-branch evidence in docs/inflight/test-untracked-ci-flakes.md (fails its saturation/pause-point setup guard, not the 909 signature assertion) - not this PR's regression.
  • The review gate check failing is expected per AGENTS.md: no review has posted for this PR yet, so a red claude-review at this point isn't a fault.

One thing I chased and ruled out, worth recording since it's exactly the kind of subtlety this PR is about: the undo path (this.retryQueue.remove(wc), ShardManager.java:478) removes by key (topic/partition/offset, per RetryQueue.remove), while the guard that gates it (shard.isResident(wc), ProcessingShard.java:438-440) is reference-based. In principle a same-key-but-different-instance container racing in between the add and the undo would be removed by the wrong path. In practice this can't happen: ShardManager.onFailure is only ever invoked from the single controller thread, so nothing else can interleave between those two statements on the same thread, and the only concurrent actor (the broker-poll thread) only removes through this window, never adds. Flagging only because the PR's own defect-class sweep is this thorough about ordering assumptions, so it seemed worth confirming rather than assuming.

Scope discipline is good. The two things this PR explicitly does not fix - the ProcessingShard.addWorkContainer displacement-branch orphan, and #431's need for a second queue removal - are both written up honestly (including "production reachability NOT established" for the first) rather than silently deferred, with the red-by-design test (aQueueFirstSweepDefeatsTheOneShotConfirmation) pinning the cross-PR coordination so the two changes can't pass each other silently.

Nothing here blocks merge. No correctness issues found in the shipped fix; the two known-open items are correctly scoped as follow-ups, not regressions.
· branch

@astubbs astubbs left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@chatgpt-codex-connector

Copy link
Copy Markdown

💡 Codex Review


P1 Badge Couple the queue-first arm to the production sweep

When #431 switches production to queue-first without the required trailing removal, this test will remain green: sweepAroundTheRequeue hard-codes the two-step model instead of invoking the production sweep, and this assertion explicitly requires the resulting orphan. Adding the trailing removal to production would not affect the helper either, so the promised regression signal depends entirely on a future author remembering to rewrite the test. Exercise the production path or otherwise couple the assertion to its ordering/removal behavior so the known drain-stall regression actually fails CI.

AGENTS.md reference: AGENTS.md:L361-L368



P1 Badge Record the cleanup removal result

RetryQueue.remove returns whether this cleanup actually observed and removed an entry, but the newly added losing-residency path discards that result. Since the method's concurrency argument depends on at least one racing removal observing the entry, name the boolean and document why either result is acceptable rather than leaving a bare call whose intent is indistinguishable from an oversight.

AGENTS.md reference: AGENTS.md:L402-L407


Runnable queueRemoval = () -> wm.getSm().getRetryQueue().remove(wc);
Runnable shardRemoval = () -> shard.removeWorkAtOffset(wc.offset());

P1 Badge Record the synthetic sweep results

Both synthetic sweep actions silently discard meaningful return values: the queue removal reports whether an entry existed, while the shard removal returns the container actually displaced. These values distinguish the intended interleaving from a no-op or wrong-container setup, so name them and state or assert why their outcomes are expected instead of relying on bare calls.

AGENTS.md reference: AGENTS.md:L402-L407

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

astubbs and others added 2 commits September 7, 2026 00:10
…ifecycle, not permanent

Review of the sibling defect this PR records but does not fix found its consequence over-claimed, and
the over-claim repeated at the code site. Verified against this branch's head rather than read off
the note.

WHAT WAS WRONG. Both docs/inflight/bug-shard-displacement-orphans-the-retry-queue-entry.md and the
KNOWN GAP comment at ProcessingShard.addWorkContainer said the displaced container's retry-queue entry
is one "nothing can ever remove", holding a draining close open to its timeout - i.e. exactly the
consequence of the window this PR fixes.

WHY IT IS NOT. RetryQueue keys by topic, partition and offset alone (WorkContainerKey.of), never by
container identity, and ShardManager.onSuccess removes by that key UNCONDITIONALLY, before it touches
any shard. The container that displaced the stale one carries the same three coordinates, so the
replacement's own first terminal event clears the entry: success removes it; failure re-adds the same
key, and RetryQueue.add replaces the existing entry rather than duplicating it, so what is left is an
ordinary retry entry; a revoke or stale sweep that finds the replacement in the shard removes it by
that key too. The window is bounded by the replacement's lifecycle, not by the instance's, so nothing
here holds a draining close open.

WHAT IS STILL TRUE, and why the note stays open: the surviving entry carries the DISPLACED
container's retry-due time, so the ready-to-retry count and RetryQueue.getLowestRetryTime read one
entry high until that terminal event. A briefly wrong figure, so the note's impact tag moves from
stall to misdirection. The demonstrated pairing gap and the "production reachability is NOT
established" section are unchanged - the gap is real, only its price was overstated.

This is the same shape of over-claim this PR corrects at WorkManager.onFailureResult: a bounded,
self-clearing cost written up as a permanent one. Two in one area is a pattern, so the correction
says so at both sites rather than only fixing the words.

ALSO CORRECTED, found while checking the above: WorkManagerStaleCheckDoubleLookupTest's class javadoc
still named the broker-poller load gate as where the re-queue orphan is paid for. That is the claim
this PR measured and refuted, sitting in a file this PR already edits - so the PR's own claim that the
wrong consequence "cannot be re-derived" was not true while a live copy of it stood in the test suite.

ALSO FLAGGED: #431's branch hands the RetryQueue to
removeStaleWorkContainersFromShard as well as to getWorkIfAvailable, so the note's and the comment's
"passed in per-call to getWorkIfAvailable and nowhere else" goes stale when that PR lands. Recorded in
both places; #431 owns the rest of what that changes.

Confirmed while here, because the note asserts it: ProcessingShard.retire's javadoc does state the
pairing invariant, and it does cover only the population and the selection claim.

Core unit suite green, bin/check-all.sh 16 passed 0 failed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018rEzrWYFr6oEzy6porczd3
…nd name the discarded removal results

Three P1s from Codex review on the current head, all upheld.

COUPLE THE SWEEP-ORDERING ARMS TO PRODUCTION. The two modelled arms hand-build the sweep's two
removals - one of them models an ordering production does not have yet - so neither can go red when
production's ordering changes. The claim that they stop this PR and #431
passing each other silently was therefore resting on a future author remembering to rewrite a test,
which is "enforce the invariant, do not document it" going the wrong way. The arm's javadoc said it
would "fail loudly at that moment"; it would not, and now says so.

theProductionSweepsQueueRemovalIsGatedOnItsShardRemoval supplies what those arms cannot. It drives
the REAL revoke sweep (WorkManager.onPartitionsRevoked -> ShardManager.removeWorkFromShardFor) across
two partitions: one container still resident in its shard, one that has left it while keeping its
queue entry. The resident one is the arm's own control - without it, "the departed one's entry
survived" would also pass on a sweep that never ran at all. What it asserts is the single property of
the sweep that the confirmation on ShardManager.onFailure depends on: the queue removal is reached
only through a non-null shard removal, which is only true of a shard-first sweep.

Its discriminating power is MEASURED, not asserted. With a queue-first removal spliced into
removeWorkFromShardFor - modelling what #431's
tryRemove(topic, partition, offset) does - exactly this arm goes red and no other, its message naming
the paired removal that PR has to add. Ablation reverted; nothing of it remains in the tree.

NAME THE DISCARDED REMOVAL RESULTS. ShardManager.onFailure's undo dropped RetryQueue.remove's answer,
which cannot be told from a forgotten check. It is now LOGGED, and the log line says which of the two
racing removals won - the only interesting thing about that branch, since both answers are correct
and neither is actionable. Logged rather than assigned to an ignored local deliberately: a dead store
in MAIN code trades an Error Prone finding for a SpotBugs DLS_DEAD_LOCAL_STORE one, which
docs/inflight/static-error-prone-rule-registry.md already records as tried and rejected at another
site. That rule is excluded for test classes, which is why the same treatment is fine inside the test.

In the test's synthetic sweep, the shard removal's return is now ASSERTED to be the container under
test - a null or a different instance there means the arm arranges no departure and everything after
it is vacuous - and the queue removal's is named with why it is deliberately not asserted: whether an
entry was present depends on which position the runnable is in, and both answers are the modelled
behaviour.

Core unit suite 712 run / 0 failures / 0 errors / 8 skipped, the new arm being the one addition.
bin/check-all.sh 16 passed, 0 failed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018rEzrWYFr6oEzy6porczd3
@astubbs

astubbs commented Sep 7, 2026

Copy link
Copy Markdown
Owner Author

@codex all three upheld and addressed in 3a2e331. Replying here rather than in-thread because the review posted as a single comment with no review threads attached, so there is nothing to reply into.

1. Couple the queue-first arm to the production sweep — agreed, and it was the sharpest of the three. You are right that sweepAroundTheRequeue hard-codes the two-step model, so neither modelled arm can move when production's ordering changes, and the "cannot pass each other silently" claim was resting on a future author remembering. The arm's own javadoc said it would "fail loudly at that moment"; it would not, and now says so.

New arm theProductionSweepsQueueRemovalIsGatedOnItsShardRemoval drives the real sweep (WorkManager.onPartitionsRevoked → ShardManager.removeWorkFromShardFor) over two partitions — one container still shard-resident, one that has left its shard while keeping its queue entry. The resident one is the arm's own control: without it, "the departed one's entry survived" would also pass on a sweep that never ran. It asserts the single property the confirmation depends on — that the queue removal is reached only through a non-null shard removal.

Discriminating power measured, not asserted: with a queue-first removal spliced into removeWorkFromShardFor (modelling #431's tryRemove(topic, partition, offset)), exactly this arm goes red and no other, its message naming the paired removal that PR has to add. Ablation reverted.

2. Record the cleanup removal result — agreed, with one deviation worth stating. RetryQueue.remove's answer is now logged rather than assigned to an ignored local, and the log line says which of the two racing removals won. Both answers are correct and neither is actionable, exactly as you say; the argument needs only that at least one removal observes the entry. A named-but-unused local was rejected on purpose: in main code a dead store trades an Error Prone finding for a SpotBugs DLS_DEAD_LOCAL_STORE one, which docs/inflight/static-error-prone-rule-registry.md already records as tried and rejected at another site. That rule is excluded for test classes, which is why the same treatment is fine inside the test.

3. Record the synthetic sweep results — agreed. The shard removal's return is now asserted to be the container under test (a null or a different instance means the arm arranges no departure and everything after it is vacuous). The queue removal's is named with why it is deliberately not asserted: whether an entry was present depends on which position the runnable is in — queue-first finds nothing because the controller has not added yet, which is the modelled behaviour, not a fault.

Core unit suite 712 run / 0 failures / 0 errors / 8 skipped; bin/check-all.sh 16 passed, 0 failed.

🤖 Generated with Claude Code

https://claude.ai/code/session_018rEzrWYFr6oEzy6porczd3

@chatgpt-codex-connector

Copy link
Copy Markdown

To use Codex here, create an environment for this repo.

@github-actions

github-actions Bot commented Sep 7, 2026 •

Copy link
Copy Markdown

[superseded - a quarantined test changed outcome] 🧪🔒 Quarantine Lane Report

Quarantined test Outcome Owner Meaning
MultiInstanceRebalanceTest.largeNumberOfInstances 🟡🎲 passed (flapper) ⚠️ unowned proves nothing - passes most runs by nature
RegistrationRaceStaleResidentIT.freshArrivalCollidingWithStaleShardResidentMustStillGetProcessed 🟡🎲 passed (flapper) ⚠️ unowned proves nothing - passes most runs by nature

🔴 expected while the owner PR is open · 🟡🎲 flapper, pass proves nothing · 🚨 a deterministic quarantined test passing means its fix landed: delete its @Quarantined annotation + docs/quarantined-tests.md entry (a merge-blocking review thread has been opened). Lane: non-gating; rules: see the Quarantine Audit check.

Since the previous push: RegistrationRaceStaleResidentIT.freshArrivalCollidingWithStaleShardResidentMustStillGetProcessed entered the lane as 🟡🎲 passed (flapper).

Updated for 3a2e331 · run 34068998714 · 2026-09-07 00:16 UTC

Superseded by a newer quarantine lane report.

@astubbs

astubbs commented Sep 7, 2026

Copy link
Copy Markdown
Owner Author

@claude review this

Re-review requested because the head moved after your last pass (d2bedd6a → 3a2e331d): origin/master merged in, the sibling-defect note and its code comment corrected for an over-claimed consequence, and three upheld Codex P1s fixed — the new arm theProductionSweepsQueueRemovalIsGatedOnItsShardRemoval in particular, which drives the real revoke sweep and is what now mechanically pins the #431 coordination your last review credited to aQueueFirstSweepDefeatsTheOneShotConfirmation (that arm hand-builds the ordering and cannot in fact fire).

Please look hardest at the new arm: whether its two-partition fixture really establishes what it claims, and whether the resident-container control is sufficient to rule out a vacuous pass.

@claude

claude Bot commented Sep 7, 2026 •

Copy link
Copy Markdown

Claude finished @astubbs's task in 4m 6s —— View job


Review

  • Gather context (PR body, prior review, branch context)
  • Read the current diff / confirm HEAD is 3a2e331d4
  • Read RetryQueueRequeueWindowTest.java, focusing on theProductionSweepsQueueRemovalIsGatedOnItsShardRemoval
  • Trace WorkManager.onPartitionsRevoked → production sweep to verify the fixture matches
  • Verify the ablation claim by inspection
  • Assess whether the resident-container control rules out a vacuous pass

Summary

Re-reviewed at 3a2e331d4, focused on the new arm as requested. It holds up - the fixture is real, the control is load-bearing, and the two Codex P1 fixes I could inspect from the diff match what the PR body claims.

The call path claim in the javadoc is accurate, though compressed. The comment says this arm drives WorkManager#onPartitionsRevoked -> ShardManager.removeWorkFromShardFor, but the actual path is WorkManager.onPartitionsRevoked → PartitionStateManager.onPartitionsRevoked → onPartitionsRemoved → resetOffsetMapAndRemoveWork → PartitionState.onPartitionsRemoved(sm) → ShardManager.removeAnyShardEntriesReferencedFrom → removeWorkFromShardFor per incomplete offset (PartitionStateManager.java:278-288, PartitionState.java:640-643, ShardManager.java:298-306). The javadoc names the endpoints and skips the intermediate hops, but the path is real, not a shortcut - I traced every link.

The fixture genuinely exercises the gating property, not a stand-in for it:

  • Both containers are registered through ModelUtils.registerOneRecordAndTakeIt (real onPartitionsAssigned → registerWork → getWorkIfAvailable), so both land in PartitionState.incompleteOffsets via the production registerWork path (PartitionState.java:403) - this is what makes them visible to the real sweep's removeAnyShardEntriesReferencedFrom(incompleteOffsets.values()) call.
  • wc.onUserFunctionFailure(...) + sm.onFailure(wc) for both puts them through the fixed ShardManager.onFailure (add-then-confirm). Nothing races here, so both stay resident and queued - this step isn't testing the fix itself, it's just parking both for retry, which is correct since the ordering property this arm pins is the sweep's, not onFailure's.
  • The manual departedShard.removeWorkAtOffset(willLeaveItsShard.offset()) models the queue-only-orphan precondition directly rather than racing threads for it - reasonable, since racing it would just be re-testing onFailure, which the other arms already do.
  • When the real sweep runs, removeWorkFromShardFor for the departed partition finds the shard present (PARTITION ordering never GCs empty shards) but empty, so removeWorkAtOffset returns null and the queue removal is skipped by the Objects.nonNull(removedWC) guard (ShardManager.java:319-325) - exactly the gated behaviour the arm is asserting.

The resident-container control earns its place. Without stillResident, a sweep that silently did nothing at all (e.g. a partition-filtering regression, or onPartitionsRevoked becoming a no-op) would leave willLeaveItsShard's entry untouched for a completely different reason and the final assertion would still pass. The control forces proof that the sweep actually removed something through the real revoke path before the "gated" assertion is allowed to mean anything. I checked for a subtler vacuous-pass route too - e.g. the departed partition being silently skipped while the resident one is processed - and ruled it out: both partitions go through onPartitionsAssigned individually in the fixture, so both have entries in partitionStates, and resetOffsetMapAndRemoveWork iterates every partition passed to onPartitionsRevoked unconditionally.

Ablation claim checks out by inspection. If removeWorkFromShardFor removed from the queue unconditionally (the #431 shape), the final assertion on willLeaveItsShard would flip to red while the stillResident control assertion is unaffected (it already expected removal) - so exactly this test method fails, and only on its second assertion. The two hand-built arms (aQueueFirstSweepDefeatsTheOneShotConfirmation, aShardFirstSweepIsCaughtByTheConfirmation) construct their own ordering inline and don't call the production sweep, so they're correctly unaffected by a change to removeWorkFromShardFor - consistent with the javadoc's own claim that they "cannot themselves produce" this failure.

Spot-checked the two other Codex P1 fixes from the diff, both match the PR body's description:

  • ShardManager.onFailure's undo path (ShardManager.java:475-482) now logs which of the two racing removals won rather than discarding the boolean, with the dead-store-vs-SpotBugs tradeoff explained inline and cited to docs/inflight/static-error-prone-rule-registry.md.
  • ProcessingShard.isResident (ProcessingShard.java:450-452) is reference-based (workMap.get(wc.offset()) == wc), confirming the earlier review's key-vs-reference concern was correctly closed.

Nothing found that blocks merge. The new arm establishes what its javadoc claims, the control is not decorative, and I did not find a vacuous-pass path through it.
· branch

@astubbs astubbs left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@astubbs
astubbs marked this pull request as ready for review September 7, 2026 00:28
…nstance

The same over-claim 490d589 corrected on the displacement sibling was still
standing in this defect's own write-up, in the body and in a frontmatter symptom:
that every route removing a retry-queue entry reaches it through shard contents,
so nothing could ever take it out again, and it is there for the life of the
instance.

VERIFIED AGAINST THE CODE, not read off the sibling. RetryQueue keys by topic,
partition and offset via WorkContainerKey.of, never by container identity, and
ShardManager.onSuccess calls retryQueue.remove(wc) as its FIRST statement -
unconditionally, before it looks up any shard. That is a removal route which does
not go through shard contents, so any later container at those three coordinates
clears the entry.

THE CONSEQUENCE IS UNCHANGED, and the reason is worth stating rather than leaving
implicit. The orphan is created by a revocation, so nothing arrives at those
coordinates again until the partition is reassigned to this instance - and a
draining close is precisely the window in which no reassignment can occur. The
drain still hangs to its timeout. What changes is the bound: an instance that
keeps running and is given the partition back reaches the entry and clears it.

Recorded as a correction rather than an edit, because the strong version is the
plausible-sounding one and a later reader who re-derives it should find out here
why it does not hold.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MWLkoGdvM2CHQCsYpgUMAR
@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown

🧪🔒 Quarantine Lane Report

Quarantined test Outcome Owner Meaning
MultiInstanceRebalanceTest.largeNumberOfInstances 🔴 failing (expected) ⚠️ unowned quarantine holding
RegistrationRaceStaleResidentIT.freshArrivalCollidingWithStaleShardResidentMustStillGetProcessed 🟡🎲 passed (flapper) ⚠️ unowned proves nothing - passes most runs by nature

🔴 expected while the owner PR is open · 🟡🎲 flapper, pass proves nothing · 🚨 a deterministic quarantined test passing means its fix landed: delete its @Quarantined annotation + docs/quarantined-tests.md entry (a merge-blocking review thread has been opened). Lane: non-gating; rules: see the Quarantine Audit check.

Since the previous push: MultiInstanceRebalanceTest.largeNumberOfInstances: 🟡🎲 passed (flapper) → 🔴 failing.

Updated for 48d193d · run 34070190190 · 2026-09-07 00:39 UTC

@astubbs
astubbs merged commit 440b9bd into master Sep 7, 2026
60 of 61 checks passed
@astubbs
astubbs deleted the fix/retry-queue-requeue-orphan-window branch September 7, 2026 01:07
astubbs added a commit that referenced this pull request Sep 7, 2026
…pair with

Base movement, 19 commits. #437 (440b9bd) closes the retry-queue orphan
window by confirming shard residency AFTER the re-queue's add, and #433
(9999144) declares `RetryQueue.RetryQueueIterator` `@ThreadConfined(ANY)` with an
`assertOnOwningThread` at every entry point. Both land in files this branch rewrites.

NOTHING CONFLICTED, which is the case to be suspicious of rather than pleased about - the two sides
touch adjacent regions of the same four files and git merged them without asking. Checked by hand
afterwards, both sides' intent is present and distinct:

- `RetryQueue`: #433's `@ThreadConfined(ThreadConfined.ANY)` on the iterator type plus its three
  `assertOnOwningThread` guards, AND this branch's `@ControllerThreadOnly` on `remove`/`add`/
  `removeAll`/`clear`. They answer different questions - one is consumed by RacerD and paired with a
  runtime assertion, the other is read only by `ArchitectureTest.rebalanceCallbacksMustNotBlock` -
  and the marker's own javadoc says why it is deliberately not the Infer annotation.
- `ShardManager`: #437's post-add `isResident` confirmation in `onFailure`, AND this branch's
  queue-first `tryRemove` in `removeWorkFromShardFor`.
- `ProcessingShard`: #437's `isResident` predicate and its use in `includeInSelection`, AND this
  branch's `removeStaleWorkContainersFromShard(RetryQueue)`.

THE RED IS EXPECTED AND IS THE NEXT COMMIT'S STARTING EVIDENCE.
`RetryQueueRequeueWindowTest.theProductionSweepsQueueRemovalIsGatedOnItsShardRemoval` fails at its
final assertion - "PRODUCTION IS SHARD-FIRST, and the confirmation in ShardManager.onFailure depends
on it". That arm exists precisely to go red the moment production stops being shard-first, and this
branch is what stops it. `RetryQueueRequeueWindowTest` 9 tests / 1 failure.

Its sibling `aQueueFirstSweepDefeatsTheOneShotConfirmation` is GREEN, and that is not a reprieve: it
hand-builds both orderings, so production moving cannot move it - the over-claim review caught on
#437 and the reason the production arm was added. It still has to be re-stated against the paired
removal.

Everything else green on the merged tree: `ArchitectureTest` 3/0/0/0, `RetryQueueTest` 10/0/0/0,
`RetryQueueRebalancePathTest` 6/0/0/0, `RebalanceCallbackRuleControlTest` 2/0/0/0,
`RetryQueueIteratorConfinementTest` 5/0/0/0.

`bin/check-branch-self-reference.sh` is red on 12 references in three notes that arrived from master
and name #431 in the future tense - the note addressed to this PR, the shard
displacement note, and the Infer `@ThreadSafe` note. All three are the next commit's work, because
what they should say depends on what it does.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018rEzrWYFr6oEzy6porczd3
astubbs added a commit that referenced this pull request Sep 7, 2026
…shard removal

#437 closed the re-queue orphan window by adding to the retry queue and THEN
confirming the container is still shard-resident, undoing the add when it is not. That argument holds
against a sweep that removes from the shard first and the queue second, which is what master did. This
branch's sweeps ask the queue FIRST so that a refused lock can abandon a removal it has not started -
and against that ordering a one-shot confirmation is defeated: the sweep's ask passes over an empty
queue, the controller adds, its residency read still sees a resident container because the shard
removal has not happened yet, and the shard removal then happens. Neither party removes the entry.
That is the queue-only orphan #437 closed, back through a different door, and
`docs/inflight/pr-431-must-pair-its-queue-removal-with-the-shard-removal.md` was addressed to this PR
saying so.

WHAT CHANGED FOR A USER: nothing new that #437 did not already give them - a failed record whose
partition is revoked mid-re-queue still cannot strand a retry-queue entry that no scan reaches, and so
still cannot hold a draining close open to its timeout. This keeps that true now the sweeps decline.

THE SECOND ASK, AND WHY A REFUSAL CANNOT ABANDON. Both broker-poll-thread sweeps -
`ShardManager.removeWorkFromShardFor` and `ProcessingShard.removeStaleWorkContainersFromShard` - now
ask the queue again once the container has left the shard. By then the first ask's option is gone:
abandoning would leave exactly the orphan the first ask exists to avoid. So a refused second ask puts
the container BACK, through the new `ProcessingShard.removeWorkAtOffsetPairedWith(offset, paired)` -
population re-admitted, selection claim restored, `putIfAbsent` so a container that took the offset
meanwhile is not displaced. What is left behind is then a whole stale pair, which is the state the
engine tolerates and the controller's own sweep retires, rather than a half nothing reaches.

The undo lives inside the shard because only the removal knows the one fact it needs: whether that
retirement was the call that took the selection claim. It was not, if the record was already out at a
worker - and asking the container afterwards cannot tell the two apart, which is the same unanswerable
question `removeWorkAtOffset` records having been fixed to stop asking. `retireReversibly` reports it;
`excludeFromSelection` now returns whether it won its compare-and-set to say so.

REJECTED, and recorded at the site: ask the queue only ONCE, after the shard removal, and put the
container back on a refusal. That restores master's shard-first ordering and needs no second ask -
simpler on the page. It moves the undo from the rare path to the common one: refusals are frequent
exactly when the controller holds the read lock for a whole scan, which is the contention this fix
exists to survive, whereas a SECOND ask is only refused when the lock was free a moment earlier and
has been taken since.

THE SAME WINDOW AT THE OTHER SITE, SETTLED FROM THE INTERLEAVINGS RATHER THAN BY ANALOGY.
`ProcessingShard.removeStaleWorkContainersFromShard` is the epoch-change sweep, reached from
`onPartitionsAssigned` as well as `onPartitionsRemoved`. All three of the ingredients
`ShardManager.onFailure` needs are present on it: both callers increment the assignment epoch BEFORE
calling it, so a container that answered "not stale" to `WorkManager.onFailureResult`'s live check a
moment earlier is exactly what this sweep then finds stale; `getShard` answers present because this
sweep only empties shards and `removeShardIfEmpty` is not on its path at all; and the residency read
sees a resident whenever the add lands before the `workMap` removal. Only the trigger differs, and a
new assignment widens the window rather than narrowing it. The analysis is written at the site, not
just here.

EVIDENCE - RED FIRST, four ablations, each turning exactly the expected arm red and no others.
`RetryQueueRequeueWindowTest` 12/0/0/0 green.

- Second removal made but INERT (`departed -> true`): 12 tests / 2 failures -
  `theProductionSweepTakesOutAnEntryTheControllerAddedInsideTheSweep` on the orphan assertion, and
  `aRefusedSecondRemovalPutsTheContainerBackSoThePairStaysWhole` on the resident assertion.
- Paired form dropped for plain `removeWorkAtOffset`: the same two, on their seam-never-fired
  PRECONDITIONS - which is the arms saying production stopped calling the method they instrument,
  rather than saying the orphan appeared.
- Put-back omitted: 12 / 1, on "the refused second removal must put the container BACK in its shard".
- Claim restore omitted: 12 / 1, on the awaiting-selection assertion.

Every ablation reverted and the tree checked clean afterwards.

THE TESTS, AND WHY TWO OF THEM NEEDED A NEW KIND OF SEAM. The hand-built arms #437 left behind model
the sweep's removals by hand, so none of them can go red when production's ordering moves - the
over-claim review caught on that PR. They are now three, one term changed between each:
`aQueueFirstSweepWithoutItsPairedSecondRemovalWouldOrphanTheEntry` (the control, asserting the orphan
appears), `aQueueFirstSweepWithItsPairedSecondRemovalKeepsThePairWhole` (the inversion #437's note
asked for), and `aShardFirstSweepIsCaughtByTheConfirmation` (unchanged, the ordering master had).

Coupling them to production needs the controller's re-queue to land INSIDE the real sweep, and the
only production instruction between its two queue removals belongs to the shard. `SeamShard` is a
`ProcessingShard` planted in the map before the assignment that would otherwise create one - so
`addWorkContainer`'s `compute` finds it and production writes into it - overriding
`removeWorkAtOffsetPairedWith` to fire `sm.onFailure` once. Built with the manager's own
`RecordPopulation`, or the conservation figure would not see what it holds.
`aRefusedSecondRemovalPutsTheContainerBackSoThePairStaysWhole` adds one term to that seam: the
interference opens a live `RetryQueue` iterator and leaves it open, so the second `tryLock()` is
refused - a `ReentrantReadWriteLock` grants no upgrade, so a thread holding the read lock is refused
the write lock even though it is the same thread, which is what makes the refusal deterministic
without a second thread. The add is made before the iterator is opened, because it takes the write
lock and would otherwise deadlock against the reader on this thread.

`theProductionSweepsQueueRemovalIsGatedOnItsShardRemoval` asserted a property this branch deliberately
removes, so it is re-stated rather than deleted: as
`theProductionSweepAsksTheQueueBeforeItTouchesTheShard` it pins the ordering the abandon-on-refusal
design needs, with the same fixture and control and the assertion inverted. It is green on merit -
production genuinely asks first - and red if anything reverses that.

RECORDS. `ShardManager.onFailure`'s ordering caveat is gone, replaced by which half each mechanism
covers and a five-case interleaving table that now includes the add landing inside a sweep; its first
paragraph also loses the "nothing can ever take it out again" over-claim that PR's own squash body
had already corrected. `removeWorkFromShardFor` gains the second-ask paragraph and a dated second
reopen condition. `docs/inflight/pr-431-must-pair-its-queue-removal-with-the-shard-removal.md` is
retired, its instruction carried out; `bug-retry-queue-orphan-window-between-the-requeue-check-and-the-add.md`
existed only on this branch and is deleted, the solutions write-up on master owning it now. That
write-up's "#431 is an open draft" framing is corrected to what landed, including the new arm
names and the reopen conditions. Two notes that arrived from master naming this PR in the future tense
- the shard-displacement one and the Infer `@ThreadSafe` one - are rewritten as they will read after
this merges.

Full core unit suite 738/0/0/8, `bin/check-all.sh` 16 passed 0 failed, Lincheck lane 9/0/0/0
(`ShardManagerLincheckTest`, `WorkManagerLincheckTest`, `RetryQueueLincheckTest`,
`PartitionStateLincheckTest` and the two toolchain probes).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018rEzrWYFr6oEzy6porczd3
astubbs added a commit that referenced this pull request Sep 7, 2026
Master gained the conservation-derived RecordPopulation (#336)
and the atomic compute() admission in ShardManager.addWorkContainer
(#437), both of which touch the ProcessingShard constructor
this branch also extends with DispatchScanMeter. The PR body predicted a one-line
resolution at that constructor; it came to three files plus one compile fix:

- ProcessingShard: both fields kept. RecordPopulation stays first so master's
  parameter order is unchanged and the meter is appended as the last argument of the
  Lombok required-args constructor.
- ShardManager: master's compute() block is taken whole, with dispatchScanMeter added
  to the constructor call inside it. Both shared instances are fields on the manager.
- ShardManagerTest and ShardPopulationRaceTest: master's new call sites pass a meter;
  the test-local shards get a fresh DispatchScanMeter since nothing reads it there.

The scanMeter.onEntryExamined() increment auto-merged into the rewritten scan loop
(#373) still sits once per examined entry, so the parity
test's exact totals are unchanged. Verified: OrderingModeDispatchParityTest,
ShardManagerTest and ShardPopulationRaceTest green under JDK 17.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GqkUNK5K7JXkbbGoNFTvfB
astubbs added a commit that referenced this pull request Sep 7, 2026
…ever a fresh replacement

The poller's stale sweep asked each occupant whether it was stale and then removed it with
`removeWorkAtOffset(entry.getKey())` - by KEY. The staleness answer is about one container; the
removal is about one offset. Between the two statements the occupant can change, and it does: the
sweep runs on the broker-poll thread inside a rebalance callback, while `addWorkContainer`'s
stale-replacement branch runs on the controller, and nothing orders them.

The harm is a LOST RECORD. The fresh container is evicted while `PartitionState` still carries its
offset as incomplete, so nothing selects it and nothing completes it - the commit high-water mark
for that partition cannot advance past it until the partition is re-polled. The accounting half was
already closed (#336, #373), so the counters settled correct while the record was
being lost: correct counters are not evidence that the right object left.

THE OBVIOUS FIX IS WRONG, AND IT WOULD HAVE SHIPPED LOOKING CORRECT.

`computeIfPresent(offset, (k, v) -> v == inspected ? null : v)` reads as airtight - the function
only asks for a removal if the current value IS the container the sweep inspected. Measured against
the JDK 17 source and then by experiment, it is not.
`ConcurrentSkipListMap.computeIfPresent` commits a removal through `doRemove(key, v)`, which
RE-READS the node's value and gates on `value.equals(reRead)` before its compare-and-set:

    else if (value != null && !value.equals(v))   // v was just re-read from the node
        break outer;
    else if (VAL.compareAndSet(n, v, null)) { ... }

`WorkContainer.equals` is topic, partition and offset only, so a replacement landing in that gap is
equal-by-offset, passes the gate, and is removed. Reproduced directly: with an offset-only-equals
value type, a put landing inside the remapping function leaves the map EMPTY - the replacement
destroyed - while the identical program with an identity-equals value type returns the replacement
and keeps it. So the identity check narrows the window from "the whole staleness check" to "a few
instructions inside the JDK" and closes nothing. No production-seam test can tell the two apart,
which is why this is written down rather than merely avoided.

`workMap.remove(offset, container)` fails for the same reason one level up: the JDK's
compare-and-remove is DEFINED by `equals`, so with offset-only equality no map API can express
which container was meant. The value type's equality IS the contract.

THE FIX. The shard's map stores a `Residency` token rather than the container. It overrides neither
`equals` nor `hashCode`, so its equality is reference identity, and `Map.remove(key, value)` - one
atomic step, fully specified, independent of which side the implementation compares - means exactly
"remove this occupancy, or nothing". There is no interval for a writer to land in, so there is no
window left to narrow.

Nothing evicted is a correct outcome, not a failure: the replacement won the offset, so the call
retires nothing and REPORTS nothing. That matters downstream - `ShardManager.removeStaleContainers`
feeds the returned list to the retry queue, and #437 pinned that the queue removal is reached
only through a real shard removal. Reporting a container this call did not remove would break that
gating and take the retry entry at coordinates the fresh container now owns. The red test's
assertion that the sweep reports the inspected container is corrected accordingly; the assertion
that pins the defect - the fresh container survives, by reference identity - is untouched.

`getWorkIfAvailable`'s last-resort stale removal has the same shape and is written the same way,
with a dated cleared-suspicion note saying why the race is not reachable there today
(`addWorkContainer` is the only writer and runs on the controller, which also runs that scan) and
what would reopen it.

REJECTED: giving `WorkContainer` identity equality, which would delete the token and fix every
value-conditional operation on a container at once. It is breaking - `WorkContainer` is public and
its `compareTo` orders by offset, which would become inconsistent with equals - so it is queued in
docs/refactoring.md under the next major. Also rejected: a remove-then-put-back repair, and a claim
the sweep takes before removing which the writer must then wait out; both reintroduce a window, one
in the map and one on the controller.

EVIDENCE. The defect arm was red against master and is green here. Ablation: restoring
`removeWorkAtOffset(entry.getKey())` in the sweep and changing nothing else sends exactly that arm
red - the control arm and the premise arm stay green. A third arm pins the premise itself, that no
removal keyed on container equality can say which container it meant, `computeIfPresent` included;
it is also the tripwire that goes red the day `WorkContainer.equals` becomes identity-based, saying
the token can then be deleted. Whole `state` package green, full unit suite green across every
module, every `bin/check-all.sh` gate passing.

SAME-DEFECT-CLASS SWEEP over core main - a removal keyed on something that does not identify the
element that was inspected. One real hit, not fixed here:
`ExternalEngine.holdingDispatchPermit` is a `Set<WorkContainer>` whose permit accounting is per
RECORD while its membership is per OFFSET, so two containers at one offset leak a dispatch permit
permanently. Recorded with its reachability argument in
docs/inflight/bug-dispatch-permit-set-cannot-tell-two-containers-at-one-offset-apart.md. Dismissed
with reasons: `ProcessingShard.onSuccess` (a non-stale resident is never replaced, and a stale
result never reaches it - `handleFutureResult` short-circuits); `removeWorkAtOffset` from the
revocation path (emptying an offset regardless of occupant is its purpose); `RetryQueue` (keys by
`WorkContainerKey` deliberately, and removes the value it just looked up, under its write lock);
the metrics and counter maps (keyed by an identifier that fully identifies the thing);
`OffsetSimultaneousEncoder.activeEncoders` (per-instance, single-threaded encoding path).

Resolves docs/inflight/bug-stale-sweep-iterator-evicts-fresh-replacement.md, whose mechanism,
rejected alternatives and open decision are migrated to
docs/solutions/logic-errors/a-by-key-removal-cannot-say-which-container-it-meant-2026-09-07.md -
the other side of the same class as the confluentinc#909 write-up, which is cross-linked from it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019SVm2cT6ZgUyPMim9CukYK
astubbs added a commit that referenced this pull request Sep 7, 2026
…ot timing (#358)

A guard on the ordering-mode dispatch ratio that counts what the scan examines instead
of timing it.

UNORDERED dispatch re-walks the whole in-flight prefix on every pass; KEY skips an
occupied shard in one step. Their scan costs diverge as in-flight depth grows, and
nothing pinned that: a change that made one shape quadratic would have surfaced only as
"the benchmark feels slower".

DispatchScanMeter is a LongAdder shared across every shard of one ShardManager,
incremented once per entry the scan examines. It is shared rather than per-shard
because an emptied shard is removed from the map, which would discard a per-shard
count and undercount KEY far more than UNORDERED - the exact asymmetry the guard is
meant to detect. OrderingModeDispatchParityTest asserts exact totals - one examination
per record for KEY, the triangular sum for UNORDERED - which are properties of the
algorithm rather than of the machine, so the assertion is deterministic and load-immune
and names which shape changed.

Why a counter and not a stopwatch: the first version timed the two modes and compared
durations. Inside a thread-parallel suite that is a race with the rest of the run, not
an assertion about the code. Four attempts to stabilise it - fastest-of-three, ratio
instead of absolutes, CPU time instead of wall clock, @isolated - each moved the flake
without removing it, three of them after a bisect had shown the dispatch code unchanged.
The meter is main-code deliberately: it counts inside the scan loop, where a test double
cannot reach without altering the thing being measured. Its accessor on ShardManager is
package-private, matching the other test-visible instruments in that class, so the
public API does not grow.

Extracted from the engine-performance campaign on perf/engine-concurrency; the direct-
pull scan work in #361 measures with this meter. Reconciled
with master's RecordPopulation conservation counter (#336)
and the atomic shard admission (#437) at the ProcessingShard
constructor, where the meter is the last argument.

Co-authored-by: Claude Fable 5.1 (1M context) <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Sep 8, 2026
…moves only the container it inspected (#468)

BREAKING CHANGE: RecordContext equality changes. Its Lombok @EqualsAndHashCode covers the
WorkContainer it wraps, so two contexts built from different containers for one record no longer
compare equal - a Set, a Map key or an equals check over record contexts that used to collapse them
now keeps both. Narrow in practice: ConsumerRecord does not override equals either, so two contexts
from two different polls were never equal; what changes is two contexts over the same ConsumerRecord
instance. WorkContainer itself is public in modifier only and is not part of the surface a user is
expected to hold.

THE DEFECT. The poller's stale sweep asked each occupant whether it was stale and then removed it by
KEY, with removeWorkAtOffset(entry.getKey()). The staleness answer is about one container; the
removal is about one offset. Between the two statements the occupant can change, and it does: the
sweep runs on the broker-poll thread inside a rebalance callback, while addWorkContainer's
stale-replacement branch runs on the controller, and nothing orders them.

The harm is a LOST RECORD. The fresh container is evicted while PartitionState still carries its
offset as incomplete, so nothing selects it and nothing completes it - the commit high-water mark for
that partition cannot advance past it until the partition is re-polled. The accounting half was
already closed (#336, #373), so the counters settled correct while the record was being
lost: correct counters are not evidence that the right object left. It is the same
fresh-replacement-at-one-offset class as the confluentinc#909 write-up, reached from the other side.

THE FIX IS IN THE VALUE TYPE, NOT THE REMOVAL. Map.remove(key, value) is the JDK's
compare-and-remove, and it decides "still mapped to the value I inspected" with equals - so what
that call MEANS is a property of the value type and not of the map. WorkContainer.equals was topic,
partition and offset only, so a stale container and its fresh replacement compared equal and no map
API could express which of the two was meant. The equals/hashCode pair is deleted, equality is
reference identity, and workMap.remove(offset, inspected) is a true compare-and-remove: it evicts
the container the sweep inspected or nothing.

Nothing evicted is a correct outcome, not a failure: the replacement won the offset, so the call
retires nothing and REPORTS nothing. ShardManager.removeStaleContainers feeds the returned list to
the retry queue, and #437 pinned that the queue removal is reached only through a real shard
removal; reporting a container this call did not remove would take the retry entry at coordinates
the fresh container now owns. getWorkIfAvailable's last-resort stale removal has the same shape and
is written the same way, with a dated cleared-suspicion note saying why the race is not reachable
there today and what would reopen it.

REJECTED, and why each would have shipped looking correct:

- computeIfPresent with an identity check in the remapping function. ConcurrentSkipListMap commits
  the removal through doRemove(key, v), which RE-READS the node value and gates on
  value.equals(reRead) before its compare-and-set, so with offset-only equality the identity test
  does not survive to the commit. Reproduced: a put landing inside the remapping function left the
  map EMPTY under offset-only equals and kept the replacement under identity equals. It narrowed the
  window to a few instructions inside the JDK and closed nothing. Under identity equality the same
  arm shows the gate declining directly: the remapping function runs TWICE, the first pass planting
  the replacement and asking for a removal that doRemove refuses, the second pass being handed the
  replacement. That is recorded at the site rather than asserted, since an implementation reaching
  the same gate without looping would be equally correct.
- A ProcessingShard.Residency token as the map value, overriding neither equals nor hashCode. An
  earlier revision of this branch shipped it. It bought exactly one correct removal and left the
  value type wrong, so the next value-conditional site would have had to remember to wrap. Replaced
  before merge on the maintainer's call: 0.6.0.0 is the breaking release and already carries a
  Breaking section.
- A remove-then-put-back repair, and a claim the sweep takes before removing which the writer must
  wait out. Both reintroduce a window, one in the map and one on the controller.

THE OBJECTIONS THAT HAD QUEUED IDENTITY EQUALITY AS FUTURE WORK, each checked and each fallen:
Comparable only RECOMMENDS consistency between compareTo and equals; SortedSet and SortedMap REQUIRE
it, and nothing in main code puts a raw container in either - RetryQueue sorts by its own
WorkContainerSortKey and de-duplicates by its own WorkContainerKey, so compareTo and its comparator
are unchanged with the inconsistency stated in the javadoc. The one collection keyed on containers
elsewhere, ExternalEngine.holdingDispatchPermit, has been an IdentityHashMap-backed set since
#342, so identity equality makes the container agree with that code rather than changing it.
The public break is RecordContext, stated above.

THE OTHER HALF OF THE CONTRACT IS ENFORCED, NOT WRITTEN DOWN. Nothing puts a raw container in a
sorted collection today, and both RetryQueue and ProcessingShard.workMap are one refactor away from
being written the other way round with nothing going red. WorkContainerIsNeverInASortedCollectionArchTest
reads every field, return type and parameter in main code whose declared type is a sorted set, sorted
map or priority queue and whose FIRST type argument - the element-or-key position for all of them -
is WorkContainer, so a container in a sorted map's value position passes. Proved red on main code
with a temporary TreeSet<WorkContainer> field on ProcessingShard, which reported that field and not
the workMap declared beside it. A standing positive control, in the RebalanceCallbackRuleControlTest
shape, hands a hand-imported fixture to the real rule object so the rule cannot go quietly blind.
Its limits are in the test javadoc: a body-local collection is invisible, the comparator is invisible
so a legitimate Comparator-taking construction is still reported, and it covers core's classpath -
measured, no main source outside core declares any of those types.

EVIDENCE. ShardStaleSweepReplacementEvictionTest drives the seam deterministically rather than by
racing: ShardSeamTestBase's spied PartitionStateManager lands the controller's replacement at an
exact instruction inside the sweep. The defect arm was red against master. Restoring the old
coordinate-based equals/hashCode and changing nothing else sends the defect arm and the premise arm
red - "expected specific instance ... but was: null" and "expected not to be" the same coordinates -
while the control arm stays green, as it must: a sweep with nothing racing it never has to say which
of two containers it meant. Restoring removeWorkAtOffset(entry.getKey()) in the sweep sends exactly
the defect arm red. The premise arm, twoContainersAtOneOffsetMustNotBeInterchangeable, asserts the
equality contract directly and is the tripwire for a reintroduced coordinate-based equals.

TREE-WIDE SWEEP for what identity equality breaks: one test assertion, ShardManagerTest's
isNotEqualTo between containers at different offsets, became vacuous and is restated against
RetryQueue.WorkContainerKey, which is what the queue keys on. PollContext.getByTopicPartitionMap's
Set de-duplication becomes a no-op with no observable change, said in an @implNote at the site.
Checked and found empty: no ArgumentCaptor or Mockito matcher over a container, no Truth containment
assertion over containers except on the same instance, no container as a Map key or Set element in
any test helper, and every Lincheck harness returns primitives from its operations in stress mode.

SAME-DEFECT-CLASS SWEEP over core main, with a correction to this branch's own earlier result: an
earlier commit reported holdingDispatchPermit as a real unfixed hit and opened an inflight note for
it. That defect does not exist - the sweep matched the declared type Set<WorkContainer> and stopped,
and a collection's semantics live in its initialiser, not its declaration. The note is deleted and
the lesson is in the solutions write-up. Dismissed with reasons: ProcessingShard.onSuccess,
removeWorkAtOffset from the revocation path, RetryQueue, the metrics and counter maps,
OffsetSimultaneousEncoder.activeEncoders, MDC.remove.

CI SIGHTING RECORDED, NOT DIAGNOSED. Chaos Pain Suite shard 4 went red once on
ChaosChurnStormIT's ZOMBIE_MEMBER/REBALANCE_BLOCKED arm with maxInstanceStall=0ms; that line has an
open ledger on master, and seed 1053013618367208111 is appended to
docs/inflight/test-857-churn-storm-async-stalls.md because the seed dies with the CI log. Nothing on
the rebalance path reads WorkContainer.equals, and the shard was green on every later push.

DOCS. docs/inflight/bug-stale-sweep-iterator-evicts-fresh-replacement.md is resolved and deleted,
its mechanism and rejected alternatives migrated to
docs/solutions/logic-errors/a-by-key-removal-cannot-say-which-container-it-meant-2026-09-07.md,
cross-linked with the confluentinc#909 write-up. docs/refactoring.md's queued-breaking-change
section now states that an entry is deleted in the PR that lands it, because the commit message
carries the release-note content and the section lists only what is still queued; the entries
marked DONE there are removed, and the two citations that pointed at this branch's own entry -
WorkContainer's class javadoc and the solutions write-up - name this commit as the record instead.
docs/inflight-tool.md used the resolved note as the worked example for the vet command; the example
now names a surviving note with the same data-loss signal, bug-run-length-plausibility-ceiling.md.

Co-authored-by: Claude Fable 5.1 (1M context) <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Sep 8, 2026
…ller collects what it leaves (#481)

WHAT CHANGED FOR A USER: a rebalance can no longer be delayed by however long the control loop's
retry-queue scan takes, in any ordering or commit mode. `RetryQueue.remove` takes an unbounded, FAIR
`writeLock().lock()`, and every Kafka rebalance callback reached it on the broker-poll thread - by
direct call through `ShardManager.removeWorkFromShardFor` on revoke and lost, and by the method
reference `.map(retryQueue::remove)` through `ShardManager.removeStaleContainers` on all three,
assigned included. The controller thread holds the matching READ lock for a whole scan
(`RetryQueue.iterator()` hands it out; `ShardManager.getLowestRetryTime` closes it only after a full
iteration), and a fair lock queues an arriving writer behind that scan rather than interleaving. The
wait sits inside `consumer.poll()` with the whole group waiting, spent out of `max.poll.interval.ms`.
No cycle was found: an unbounded wait, not a deadlock. No fork issue exists; found by the
confluentinc#857 defect-class sweep (#29).

THE FIX: THE POLL THREAD NEVER TOUCHES THE RETRY QUEUE. The callbacks remove from the SHARDS only - a
`ConcurrentHashMap` of `ConcurrentSkipListMap`s, no lock to wait for and so nothing to decline.
`ShardManager.purgeDepartedRetryEntries()` then collects, on the controller thread where waiting is
allowed, every retry-queue entry whose container `ProcessingShard.isResident` says has left: scan
under the read lock, close the iterator, remove the collected entries under the write lock in one
`removeAll`. The invariant, stated once at the purge: a retry-queue entry with no resident container
is garbage the controller collects; it may exist for at most one control-loop tick; the callbacks are
free to create it.

Where it runs: at the top of `ShardManager.getWorkIfAvailable`, the one point the control loop reaches
unconditionally every pass in both RUNNING and DRAINING, and before `drain()` reads
`getNumberOfWorkQueuedInShardsAwaitingSelection` in the same pass - the consequence that matters,
because #437 established that a queue-only orphan surviving that figure holds
a draining close open to its timeout. The bound is one tick in every ordering mode: the purge scans the
queue rather than the shards, so the ordered modes' shard-scan break cannot delay it.

#468 landed while this was open and settles by construction what this branch argued:
`WorkContainer` equality is now identity, so the controller-side stale branch's compare-and-remove evicts
only the container it inspected, and the purge's by-key removal no longer rests on the single-writer
argument alone.

Why scan and remove may be two steps: departure is monotonic (`isResident` is reference identity and
nothing re-inserts the same instance), and the queue has exactly one writer - `RetryQueue.add` is
`@ControllerThreadOnly`, its only production caller is `ShardManager.onFailure`, and the purge runs on
that same thread. A second writer is what would reopen this, and both sites now say so: a `false` from
a removal there can only mean one exists.

THE DESIGN IT SUPERSEDES, NAMED. #431 kept the poll thread on the queue and
made it DECLINE: `tryRemove`, abandon the paired shard removal on refusal, and after
#437 a second ask after the shard removal with a put-back on refusal. It was
correct and proven, and it lost on machinery: a second non-blocking entry point keyed differently from
the blocking one, a queue reference threaded into a second `ProcessingShard` method, two asks per
removal, and a retirement bound that varied by ordering mode. Also rejected: reusing
#466's control-thread hand-off, which has the poll thread WAIT on a future -
right for a revocation commit, wrong here, because the purge needs no hand-off at all.

COUNTERS DURING THE WINDOW, RE-MEASURED. Between a callback's shard removal and the purge,
`getWorkableRecords` reads one LOW - the safe direction: `isSufficientlyLoaded()` reads false and the
poller fetches sooner; high would have paused it with nothing to process. `WorkManagerTest`'s
revocation arm pins the direction. #437's post-add residency confirmation in
`ShardManager.onFailure` becomes belt-and-braces and is kept this round, its javadoc saying so.

THE STATIC GATE GOES GREEN ON MERIT. `ArchitectureTest.rebalanceCallbacksMustNotBlock` (widened in
#465 to follow method references and `@ControllerThreadOnly`) carried
eighteen exemptions for exactly these reaches. With the set emptied and the callbacks still reaching
the queue it reports every route; with the callbacks off the queue it is green and the set stays empty.
The set, its `root => target` keying and the argument for keeping it remain - an exemption is how a
newly found reach is recorded as a defect on the books.

EVIDENCE, AS SHAPE AND REPRODUCE COMMANDS. `RetryQueueRebalancePathTest` holds the read lock the way
the controller does - a live iterator on another thread - and drives the real callback on a thread
named `broker-poll`: red on unfixed code, both callbacks parked on the write lock until the deadline;
green after, with the departed entry collected on the next controller pass, a queue-only entry no
longer holding drain open, the ordered-mode arm collected on the same tick, and a still-resident entry
left alone as the control. Ablations: deleting the purge call reds arms across three classes;
inverting the residency predicate reds the same plus the control. Two arms from #437's window test are
re-stated rather than deleted, because the sweep they described stopped existing. The contended harness
was then folded into the shared `BlockedThreadAsserter` (a `returnsWithin` idiom that returns the fact
rather than asserting it, so a caller can hold the contention while it reads state), re-proved red by
restoring the queue removal to both callback paths. The three `DLS_DEAD_LOCAL_STORE` findings this
branch's own lines introduced are cleared by using the values - logged, or a `void` return - rather
than parking them.

Reproduce: `bin/ci-unit-test.sh`; `bin/lincheck-test.sh`; `bin/check-all.sh`;
`./mvnw -Pci -pl parallel-consumer-core -am test -Dtest='RetryQueueRebalancePathTest,RetryQueueRequeueWindowTest,WorkManagerTest,ArchitectureTest'`;
`bin/check-pr-analysis-surfaces.sh 481`.

RECORDED, NOT APPLIED. The purge is the first unconditional full scan of the retry queue on the control
loop; both simplify reviewers converged on gating it behind a departure signal (a monotonic
`LongAdder` in `RecordPopulation`'s shape). Not done here: it would put poll-thread-written state back
on the rebalance path, and the cost is unmeasured - `DispatchScanMeter` is the precedent for metering
first. Filed as `docs/inflight/perf-retry-queue-purge-scan-is-unmetered.md` with that order stated.

RECORDS. `docs/solutions/runtime-errors/retry-queue-write-lock-on-the-rebalance-path.md` records both
designs. Retired: `docs/inflight/bug-retry-queue-write-lock-on-the-rebalance-path.md`,
`pr-431-must-pair-its-queue-removal-with-the-shard-removal.md`, and the branch note that guarded the
superseded PR while it was still open. Corrected beside their dated text: the
ArchUnit rules note (the set is empty on merit), the RetryQueue coverage note, the shard-displacement
note (its harm is now bounded by one tick), the runtime-ownership-guard note (the single-writer premise
makes that guard more load-bearing), two notes that named #431 as the fix, and the orphan-window
write-up (its assertion stays as written; the confirmation is belt-and-braces).

Co-authored-by: Claude Fable 5.1 (1M context) <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Sep 8, 2026
… and the guard is outside the class (#483)

Settles the one open question on
docs/inflight/bug-shard-displacement-orphans-the-retry-queue-entry.md: whether
production can reach ProcessingShard.addWorkContainer's displacement branch with a
queue-resident container, which decides whether the pairing gap there is worth a
design change. It cannot. No behaviour changes - the diff is a test, a solutions
write-up, and comments.

The branch itself IS reachable: confluentinc#909's late drain puts a stale resident
in a shard and the next poll's fresh record displaces it. What cannot happen is
that resident also holding a retry-queue entry.

THE ARGUMENT, EACH LEG TRACED IN SOURCE

An orphan needs four things true at once when a container B arrives at
(topic, partition, offset): a resident A; A observed STALE, or the arrival is
dropped; A holding a RetryQueue entry; and B existing at all.

1. The displaced container is always the one inspected. workMap has two insertion
   sites - addWorkContainer, which is control-thread-only, and the test-only
   plantResident. Only removals can interleave between the get and the put, and a
   removal makes the put return null. A by-key REMOVAL can hit a different occupant
   (#468's class); a by-key insertion cannot, with one inserting thread.
2. A queue entry implies non-stale-and-resident when it was made. RetryQueue.add
   has exactly one production caller, ShardManager.onFailure, behind
   onFailureResult's live staleness check and, since #437, a post-add
   residency confirmation. couldBeTakenAsWork refuses a stale container outright,
   so one that is stale on arrival is never selected, never fails, never queues.
3. Staleness is monotone: both epochs are final longs, the fence is set and never
   cleared, a replaced state carries a higher epoch or is the removed singleton.
4. So A must cross the staleness boundary in between, and only three transitions
   can do it - the removed-state swap, the assignment putAll, and
   fenceForRevocation. The first two each unseat A on the same thread inside the
   rebalance callback; the fence sweeps nothing but cannot be followed by a second
   container at the same offset, because a duplicate offset needs a re-assignment
   and that is the swept path.

Bumping the epoch map alone is NOT one of those transitions, and this is the leg
most easily got wrong by reading: PartitionState's epoch is final and staleness is
only asked through the state object, so the window opens at the state REPLACEMENT -
which is the same statement as the sweep that closes it.

WHAT THIS DOES NOT CLAIM, AND IT IS THE POINT OF THE WRITE-UP

The last leg is a property of the KAFKA CONSUMER's fetch position, not of this
engine: within one assignment generation the position never goes backwards, so a
duplicate offset needs a re-assignment. Nothing in main calls seek, and shards are
partition-scoped in every ordering mode. So the pairing gap in that branch is one
arrival away from being real rather than absent. An in-generation replay of an
already-registered offset - a seek, an offset-reset or truncation replay - makes it
reachable immediately, and nothing goes red for that. #481's purge would
then collect it within one control-loop tick, which is the second, independent
answer: the harm is bounded whatever happens, and this work says the case does not
arise. Neither result implies the other.

ORDERING-MODE INDEPENDENCE, RAISED IN REVIEW AND CLOSED UNDER TEST

Legs one to six never consult the shard key. The mode is visible only in leg
seven's second half, and is safe in every mode because a shard is partition-scoped
throughout - PARTITION and UNORDERED make it a topic-partition, KEY makes it
topic-plus-partition-plus-key. The disproof arm is parameterised over every
ProcessingOrder, and a dedicated arm covers the KEY half: two records sharing a key
and an offset on different partitions must be held in two shards, not collide in
one. Under KEY an emptied shard is garbage-collected, which makes the conclusion
stronger, not weaker - a collected shard holds nothing to displace.

HOW IT WAS ESTABLISHED

ShardDisplacementOrphanReachabilityTest, four arms over six cases, control-armed
because a single green arm here is green whether the sweep works or the branch is
simply never reached: the production rebalance sequence; confluentinc#909's late
drain, which fires the branch with an unqueued container; a positive control that
reaches stale-and-resident-and-queued through the production API via the fence and
injects the one arrival production cannot supply, where the orphan appears
immediately, asserted by reference; and the KEY-ordering collision arm.

Ablation, predicted before running and re-run after each of the three merges this
branch took, because #481 made the sweeps shard-only and #468 made
each removal a compare-and-remove - an ablation against a shape that no longer
exists is evidence about nothing. Same result every time: either sweep alone green,
both removed red at the load-bearing assertion. The KEY arm was separately verified
by sabotage - making the key-ordered shard key topic-scoped turns exactly that arm
red, and ShardKeyTest stays green under the same sabotage, which is why the arm is
not redundant with it.

Two predictions were refuted and are kept visible rather than quietly fixed: that
the epoch bump opens the window, and that the replacement would be handed out on the
controller pass after the fence - it is not, because the fence makes the whole
partition stale.

DEFECT-CLASS SWEEP - BY-KEY REMOVALS THAT CAN HIT A DIFFERENT OCCUPANT

Reported against the post-astubbs#468 tree rather than fixed here:

- ProcessingShard.removeStaleWorkContainersFromShard and getWorkIfAvailable's
  last-resort sweep - both now conditional on the inspected container. Fixed by
  #468.
- ProcessingShard.onSuccess - still removes by key. #468 reasoned about it
  explicitly and left it, on the grounds that the container it removes cannot have
  been replaced. Checked, and left to that argument.
- ShardManager.removeWorkFromShardFor - the revoke path's removeWorkAtOffset on the
  poll thread, and the one remaining unconditional by-key shard removal. Reported,
  not fixed: it belongs with #468's mechanism, not with a reachability proof.
- RetryQueue.remove / removeAll - by coordinates and never by identity, at every
  call site. Deliberate, but it means a removal can clear a replacement's entry;
  ShardManager.onSuccess removes by key before it looks up any shard, so a late
  success for a departed container clears a fresh one's parked-for-retry entry. The
  cost is an early retry, not a stall or a loss. Noted, not raised as a defect.

A cleared suspicion #468 recorded independently at the last-resort sweep
rests on the SAME single-writer fact as leg one, reached from the other direction.
Both clearances therefore reopen on one ungated condition - anything that puts into
a shard off the controller thread - and that is now said at every site that depends
on it.

WHAT IS LEFT FOR THE OWNER

The inflight note stays OPEN with a PROPOSED closed - unreachable AND bounded
vetted marker rather than being closed here: its impact is misdirection, and
docs/inflight/AGENTS.md reserves that state change for the owner.

Co-authored-by: Claude Opus (1M context) <noreply@anthropic.com>
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