Skip to content

fix(core): the poll thread never touches the retry queue - the controller collects what it leaves - #481

Merged
astubbs merged 9 commits into
masterfrom
fix/retry-queue-controller-purges-departed-entries
Sep 8, 2026
Merged

astubbs merged 9 commits into
masterfrom
fix/retry-queue-controller-purges-departed-entries

Conversation

@astubbs

@astubbs astubbs commented Sep 8, 2026 •

Copy link
Copy Markdown
Owner

No fork issue exists for this - the defect was found by a defect-class sweep and tracked only as an in-flight note, which this PR retires.

This supersedes #431, which fixes the same defect and should not be merged. That PR is correct and proven; it is more machinery than the defect needs. It is not closed here - that is the owner's call. See "Why this rather than #431" below.

Description

The defect

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 the revoke and lost paths;
  • by method reference (.map(retryQueue::remove)) through ShardManager.removeStaleContainers, on the assigned path as well as those two.

The controller thread holds the matching read lock for a whole scan - RetryQueue.iterator() hands it out and it is released only at close, which ShardManager.getLowestRetryTime does around an entire iteration. The lock is fair, so an arriving writer queues behind that scan rather than interleaving with it. That wait sits inside consumer.poll() with the whole group waiting on it, spent out of max.poll.interval.ms. No cycle was found, so this is an unbounded wait, not a deadlock.

The fix

The poll thread never touches the retry queue. The controller thread collects what it leaves.

  • The rebalance callbacks remove from the shards only - a ConcurrentHashMap of ConcurrentSkipListMaps, with no lock to wait for and so nothing to decline.
  • ShardManager.purgeDepartedRetryEntries() collects, on the controller thread where waiting is allowed, every retry-queue entry whose container ProcessingShard.isResident says has left. It scans under the read lock, closes the iterator, then removes 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 through retrieveAndDistributeNewWork in both RUNNING and DRAINING, and before drain() reads getNumberOfWorkQueuedInShardsAwaitingSelection in that same pass. The drain path is the consequence that matters: #437 established that a queue-only orphan survives that figure's flooring once the pipeline is drained, so it reads true forever and a draining close hangs to its timeout.

The bound is one control-loop tick in every ordering mode. The purge scans the retry queue rather than the shards, so the ordered modes' shard-scan break - which stops the scan at the first container handed out - cannot delay it. This is the one place the shipped design is strictly better than #431's rather than merely smaller: that one's bound was "until the takeable head in front of it leaves the shard".

Why the scan and the removal can be two steps. Departure is monotonic (isResident is reference identity, and nothing re-inserts the same instance), and nothing else writes the queue's keys: RetryQueue.add is @ControllerThreadOnly, its only production caller is ShardManager.onFailure, and the purge runs on that same thread. The second half matters because RetryQueue removes by topic/partition/offset and so cannot say which container it meant - the defect class of #468. What would reopen it is a second writer of the retry queue.

Why this rather than #431

That PR keeps the poll thread on the queue and teaches it to 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. Over the same three main-code files it is +347 -72 against +185 -67 here, and most of the latter is javadoc stating the invariant. What those lines buy is the part that matters: a second non-blocking entry point on RetryQueue keyed differently from the blocking one, a queue reference threaded into a second ProcessingShard method, two asks per removal, and a retirement bound that varies by ordering mode.

Also rejected, by name: reusing #466's control-thread hand-off. That mechanism has the poll thread wait on a CompletableFuture for the controller to serve a posted request - right for a revocation commit, which is not correct until the commit has happened; wrong here, because the purge needs no hand-off at all (the controller discovers departed entries by scanning) and reusing that shape would reintroduce the very wait being removed. A dirty flag set by the callbacks was also rejected: a second piece of cross-thread state on a class whose whole difficulty is cross-thread state, for a scan the control loop already performs on the same structure.

Counters during the one-tick window, re-measured on this tree

Between a callback's shard removal and the purge, getWorkableRecords (inShards - parkedForRetry) reads one LOW - negative in the single-record case. Low is the safe direction: isSufficientlyLoaded() is workable > threshold, so it fetches sooner; high would pause the poller with nothing to process, which is the confluentinc#857-family stall shape. WorkManagerTest.theLoadGateReadsLowNotHighForTheTickAfterARevocation pins the direction and that one controller pass settles it. This re-confirms what #437's squash body measured about the same figure.

What #437's residency confirmation became

ShardManager.onFailure adds to the retry queue and then confirms shard residency, undoing the add if the container has left. Against a shard-only sweep it still closes two of the three interleavings; the third - the sweep starting after the residency read - is now collected by the purge a tick later. So it is belt-and-braces, kept this round, with its javadoc saying so and naming it as a live question rather than a settled one. Removing it is a separate decision with its own evidence to gather.

Its test RetryQueueRequeueWindowTest.theProductionSweepsQueueRemovalIsGatedOnItsShardRemoval asserted a property of a sweep that no longer exists. It is re-stated rather than deleted, as theProductionSweepLeavesTheRetryQueueToTheController: the sweep touches no queue at all, and the controller pass afterwards collects exactly the departed entry and leaves the resident one - so it still goes red both if a callback starts touching the queue again and if the purge stops discriminating. theSameRebalanceOneSeamLaterTakesTheQueueEntryWithTheShardEntry is re-stated the same way. aQueueFirstSweepDefeatsTheOneShotConfirmation keeps its name and its assertion, because two write-ups cite it; its javadoc now says it models a superseded design rather than an incoming one.

Evidence

Red first, then green. RetryQueueRebalancePathTest holds the read lock exactly the way the controller thread does - through a live RetryQueue.iterator() - and drives the production callback on a thread named broker-poll. The harness is adapted from #431, including its load-bearing join placement. Against origin/master, five of six arms fail:

Tests run: 6, Failures: 5
  aRevokeDoesNotTouchTheRetryQueueAndSoCannotWaitForItsWriteLock     - callback still parked on the write lock at the deadline
  theStaleSweepDoesNotTouchTheRetryQueueEither                       - same, through the epoch-change sweep
  aDepartedEntryIsCollectedByTheNextControllerPass                   - no collection exists
  aQueueOnlyEntryNoLongerHoldsTheDrainOpen                           - isRecordsAwaitingProcessing() stays true
  underOrderedProcessingADepartedEntryIsStillCollectedOnTheSameTick  - no collection exists

anEntryWhoseContainerIsStillResidentIsNotCollected is the control and is green throughout. With the fix, all six pass.

Ablations. Deleting the purge call turns six arms red across three classes. Inverting the residency predicate turns seven red - the same six plus the control, which is what the control is for.

The ArchUnit rule was proven on merit, not assumed. With KNOWN_BLOCKING_VIOLATIONS emptied and the callbacks still reaching the queue, rebalanceCallbacksMustNotBlock reports 24 violations (18 exemption keys; the @ControllerThreadOnly half fires once per route, so the revoke and lost roots report through both removeWorkFromShardFor and removeStaleContainers). With the callbacks off the queue it is green with the set still empty. All eighteen entries are deleted. 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 rather than deleted from the report.

RetryQueueLincheckTest needs no new operation, and that is a claim rather than an omission: this PR adds no new production write path to RetryQueue. The purge composes iterator() and the existing removeAll, both already modelled. ShardManagerLincheckTest and the whole Lincheck lane (bin/lincheck-test.sh) were run and are green.

Gates run locally, in the foreground: bin/check-all.sh (16 passed, 0 failed), bin/lincheck-test.sh (green), bin/ci-unit-test.sh (green across every module). No Docker-backed tests were run - the box is short of disk - so the integration lanes are CI's.

Defect-class sweep - other instances of "a rebalance callback waits"

ArchitectureTest.rebalanceCallbacksMustNotBlock is the mechanical sweep for this class and is now green on merit with no exemptions, which is a stronger answer than a grep. What it cannot see is stated in its own javadoc and in ControllerThreadOnly's: a synchronized BLOCK is a MONITORENTER, invisible at any depth (PCMetrics.removeMeter's monitor and clearCommitCommand()'s are the two known ones, both left alone deliberately); a stored-rather-invoked method reference has the same shape as an invoked one; and dynamic dispatch through a user-supplied ConsumerRebalanceListener is out of reach. None of those is changed here. Infer's @Lockless is the only tool that can enumerate the monitors, and its verdicts are already recorded in the core AGENTS.md.

Simplify pass

ce-simplify-code, three reviewers over the diff. Two findings applied, one recorded rather than applied.

Applied - the new test hand-rolled a harness BlockedThreadAsserter already is. It built its own thread, latch, bounded await and join. That class gains a third idiom, returnsWithin(function, threadName, budget) plus joinQuietly - the negative of the two it had, because a caller proving a function does NOT block has to keep holding the thing it would wait for and read state while the contention is on, so it cannot give up its own thread to an assertion helper. Beyond deduplication this buys runCapturingThrowable: a callback that throws on entry returns promptly and was otherwise indistinguishable from one that did its job, which for a test asserting promptness is a false pass. Re-proved after the refactor rather than assumed - restoring the queue removal to both callback paths turns three arms red again, the two lock ones by timing out; BlockedThreadAsserterTest and ProducerManagerTest are green.

Applied - ShardManager.onFailure's residency branch described a race that no longer exists. Its comment and log read a false from retryQueue.remove(wc) as "the revoke sweep's own paired removal got there first". That cannot happen now, so true is the only outcome production can produce and false became a signal: it would mean a second writer of the retry queue exists, which is the one thing that invalidates the purge's scan-then-remove. Said that way at the site.

Recorded, not applied - the purge is the first unconditional full scan of the retry queue on the control loop. The quality and efficiency reviewers found this independently. Every other reader there early-stops on the retryDueAt sort order; shard residency has no relationship to that order, so this one cannot, and it finds nothing on most ticks. The review also sharpened the fix: a monotonic LongAdder on departure, in the shape RecordPopulation already uses at those very call sites - not the boolean dirty flag the design rejected - which keeps the one-tick bound trivially.

Not applied here for two reasons, both stated in the write-up's rejected alternatives and the branch note: it puts poll-thread-written state back on the rebalance path in the change whose point is taking the poll thread off this structure, and the cost is unmeasured. DispatchScanMeter is this class's own precedent for metering exactly this, and the honest order is meter, then decide. Queued as a decision rather than lost as a review comment.

Also confirmed and deliberately not acted on: the per-tick ArrayList allocation is free (the no-arg constructor defers the backing array), and the fair read lock held across the scan cannot hurt the poll thread any more, because the poll thread no longer touches that lock at all.

Collisions

Textual only; none conflicts in design. #468, #431, #410, #392 and #362 all touch ShardManager or ProcessingShard around the sweep; #408 touches ArchitectureTest. Whichever lands second resolves the text.

Records

  • docs/solutions/runtime-errors/retry-queue-write-lock-on-the-rebalance-path.md is new and records both designs, adapted from the write-up fix(core): the rebalance callbacks decline the retry queue's write lock instead of waiting for it #431 wrote for itself so its diagnosis is preserved rather than re-derived.
  • docs/inflight/bug-retry-queue-write-lock-on-the-rebalance-path.md and docs/inflight/pr-431-must-pair-its-queue-removal-with-the-shard-removal.md are retired into it.
  • Dated corrections, beside the original text and never over it, in static-archunit-main-code-rules.md, test-retry-queue-behaviour-untested.md, bug-shard-displacement-orphans-the-retry-queue-entry.md, core-retry-queue-needs-a-runtime-controller-ownership-guard.md, test-largenumberofinstances-residual-failures-measured-not-explained.md, static-infer-threadsafe-is-blocked-by-third-party-interfaces.md, and docs/solutions/runtime-errors/retry-queue-orphan-window-between-the-requeue-check-and-the-add.md.
  • docs/inflight/branch-retry-queue-controller-purge.md is the working note.

Checklist

  • Docs updated - the solutions write-up, the retired notes and seven dated corrections, all listed above
  • User-facing feature documentation data added under docs/features/ - N/A - a concurrency defect fix with no user-facing feature or option; the observable change is that a rebalance is no longer delayed by the control loop's retry-queue scan
  • Tests added/updated - RetryQueueRebalancePathTest (new, red-first), plus re-stated arms in RetryQueueRequeueWindowTest and WorkManagerTest, and the emptied KNOWN_BLOCKING_VIOLATIONS
  • docs/inflight/ working note (pr-/branch-) started at the PR's first commit - docs/inflight/branch-retry-queue-controller-purge.md; it will be renamed to pr- if the number is worth carrying
  • Title & body reflect the final content of this PR
  • Ran ce-simplify and ce-code-review locally - ce-simplify-code ran on the diff vs origin/master with all three reviewers (reuse, quality, efficiency); its findings and dispositions are in the "Simplify pass" section above. ce-code-review was NOT run locally: @claude review this is asked for on the PR instead, which is the route that can open inline review threads and so the one that mechanically blocks the merge

🤖 Generated with Claude Code

https://claude.ai/code/session_018rEzrWYFr6oEzy6porczd3

astubbs and others added 5 commits September 8, 2026 01:19
…rite lock

RED ON PURPOSE at this commit. RetryQueueRebalancePathTest holds RetryQueue's READ lock exactly the
way the controller thread does - through a live iterator, which ShardManager.getLowestRetryTime keeps
open for a whole scan - and then drives the production rebalance callback on a thread named
broker-poll. The lock is constructed fair, so an arriving writer queues behind that scan instead of
interleaving with it, and the wait is spent inside consumer.poll() out of max.poll.interval.ms.

Five of the six arms fail against this tree:

- aRevokeDoesNotTouchTheRetryQueueAndSoCannotWaitForItsWriteLock - the callback is still parked on
  the write lock when the ten-second deadline passes (ShardManager.removeWorkFromShardFor calls
  retryQueue.remove).
- theStaleSweepDoesNotTouchTheRetryQueueEither - the same, through the epoch-change sweep. Driven by
  re-assigning an already-assigned partition, which is what increments the epoch and then runs
  ShardManager.removeStaleContainers in one callback; that method maps the METHOD REFERENCE
  retryQueue::remove, which is why this reach stayed invisible to ArchitectureTest until
  #465 taught the walk to follow references.
- aDepartedEntryIsCollectedByTheNextControllerPass, aQueueOnlyEntryNoLongerHoldsTheDrainOpen and
  underOrderedProcessingADepartedEntryIsStillCollectedOnTheSameTick - all assert a controller-side
  collection that does not exist yet.

anEntryWhoseContainerIsStillResidentIsNotCollected is the control and is green here and after: a
parked-for-retry container that is still resident is ordinary state, not garbage.

The contended-read-lock harness and the parked-for-retry fixture are adapted from
#431, which built them for the design this branch supersedes. Its join
placement is load-bearing and is kept: the poll thread is joined only after the try-with-resources
releases the read lock, because on unfixed code it is parked until then.

Reproduce: JAVA_HOME=<jdk17> ./mvnw -Pci -pl parallel-consumer-core -am test -Dtest=RetryQueueRebalancePathTest

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018rEzrWYFr6oEzy6porczd3
…ller collects what it leaves

The diagnosis. 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 the revoke and lost paths, and by 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 and it is released only at close, which ShardManager.getLowestRetryTime does around an
entire iteration - and the lock is fair, so an arriving writer queues behind that scan rather than
interleaving. That wait sits inside consumer.poll() with the whole group waiting on it, spent out of
max.poll.interval.ms. No cycle was found, so this is an unbounded wait rather than a deadlock.

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 mode or commit mode.

The fix. The callbacks remove from the SHARDS only - a ConcurrentHashMap of ConcurrentSkipListMaps,
with 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: it scans under the read lock, closes the iterator, and
removes the collected entries under the write lock in one acquisition via 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, and why there. At the top of ShardManager.getWorkIfAvailable - the one point the
control loop reaches unconditionally every pass through retrieveAndDistributeNewWork in both RUNNING
and DRAINING, and before drain() reads getNumberOfWorkQueuedInShardsAwaitingSelection in that same
pass. The drain path is the consequence that matters: #437 established that
a queue-only orphan survives that figure's flooring once the pipeline is drained, so it reads true
forever and a draining close hangs to its timeout.

The bound is one control-loop tick in every ordering mode. The purge scans the retry queue rather
than the shards, so the ordered modes' shard-scan break - which stops the scan at the first container
handed out - cannot delay it. That is the one place this design is strictly better than the rejected
one rather than merely smaller.

Why the scan and the removal can be two steps. Departure is monotonic (isResident is reference
identity and nothing re-inserts the same instance), and nothing else writes the queue's keys:
RetryQueue.add is @ControllerThreadOnly, its only production caller is ShardManager.onFailure, and
the purge runs on that same thread. The second half matters because RetryQueue removes by
topic/partition/offset and so cannot say which container it meant - the defect class of
#468. What would reopen it is a second writer.

The rejected design, 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 is
correct and it is proven; it costs 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. Over the same three main files it is +347 -72
against +185 -67 here, most of the latter javadoc. Also rejected: reusing
#466's control-thread hand-off, which has the poll thread WAIT on a
CompletableFuture - right for a revocation commit, wrong here, because the purge needs no hand-off
at all and reusing that shape would reintroduce the wait being removed.

Counters during the window, re-measured on this tree. Between a callback's shard removal and the
purge, getWorkableRecords (inShards - parkedForRetry) reads one LOW - negative in the single-record
case. Low is the safe direction: isSufficientlyLoaded() is workable > threshold, so it fetches
sooner; high would pause the poller with nothing to process. WorkManagerTest's revocation arm was
re-stated to pin the direction and that one pass settles it.

#437's post-add residency confirmation in ShardManager.onFailure becomes belt-and-braces - the
purge would collect the orphan it prevents a tick later - and is kept this round, with its javadoc
saying so and naming it as a live question rather than a settled one.

Evidence. Red-then-green: the five red arms of the previous commit are green, with the control arm
green throughout. Ablations: deleting the purge call turns six arms red across three classes;
inverting the residency predicate turns seven red - the same six plus the control. The ArchUnit rule
was proven on merit rather than assumed: with KNOWN_BLOCKING_VIOLATIONS emptied and the callbacks
still reaching the queue it reports 24 violations (18 exemption keys; the @ControllerThreadOnly half
fires once per route), and green afterwards with the set still empty. All eighteen entries are
deleted; the set, its root => target keying and the argument for keeping it remain, because an
exemption is how a newly-found reach is recorded as a defect on the books.

Also: RetryQueue.removeAll widens to Collection<? extends WorkContainer<?, ?>> - the body only reads
topic/partition/offset, and no <K, V> signature accepts the WorkContainer<?, ?> the queue's own
iterator yields without an unchecked cast. Error Prone's UnnecessaryTypeArgument found the three test
call sites that carried a now-redundant type witness.

Two existing arms are re-stated rather than deleted, because the sweep they described stopped
existing: theProductionSweepsQueueRemovalIsGatedOnItsShardRemoval becomes
theProductionSweepLeavesTheRetryQueueToTheController (the sweep touches no queue; the controller pass
then collects exactly the departed entry and leaves the resident one), and
theSameRebalanceOneSeamLaterTakesTheQueueEntryWithTheShardEntry becomes ...LeavesTheQueueEntryForThe
ControllerToCollect. aQueueFirstSweepDefeatsTheOneShotConfirmation keeps its name and assertion - two
write-ups cite it - and gains a javadoc saying it now models a superseded design rather than an
incoming one.

Collides textually with #468, #431, #410, #392 and #362 on the sweep, and
#408 on ArchitectureTest; none of them conflicts in design.

Reproduce:
  JAVA_HOME=<jdk17> ./mvnw -Pci -pl parallel-consumer-core -am test \
    -Dtest='RetryQueueRebalancePathTest,RetryQueueRequeueWindowTest,WorkManagerTest,ArchitectureTest'

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018rEzrWYFr6oEzy6porczd3
…ve records that named #431

The defect is fixed, so its in-flight note has stopped describing reality. Following the four
outcomes in docs/inflight/AGENTS.md, what outlives the work is migrated first and only then is the
file removed.

New: docs/solutions/runtime-errors/retry-queue-write-lock-on-the-rebalance-path.md records BOTH
designs. Design A (#431) prevents the split - decline with tryRemove,
abandon the paired shard removal on refusal, ask again after it - with why it was correct, why it was
proven, and why it lost on machinery rather than on correctness. Design B is what shipped: the poll
thread never asks, and the controller collects retry-queue entries whose container is resident in no
shard. It carries the invariant, the one-tick bound, the two-step scan's safety argument, the counter
direction, the rejected alternatives (including reusing #466's hand-off) and
the red-then-green evidence. The write-up is adapted from the one Design A wrote for itself, so its
diagnosis sections are preserved rather than re-derived.

Removed: docs/inflight/bug-retry-queue-write-lock-on-the-rebalance-path.md (retired into the above)
and docs/inflight/pr-431-must-pair-its-queue-removal-with-the-shard-removal.md, whose whole subject -
#431's queue-first sweep needing a second removal - is a property of a design that will not
land; its reasoning is in Design A's section.

Added: docs/inflight/branch-retry-queue-controller-purge.md, for the three things no command will
tell a reader - that #431 is still open and must not be merged, which open
PRs collide textually on the sweep, and which decisions this deliberately leaves open.

Corrected beside their dated text, never over it, because each is a record of a measurement or a
state at a date:

- static-archunit-main-code-rules.md - KNOWN_BLOCKING_VIOLATIONS is now empty on merit, measured by
  deleting it with the reaches still in place (24 violations). The paragraphs describing the list as
  it was stand; what is corrected is that its named owner is superseded, and that the tryLock sibling
  which would have made @ControllerThreadOnly the only discriminator does not exist. Its citation of
  the retired note is repaired in place as a history pointer, which is the repair docs/citations.md
  prescribes and the file-ref gate recognises.
- test-retry-queue-behaviour-untested.md - two of its four items are now covered, by removal rather
  than by symmetry; the other two are still open and now have RetryQueueTest and
  RetryQueueLincheckTest to read first.
- bug-shard-displacement-orphans-the-retry-queue-entry.md - the displaced container's entry is now
  collected on the next pass, so the FIGURE it names as the harm is bounded by one tick; the pairing
  gap itself and its production-reachability question are unchanged.
- core-retry-queue-needs-a-runtime-controller-ownership-guard.md - its precedent is superseded, and
  the purge's safety resting on the queue having exactly one writer makes that guard more
  load-bearing, not less.
- test-largenumberofinstances-residual-failures-measured-not-explained.md and
  static-infer-threadsafe-is-blocked-by-third-party-interfaces.md - both point a reader at #431
  by number; the refutation in the first is untouched and explicitly not to be re-run.
- docs/solutions/runtime-errors/retry-queue-orphan-window-between-the-requeue-check-and-the-add.md
  gains a dated correction: #431 will not land, so the assertion it says to invert stays as
  written, the confirmation it is about is now belt-and-braces, and "what would reopen it" is
  superseded in one direction and sharpened in the other.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018rEzrWYFr6oEzy6porczd3
That sweep stamped or restated nearly every in-flight note, including all seven this branch touches,
so the conflicts are all in docs and all about the same fact: it recorded #431
as "the fix in flight", which this branch supersedes.

Resolved:

- bug-retry-queue-write-lock-on-the-rebalance-path.md and
  pr-431-must-pair-its-queue-removal-with-the-shard-removal.md - modify/delete, resolved as DELETE.
  Master's additions to both are a vetting stamp confirming the defect was intact on 2026-09-07/08
  and a rewrite of "Fixing it" naming #431. Neither outlives the fix: the stamp's finding is
  the problem this branch closes, and the design it names is the one this branch rejects. Both
  designs and the evidence are in
  docs/solutions/runtime-errors/retry-queue-write-lock-on-the-rebalance-path.md.
- test-retry-queue-behaviour-untested.md - content conflict, resolved by TAKING MASTER'S SHRUNK NOTE
  and re-stating this branch's correction against it. The sweep had already closed the two items the
  correction addressed, and better than the correction did; what it could not know is that two
  sentences in its own text name a mechanism this branch removes - `removeWorkFromShardFor`'s
  ordering, which no longer exists because that method no longer touches the retry queue. The
  correction is now only about those two sentences.

Auto-merged and checked rather than trusted: bug-shard-displacement-orphans-the-retry-queue-entry.md,
static-infer-threadsafe-is-blocked-by-third-party-interfaces.md and
test-largenumberofinstances-residual-failures-measured-not-explained.md each gained a dated vet stamp
above this branch's dated correction, which is the intended shape - the stamp records what was true
on its date, the correction says what moved on 2026-09-08. Two stamps make claims this branch
falsifies (#431 still open as the reason a clause has not gone stale; RetryQueueRebalancePathTest
existing only on that branch) and are deliberately left standing, dated, with the correction beneath.

No vet markers are added by this branch: docs/inflight/AGENTS.md's "Vetting a note" writes the marker
only on the outcome where a note is still true AND unchanged, and every note here is shrunk, corrected
or removed - which is its own record.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018rEzrWYFr6oEzy6porczd3
… and one stale comment

Three reviewers (reuse, quality, efficiency) over this branch's diff. Two findings applied, one
recorded rather than applied, and the reason for that is the interesting part.

APPLIED - the new test hand-rolled a harness BlockedThreadAsserter already is. It built its own
thread, CountDownLatch, bounded await and join, which is exactly that class's machinery; the repo's
rule is to extend the shared helper rather than grow a parallel copy, and a drifted copy of test
setup has already been a flaky-CI source here. BlockedThreadAsserter gains a third idiom,
`returnsWithin(function, threadName, budget)`, and `joinQuietly`. It is the NEGATIVE of the two it
had - they assert a function blocks, this hands back whether one returned - and a caller proving a
non-block usually cannot give up its own thread to an assertion helper, because it has to hold the
thing the function would wait for and read state while the contention is on. That is why it returns
the fact rather than asserting.

What the reuse buys beyond deduplication: `runCapturingThrowable`. A callback that throws on entry
returned promptly, so the hand-rolled version could not tell it from a callback that did its job -
a false PASS for a test asserting promptness. `returnsWithin` raises it instead. The thread name is
the caller's, because these tests are about which thread a call is on and `broker-poll` is what a
stack dump has to say.

Re-proved after the refactor rather than assumed: restoring the queue removal to both callback paths
turns three arms red again, the two lock ones by timing out at the deadline. BlockedThreadAsserterTest
(the negative control for the two existing idioms) and ProducerManagerTest (its main caller) are
green.

APPLIED - `ShardManager.onFailure`'s residency branch still described a race that no longer exists.
Its comment and log said a `false` from `retryQueue.remove(wc)` means "the revoke sweep's own paired
removal got there first", which was true when the sweep removed from the queue. It cannot happen now:
the add is a few lines above, the sweep never touches this queue, and every other removal is on this
same controller thread later in the pass. So TRUE is the only outcome production can produce, and
FALSE became a SIGNAL - it would mean a second writer of the retry queue exists, which is the one
thing that invalidates purgeDepartedRetryEntries()'s scan-then-remove. Said that way at the site,
since nothing asserts it.

RECORDED, NOT APPLIED - both the quality and the efficiency reviewer independently found that the
purge is the first UNCONDITIONAL full scan of the retry queue on the control loop. Every other reader
there early-stops on the retryDueAt sort order; shard residency has no relationship to that order, so
this one cannot, and it finds nothing on the overwhelming majority of ticks. The fix they converge on
is to gate the scan on a departure signal - and the review sharpened what that signal should be: a
monotonic LongAdder in the shape RecordPopulation already uses at those very call sites, not the
boolean flag the design rejected, which also keeps the one-tick bound trivially.

It is not applied here because it puts poll-thread-written state back on the rebalance path, in the
change whose whole point is taking the poll thread off this structure - and because the cost is
unmeasured. DispatchScanMeter is this class's own precedent for metering exactly this, and the honest
order is meter, then decide. Recorded in the write-up's rejected alternatives and in the branch note,
with that order stated, so it is a queued decision rather than a lost review comment.

Also from the same pass, and deliberately NOT acted on: the reviewers confirmed the ArrayList
allocation on an empty tick is free (the no-arg constructor defers the backing array), and that the
fair read lock held across the scan cannot hurt the poll thread any more, because the poll thread no
longer touches this lock at all.

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

astubbs commented Sep 8, 2026

Copy link
Copy Markdown
Owner Author

@claude review this

@claude

claude Bot commented Sep 8, 2026 •

Copy link
Copy Markdown

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


Review

  • Read PR body, commits, and inflight/branch context
  • Read the core diff: RetryQueue, ShardManager, ProcessingShard, ControllerThreadOnly
  • Read the new test RetryQueueRebalancePathTest and the re-stated tests
  • Check ArchitectureTest changes and the emptied exemption list
  • Post review findings

Note on tooling: my allowlist here comes from .github/workflows/claude.yml on master, not this PR's copy, so I could not invoke mvn/shell build commands to re-run the test suite myself. Everything below is from reading the diff directly (git show per-commit, since the shallow clone also blocked range-diffs against origin/master).

Summary

This is a clean, well-reasoned fix. Moving the rebalance callbacks off RetryQueue entirely (rather than teaching them to decline the lock, as #431 did) is the right call — it's strictly simpler and has a provably tighter bound (one control-loop tick in every ordering mode, vs. #431's "until the takeable head leaves the shard"). I traced the invariant through the actual call sites rather than just the prose, and it holds:

  • removeWorkFromShardFor and removeStaleContainers (both reachable from rebalance callbacks) now touch only the ConcurrentHashMap/ConcurrentSkipListMap shard structures — confirmed no retryQueue.remove/.map(retryQueue::remove) remains on those paths.
  • Every remaining retryQueue.remove/add/removeAll call site (ShardManager.onSuccess, .onFailure, .purgeDepartedRetryEntries, ProcessingShard's last-resort stale sweep and post-selection removeAll) is on the controller thread, consistent with the stated single-writer invariant.
  • purgeDepartedRetryEntries()'s scan-then-remove split is safe because RetryQueue.add is @ControllerThreadOnly with a single caller (onFailure) on the same thread as the purge — so there's no window for a fresh entry to land at a just-vacated key between the read-lock scan and the write-lock removal. This is the same defect class as fix(core)!: WorkContainer equality is identity, so the stale sweep removes only the container it inspected #468 but correctly distinguished here (that one had two threads racing; this one doesn't).
  • RetryQueue.removeAll's widened signature (Collection<? extends WorkContainer<?, ?>>) is a legitimate, minimal change — the body only ever needs WorkContainerKey.of(wc), and it's what lets purgeDepartedRetryEntries avoid an unchecked cast on the queue's own WorkContainer<?, ?> iterator.
  • The ArchitectureTest exemption removal is honestly earned, not assumed: the commit message states the set was verified to report 24 violations with KNOWN_BLOCKING_VIOLATIONS emptied and the old code still in place, confirming the rule (not just the fix) is doing real work.

Test coverage

RetryQueueRebalancePathTest is a strong addition — it reproduces the actual hang (holding the read lock via a live iterator, exactly as getLowestRetryTime() does, then driving the real callback on a thread named broker-poll) rather than a synthetic approximation. The ordered-mode arm (underOrderedProcessingADepartedEntryIsStillCollectedOnTheSameTick) specifically defends the claimed advantage over #431 (scanning the queue rather than the shards means the ordered-mode shard-scan break can't delay the purge) — good, since that's the one place this design's superiority isn't just "less code."

The BlockedThreadAsserter.returnsWithin simplify-pass refactor (f0fe343) is a real improvement, not just deduplication — it fixes a genuine gap in the hand-rolled version (a callback throwing on entry would look identical to one that returned promptly, i.e. a false pass for a promptness assertion) and correctly reasons about why the join must be joinable after lock release (joinQuietly, guarded against a never-started thread).

Minor observations (non-blocking)

  • ShardManager.purgeDepartedRetryEntries() is an unconditional full scan of the retry queue on every getWorkIfAvailable call, called every control-loop tick. The PR body itself flags this (two independent reviewers found it, a LongAdder-gated version was considered and deliberately deferred pending measurement) — agree with deferring it rather than guessing at the cost, just flagging that it's the one thing here that's a judgment call rather than a proof.
  • ShardManager.onFailure's residency-confirmation branch is now "belt-and-braces" per the PR's own framing — kept intentionally, with its javadoc correctly demoted from "closes the window" to "narrows it, the purge closes it." Whether it's worth its own reference-comparison + log line long-term is explicitly left as a follow-up question, which seems right for this PR's scope.

Verdict

The design decision (no declining alternative needed, since the callbacks never need to ask) is sound, the invariant it depends on is correctly proven from the actual code rather than merely asserted in prose, and the test suite exercises the concurrency property directly rather than through timing coincidence. I'd merge this over #431 as described in the PR body — nothing here gave me a reason to object to that framing.

@github-actions

github-actions Bot commented Sep 8, 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 8, 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.34% 0.34% ➖ 0
Rule Limit Status
Max duplication 0.5% ✅ Pass (0.34%)
Max increase vs base +0.1% ✅ Pass (+0.00%)

No new clones introduced by this PR.

✅ jscpd (language-agnostic)

PR Base Change
Clones 103 104 🙂 -1
Duplicated lines 1472 1479 👍 -7
Duplication 0.84% 0.84% ➖ 0
Rule Limit Status
Max duplication 2% ✅ Pass (0.84%)
Max increase vs base +0.1% ✅ Pass (+0.00%)

No new clones introduced by this PR.

Powered by astubbs/duplicate-code-cross-check

@github-actions

github-actions Bot commented Sep 8, 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/main/java/bz/stub/parallelconsumer/state/ShardManager.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueRebalancePathTest.java 44.9
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueRebalancePathTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueRequeueWindowTest.java 42.0
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ControllerThreadOnly.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ArchitectureTest.java 34.1
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueRebalancePathTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 32.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 31.0
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.0

🔺 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 44.1 48.3 +4.2
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 36.3 38.2 +1.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 39.0 40.6 +1.6
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TransactionalBulkCommitTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerTest.java 43.9 44.6 +0.7
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TransactionalBulkCommitTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkClaimStateMachineTest.java 73.5 74.2 +0.7
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkContainer.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TransactionalBulkCommitTest.java 35.9 36.5 +0.6
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ArchitectureTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/RebalanceCallbackRuleControlTest.java 33.9 34.4 +0.6
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkClaimStateMachineTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerTest.java 52.6 53.1 +0.5
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkContainer.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkClaimStateMachineTest.java 48.5 49.0 +0.4
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 36.1 36.5 +0.4
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueLincheckTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerLincheckTest.java 38.4 38.8 +0.3
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 31.3 31.5 +0.2
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 55.9 56.0 +0.1
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TransactionalBulkCommitTest.java 42.7 42.8 +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 30.6 30.7 +0.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 37.7 37.8 +0.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 37.0 37.1 +0.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCInternalRuntimeException.java 38.1 38.2 +0.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 48.7 48.9 +0.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/UnknownOffsetMetadataMagicException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/UnsupportedOffsetEncodingException.java 50.1 50.2 +0.1

...and 72 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.06
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java 34.18
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 38.53
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java 36.96
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.94 ⚠️
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CalibrationProbes.java 38.53
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/BootstrapResetTripleWriteProbes.java 38.06
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.94 ⚠️
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CalibrationProbes.java 36.96
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/BootstrapResetTripleWriteProbes.java 34.18
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 56.01 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 37.83
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 32.59
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 30.43
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 30.13
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/JStreamParallelStreamProcessor.java 56.0 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 54.65 ⚠️
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 43.46
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 42.03
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 33.98
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 33.4
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java 32.44
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 56.0 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 47.48
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 41.73
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 39.15
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 34.88
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java 30.38
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.31
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/ThrowableUtils.java 30.29
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 56.01 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 46.41
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 31.34
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 54.65 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 51.96 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 47.48
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 39.28
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java 34.56
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 33.4
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 33.13
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 32.55
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.96 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 42.03
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 39.39
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 39.15
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java 30.11
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 47.17
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 38.96
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 33.13
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/RecordContext.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/RecordContextInternal.java 30.44
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 47.17
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/RecordContext.java 30.44
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractOffsetCommitter.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerOffsetCommitter.java 30.28
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 38.56
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java 37.38
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java 36.76
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 36.36
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerOffsetCommitter.java 34.73
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/BrokerPollSystem.java 34.54
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ProducerManager.java 33.9
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionStateManager.java 33.88
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java 32.92
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 32.55
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerOptions.java 31.34
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerManager.java 31.23
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 30.99
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 34.54
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.23
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerOffsetCommitter.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 34.73
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractOffsetCommitter.java 30.28
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/EpochAndRecordsMap.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionStateManager.java 31.03
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 39.58
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 37.38
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 34.97
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.98
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 48.85
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 46.41
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCInternalRuntimeException.java 38.2
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 37.83
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 37.12
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 31.49
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 38.2
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 34.56
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 32.44
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 30.38
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/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 33.9
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java 30.19
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.57
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 33.65
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 32.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java 30.29
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 40.03
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.67
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 31.49
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 30.87
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 30.43
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 37.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/UnknownOffsetMetadataMagicException.java 31.57
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 35.67
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetEncoding.java 30.15
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 37.12
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 48.85
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 45.36
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 34.18
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 33.32
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.98
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 45.36
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 32.59
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.97
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/WorkManagerOffsetMapCodecManagerTest.java 31.27
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodedOffsetPair.java 30.15
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 35.67
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 58.01 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 34.18
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 31.67
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 30.13
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 58.01 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 33.32
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 30.87
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.24 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetEncoding.java 37.97
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/CorruptOffsetMetadataException.java 31.57
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.24 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/CorruptOffsetMetadataException.java 37.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ControllerThreadOnly.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ArchitectureTest.java 34.15
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/DispatchScanMeter.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/OrderingModeDispatchParityTest.java 41.28
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/PartitionStateManager.java 38.27
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 36.76
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 33.72
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.24
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java 38.27
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 33.88
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateManagerRevokeAfterFailedAssignmentTest.java 31.18
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/EpochAndRecordsMap.java 31.03
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/RemovedPartitionState.java 30.4
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 48.31
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardStaleSweepReplacementEvictionTest.java 41.51
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 37.63
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 35.73
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkContainer.java 34.04
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardAvailableCountOwnershipTest.java 32.94
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueRequeueWindowTest.java 30.04
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/RemovedPartitionState.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionStateManager.java 30.4
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 48.31
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueRebalancePathTest.java 44.91
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueRequeueWindowTest.java 40.61
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 38.21
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 36.49
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 30.99
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 48.98
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TransactionalBulkCommitTest.java 36.55
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 34.04
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.24
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 36.49
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 36.36
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 35.73
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java 33.72
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.85
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.41 ⚠️
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 31.79
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 31.79
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.56 ⚠️
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.47
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 30.3
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 45.16
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalPartialResultSetIT.java 35.44
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TransactionalClaim.java 33.57
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalVisibilityIT.java 31.74
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 45.16
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TransactionalClaim.java 35.53
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalEagerProcessingIT.java 31.66
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/TransactionalClaim.java 32.28
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java 31.87
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalCrashReplayIT.java 31.66
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 35.44
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 31.74
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.41 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 53.56 ⚠️
parallel-consumer-vertx/src/test-integration/java/bz/stub/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 36.73
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 43.01
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkKeyOrderIT.java 40.48
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 36.76
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 32.91
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 32.45
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 44.25
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 43.01
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 38.41
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 50.7 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 44.25
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 36.76
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 33.02
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.54
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.34
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.54
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.34
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 32.45
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 50.7 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 40.48
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 38.41
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 33.02
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 32.91
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.06 ⚠️
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.06 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/InstanceProgressView.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/InstanceProgressView.java 30.37
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.23
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.23
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 36.47
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.21
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ArchitectureTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/RebalanceCallbackRuleControlTest.java 34.42
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ControllerThreadOnly.java 34.15
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/archfixture/ControllerThreadOnlyReachFromARebalanceCallback.java 30.51
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AsyncCommitAcknowledgementTestBase.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerSyncCommitMarksCleanOnReturnTest.java 47.89
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitRejectionTestBase.java 46.23
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerAsyncCommitCallbackDroppedTest.java 35.11
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 43.45
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineLaneReportScriptTest.java 39.19
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/AsyncCommitAcknowledgementTestBase.java 46.23
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerSyncCommitMarksCleanOnReturnTest.java 41.39
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.93
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.23 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java 50.43 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 45.27
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ForeignThread.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ThreadConfinedConsumerTestBase.java 34.64
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 34.9
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 34.9
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerAsyncCommitCallbackDroppedTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerAsyncCommitCallbackFailsTest.java 44.92
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AsyncCommitAcknowledgementTestBase.java 35.11
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerAsyncCommitCallbackFailsTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerAsyncCommitCallbackDroppedTest.java 44.92
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 43.62
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 43.62
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerSyncCommitMarksCleanOnReturnTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AsyncCommitAcknowledgementTestBase.java 47.89
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitRejectionTestBase.java 41.39
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.93
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.31
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.8
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.8
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorTestBase.java 31.21
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.19
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 43.45
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/RebalanceCallbackRuleControlTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkContainerSortedCollectionRuleControlTest.java 54.67 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ArchitectureTest.java 34.42
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/archfixture/BlockingReachThroughAMethodReference.java 33.83
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/archfixture/ControllerThreadOnlyReachFromARebalanceCallback.java 30.82
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 34.73
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 34.73
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.81 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 86.53 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 86.53 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 83.15 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 83.15 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 83.15 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 81.67 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 81.67 ⚠️
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.53
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalBatchVisibilityIT.java 33.57
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalEagerProcessingIT.java 32.28
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/archfixture/BlockingReachThroughAMethodReference.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/archfixture/ControllerThreadOnlyReachFromARebalanceCallback.java 44.81
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/RebalanceCallbackRuleControlTest.java 33.83
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/archfixture/ControllerThreadOnlyReachFromARebalanceCallback.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/archfixture/BlockingReachThroughAMethodReference.java 44.81
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/RebalanceCallbackRuleControlTest.java 30.82
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ArchitectureTest.java 30.51
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/archfixture/SortedCollectionOfWorkContainers.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkContainerIsNeverInASortedCollectionArchTest.java 40.63
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 34.85
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 36.07
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 39.58
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/LastCommitTimeFenceTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateDirtyFlagFenceTest.java 38.61
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 34.54
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/main/java/bz/stub/parallelconsumer/PollContextInternal.java 38.96
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java 35.98
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProduceLockHandover.java 32.79
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/PollContextInternalTest.java 32.79
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/TransactionalBulkCommitTest.java 42.81
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PollContextInternalTest.java 35.98
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 32.92
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalEagerProcessingIT.java 31.87
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionTimeoutsTest.java 30.3
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ProducerManager.java 30.19
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 38.56
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorConfigurationTest.java 36.47
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 39.28
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 33.98
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 34.85
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ThreadConfinedConsumerTestBase.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ForeignThread.java 34.64
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.15 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerTest.java 44.59
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java 42.81
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkContainer.java 36.55
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 33.65
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.57
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.85
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 32.1
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 40.03
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/MetricsTeardownCannotBreakCloseTest.java 34.54
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.23
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 36.75
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 36.75
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.27
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/OffsetCodecTestUtils.java 30.23
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 42.87
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RacingEncodeWindowState.java 35.34
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/OrderingModeDispatchParityTest.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/DispatchScanMeter.java 41.28
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 42.87
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateCommitShiftCompounding894Test.java 38.63
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 38.63
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateDirtyFlagFenceTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/LastCommitTimeFenceTest.java 38.61
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 30.82
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateManagerRevokeAfterFailedAssignmentTest.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionStateManager.java 31.18
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.35
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.54 ⚠️
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.54 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/OffsetEncoderWidenedRangeRaceTest.java 35.34
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 38.76
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueRebalancePathTest.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 44.91
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueRequeueWindowTest.java 42.04
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 32.15
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 42.22
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueRebalancePathTest.java 42.04
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 40.61
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 33.34
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 30.04
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 32.94
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 38.76
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java 30.82
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerLincheckTest.java 30.72
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.35
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/EpochAndRecordsMapRaceTest.java 36.07
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/test/java/bz/stub/parallelconsumer/state/ShardStaleSweepReplacementEvictionTest.java 39.19
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 38.21
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 37.63
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueRequeueWindowTest.java 33.34
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueRebalancePathTest.java 32.15
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardStaleSweepReplacementEvictionTest.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 41.51
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 39.19
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.15 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerTest.java 53.11 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkContainer.java 48.98
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkContainerIsNeverInASortedCollectionArchTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/archfixture/SortedCollectionOfWorkContainers.java 40.63
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkContainerSortedCollectionRuleControlTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/RebalanceCallbackRuleControlTest.java 54.67 ⚠️
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 30.72
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 42.22
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 53.11 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TransactionalBulkCommitTest.java 44.59
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.24
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.24
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.74
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.01
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/integrationTests/CoreAppMetricsIntegrationTest.java 36.59
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/VertxAppTest.java 34.85
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-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 83.16 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 83.15 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 81.95 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 81.95 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 78.74 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 78.74 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 77.34 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 77.34 ⚠️
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 81.67 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 81.67 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 80.49 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 80.49 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 77.34 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 77.34 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 77.34 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 75.96 ⚠️
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.59
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 64.09 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/main/java/bz/stub/parallelconsumer/examples/core/CoreApp.java 35.74
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.35
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/CoreAppTest.java 39.01
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-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 83.16 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 83.15 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 81.95 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 81.95 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 78.74 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 78.74 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 77.34 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 77.34 ⚠️
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 81.67 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 81.67 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 80.49 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 80.49 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 77.34 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 77.34 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 77.34 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 75.96 ⚠️
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 64.09 ⚠️
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-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 83.16 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 83.15 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 81.95 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 81.95 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 78.74 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 78.74 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 77.34 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 77.34 ⚠️
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.35
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/CoreAppTest.java 34.85
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.69
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.3 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 50.43 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 49.16
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.2
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.48 ⚠️
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-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 86.54 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 86.53 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 85.28 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 81.95 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 81.95 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 81.95 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 80.49 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 80.49 ⚠️
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.69
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.3 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 52.23 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 50.88 ⚠️
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.2
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.48 ⚠️
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-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 86.54 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 86.53 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 85.28 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 81.95 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 81.95 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 81.95 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 80.49 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 80.49 ⚠️
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-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 43.88
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 43.46
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java 38.7
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 37.92
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 34.88
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 33.4
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/JStreamVertxParallelEoSStreamProcessor.java 43.88
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java 43.62
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 41.73
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 39.39
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 33.4
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 38.05
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 37.92
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java 34.97
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBaseUnitTest.java 31.21
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.62
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 38.7
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 38.05
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 30.11
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.73
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 30.47
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.81 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 86.54 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 86.54 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 83.16 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 83.16 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 83.16 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 81.67 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 81.67 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBaseUnitTest.java

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

File Similarity (%)
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 31.21
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 50.88 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java 49.16
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 45.27

@github-actions

github-actions Bot commented Sep 8, 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.

No quarantined test changed outcome since the previous push.

Updated for 9cd01f8 · run 34178708779 · 2026-09-08 02:08 UTC

Superseded by a newer quarantine lane report.

@codecov

codecov Bot commented Sep 8, 2026 •

Copy link
Copy Markdown

Codecov Report

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

Additional details and impacted files
@@             Coverage Diff              @@
##             master     #481      +/-   ##
============================================
+ Coverage     82.31%   82.85%   +0.53%     
- Complexity     1538     1560      +22     
============================================
  Files            96       96              
  Lines          5343     5377      +34     
  Branches        529      534       +5     
============================================
+ Hits           4398     4455      +57     
+ Misses          756      729      -27     
- Partials        189      193       +4     
Flag Coverage Δ
chaos 53.16% <38.88%> (?)
integration 61.95% <72.22%> (+0.39%) ⬆️
performance 47.80% <27.77%> (?)
unit 79.00% <100.00%> (+0.05%) ⬆️

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 8, 2026 •

Copy link
Copy Markdown

⚠️ SpotBugs Report

352 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 f42fdc5 · run 34182650640 · 2026-09-08 03:18 UTC

@github-actions

github-actions Bot commented Sep 8, 2026 •

Copy link
Copy Markdown

🟢 Throughput — OK

This branch measured about 6% faster 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 1.058 above 1.00 is faster, below is slower
Subject test took 46.3s the test under measurement
Control tests took 25.6s the other tests in this same run
Subject ÷ controls, here 1.804 not a speed - a shape that cancels machine speed
Subject ÷ controls, master 1.908 median of recent master runs
Reported rate 85118 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 1 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.908 – 1.908.

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: ad482ec

Since the previous push: ratio 1.115 -> 1.058, share 1.435 -> 1.804, rate 79514 -> 85118 (+7.0%). One push of difference sits inside this test's measured spread - read it as movement, not as a result.

Updated for f42fdc5 · run 34182650640 · 2026-09-08 03:17 UTC

@astubbs

astubbs commented Sep 8, 2026

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

@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 8, 2026 02:02
…es introduced

`bin/check-pr-analysis-surfaces.sh 481` reports findings on lines the diff WROTE separately from ones
inherited in files it touches. Three of the former, all DLS_DEAD_LOCAL_STORE, all from the same
habit: naming a discarded return value.

The repo has already settled this tension and the resolution was two feet away, at
`ShardManager.onFailure`: "a dead store in main code trades one static-analysis finding for another".
The root AGENTS.md rule - never discard a return value silently, name it and say why - is about a
reader being unable to tell a decision from an oversight; LOGGING the value satisfies that better
than an ignored local, and satisfies the analyser too. So each site now uses its value rather than
parking it:

- `removeWorkFromShardFor` logs what the shard gave up at trace, beside the trace its else-branch
  already writes. The line says the retry queue is deliberately untouched here, which is the fact a
  reader arrives at this method wondering about.
- `purgeDepartedRetryEntries` returns void. Nothing in production read the count, and a caller that
  named one only to drop it is exactly the dead store; what is worth knowing it already logs. Said in
  its javadoc, along with where a meter would go if the scan's cost is ever measured - the deferred
  optimisation both reviewers asked for.
- The purge's `removeAll` answer is folded into the log it already writes when something was
  collected, and it is the same signal as the one at `onFailure`: this thread is the queue's only
  writer, so `false` can only mean a second writer removed them first - which is precisely what would
  invalidate the scan-then-remove the purge is built on.

Inherited findings in the same files are left alone, as that script's own output instructs: they
belong to the registries under docs/inflight/.

Reproduce: bin/check-pr-analysis-surfaces.sh 481

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

astubbs commented Sep 8, 2026

Copy link
Copy Markdown
Owner Author

Predecessor: #431, now closed as superseded by this PR. Its contended-read-lock harness and parked-for-retry fixture are what this branch's red test adapts, and its design is Design A in the solutions write-up here.

…nse what waited on it

The owner closed #431 as superseded. Six places on this branch said it was
open; each is now correct, and two of them were making a claim that mattered rather than merely
naming a number.

Retired: docs/inflight/branch-retry-queue-controller-purge.md. Its whole first purpose - "#431
is still OPEN and must not be merged" - is fulfilled, and the four outcomes in docs/inflight/AGENTS.md
put what remains where it is owned rather than deleting it wholesale:

- the collision list is answerable by `gh pr list` plus `gh pr diff --name-only`, and is in this PR's
  body where a reader of the change will meet it;
- the belt-and-braces confirmation, the runtime ownership guard and the shard-displacement orphan are
  each already owned by ShardManager.onFailure's javadoc, the solutions write-up, and their own notes,
  all corrected in this branch's earlier commits;
- the one item with no owner was a SPLIT, not a deletion, and is now
  docs/inflight/perf-retry-queue-purge-scan-is-unmetered.md - the purge's unconditional full scan, the
  LongAdder-gated shape both reviewers converged on, why it was not taken with the change, and the
  order that would settle it (meter first, using DispatchScanMeter's precedent, then decide). It
  carries `deferred` with that as its reason, so it sorts as a decision waiting on evidence rather
  than as work nobody did.

Past-tensed beside the dated text, never over it:

- ShardManagerLincheckTest's fixture javadoc rested on "would go red the moment that PR lands". That
  event will never happen, so the urgency is void - and the fixture change was still right, for the
  half of its argument that never depended on the PR: the reach is created by a state the product
  deliberately makes, and a harness whose fixture contradicts its own comment is a false green
  whatever the schedule. Said there, because the next reader of that comment is the one who would
  otherwise take the void premise for a live one.
- core-stale-arrival-guard-needs-a-null-safety-decision.md carried the same premise for the same
  sighting. Its datum is explicitly unaffected - it is about that note's own question, not about the
  PR's outcome - which is why the paragraph stands with a correction rather than being cut.
- The two 2026-09-07 `inflight-vetted` stamps that read "#431 is still OPEN" are left exactly
  as written - they were true on their date, and that is the point of a dated stamp. What each note's
  2026-09-08 section now says is that the stamp's REASONING no longer holds: the shard-displacement
  clause is dead for a different reason than the stamp gives, and largeNumberOfInstances' "false
  positive because RetryQueueRebalancePathTest lives on #431" resolves because that test now
  lives here.
- The orphan-window write-up's correction is sharpened from "superseded, not merged" to "CLOSED,
  never merged", with the consequence stated: the arms it promises to invert stay as written.

Gates: check-branch-self-reference (now with PR #481 resolved, so the number phrases are checked too),
check-file-refs, check-inflight-tags, check-issue-refs, and the full bin/check-all.sh - all green.
ShardManagerLincheckTest re-run green after its javadoc edit.

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

astubbs commented Sep 8, 2026

Copy link
Copy Markdown
Owner Author

@claude review this

@claude

claude Bot commented Sep 8, 2026 •

Copy link
Copy Markdown

Claude finished @astubbs's task in 1m 38s —— View job


Review

  • Read trigger comment and gather PR context
  • Read the core diff: RetryQueue, ShardManager, ProcessingShard, ControllerThreadOnly
  • Read ArchitectureTest changes and the emptied exemption list
  • Read the new/changed tests (RetryQueueRebalancePathTest, BlockedThreadAsserter)
  • Check the three commits added since the last automated review (dead-store cleanup, simplify pass, docs retirement)
  • Post review findings

Note on tooling: same limitation as the prior automated review — my allowlist is .github/workflows/claude.yml from master, not this PR's copy, so I still can't invoke mvn/shell build commands here. This review is from reading the code directly (git show per-commit).

Summary

This is a re-review after three more commits landed on top of the state the first automated review (01:42 UTC) already approved: 9cd01f8 (SpotBugs dead-store cleanup), f0fe343 (simplify pass), and 43be16b (docs-only retirement of the now-stale #431 branch note). The core design — rebalance callbacks touch shards only, ShardManager.purgeDepartedRetryEntries() collects what that leaves on the controller thread — is unchanged from what was already reviewed and endorsed. I re-verified the invariant chain (removeWorkFromShardFor/removeStaleContainers touch only the ConcurrentHashMap/ConcurrentSkipListMap shard structures; every retryQueue.add/remove/removeAll call site is on the controller thread; the purge's scan-then-remove split is safe because RetryQueue.add is @ControllerThreadOnly with a single caller on the same thread as the purge) and it still holds.

The three new commits, checked individually

  • 9cd01f8 — replaces three named-but-ignored locals (ignoredRemovedFromTheShard, ignoredCollected, ignoredModified) with either a trace/debug log of the value or a void return (purgeDepartedRetryEntries() no longer returns a count). This is a clean, minimal fix for the SpotBugs DLS_DEAD_LOCAL_STORE findings the diff's own lines introduced, consistent with the pattern already established two lines away at onFailure. No behavior change — the removed return value (departed.size()) had no production caller.
  • f0fe343 (simplify pass) — folds the test's hand-rolled thread/latch harness into BlockedThreadAsserter.returnsWithin/joinQuietly. This is a real improvement, not just deduplication: the hand-rolled version couldn't distinguish "callback threw immediately" from "callback returned promptly," which is a false-pass risk for a test specifically asserting promptness under contention — returnsWithin now raises the throwable instead of swallowing it into a clean-looking return. The commit message says this was re-proven (restoring the queue removal to both callback paths turns three arms red again) rather than assumed after the refactor, which is the right discipline for this class of change.
  • 43be16b — docs/javadoc only (retiring the branch note now that fix(core): the rebalance callbacks decline the retry queue's write lock instead of waiting for it #431 is closed, correcting the ShardManagerLincheckTest javadoc's since-voided "would go red when that PR lands" claim). No production or test-logic changes; I confirmed the ShardManagerLincheckTest diff is a comment-only edit.

Verdict

Nothing in the new commits changes the design or introduces a new concern beyond what the first review already covered and endorsed. The dead-store fix is exactly the kind of narrow, low-risk cleanup it claims to be, the simplify pass is a genuine quality improvement with re-verification stated, and the docs commit touches no code semantics. I have no new blocking findings; my read is unchanged from the earlier review — I'd merge this over #431 as the PR describes.

astubbs added a commit that referenced this pull request Sep 8, 2026
…rphan is known unreachable

Two things moved under the burn-down on 2026-09-08.

The owner's #481 supersedes #431 for the retry-queue lock
on the rebalance path: the poll thread never touches the queue and the
controller collects what it leaves. #431 is closed; tier 1 now
lists #481, ready and green, and notes that #483 stacks on
it. The sweep's reading, moved into this note earlier, still called
#431 a draft; it is annotated rather than rewritten, since it is
the sweep's dated reading.

The shard-displacement orphan window is known unreachable by
#483, with the one caveat worth carrying: the proof's last leg is
a Kafka property (the fetch position never goes backwards within a
generation), so an in-generation offset replay reopens the window and
nothing goes red. #481's purge bounds the cost to one tick of
misdirection. Two more by-key removals of the same shape are named and
left for #468, whose identity-equals change is what makes
conditional removal possible.

Claude-Session: 460f7df9-dcc2-4b00-a9f9-62f3a2c6d5e4
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 8, 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
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 43be16b · run 34179420184 · 2026-09-08 02:21 UTC

Superseded by a newer quarantine lane report.

astubbs added a commit that referenced this pull request Sep 8, 2026
…te leaves open

#481 takes the rebalance callbacks off the retry queue
and has the controller purge entries whose container has left. It edits the same
three files this work does, and its "Update 2026-09-08" section on the shard
displacement note ends by saying production reachability is still not established
- which is exactly what this work answers. Merged so the two read as one argument
rather than two adjacent ones.

WHAT CONFLICTED, AND HOW IT WAS RESOLVED

ONE textual conflict, in ShardManager.onFailure's javadoc. Both sides rewrote the
same trailing paragraph about addWorkContainer. #481 said the purge now
backstops the displacement orphan; this branch said the branch is unreachable.
Both are true and neither implies the other, so #481's paragraph is kept
verbatim and the verdict is layered underneath it: the purge bounds the harm
whatever happens, the proof says the case does not arise, and the backstop is
therefore genuine belt-and-braces rather than the only thing standing between
that branch and an orphan.

TWO auto-merges that were WRONG and needed hand repair - the reason a clean
auto-merge was not taken as a resolved merge:

- ProcessingShard.addWorkContainer. Both blocks survived, but the cleared-
  suspicion text asserted that each staleness transition is "followed by the
  sweep that removes it from BOTH structures". #481 makes that false - the
  callbacks remove from the shards only. Rewritten to say what the argument
  actually needs, which is the SHARD removal: a container the sweep unseated is
  not a resident, and the displacement branch needs a resident to displace. The
  queue half was never the load-bearing part.
- The inflight note. Collapsing the two vet markers to one (the tag gate permits
  exactly one) deleted the 2026-09-07 stamp that #481's update paragraph
  refers to by date. That paragraph now records what the stamp said and that it
  has been superseded, so its point survives its source.

WHAT CHANGED IN THE WORK ITSELF

- Leg five of the proof is restated in terms of residence, in the solutions
  write-up, the test's class javadoc and the code comment.
- Arm one is renamed aRebalanceUnseatsTheResidentBeforeAnyReplacementCanArrive
  and now asserts the two removals in #481's order: gone from the shard
  inside the callback, gone from the queue after one controller pass. It asserts
  the one-tick bound rather than assuming the old pairing.
- Arm three additionally shows the orphan it constructs does not survive one
  control-loop pass. That assertion deliberately does NOT attribute the removal
  to the purge: under a fence the last-resort stale sweep would take the same key,
  and this arm cannot tell them apart. A first attempt asserted the replacement
  would be handed out on that pass; it was refuted on the run - the fence makes
  the whole partition stale, so the replacement is stale on arrival too. The
  assertion now records that.

EVIDENCE AFTER THE MERGE

ShardDisplacementOrphanReachabilityTest 3/3, #481's RetryQueueRebalancePathTest
6/6, RetryQueueRequeueWindowTest 9/9, ProcessingShardStaleReplacement909Test green.
bin/check-all.sh 16 passed, 0 failed.

The ablation was RE-RUN on the merged tree rather than carried over, because
#481 changes what those sweeps do and an ablation measured against the old
shape would be evidence about code that no longer exists. Same result: either
sweep alone green, both removed red at the load-bearing assertion.

Co-authored-by: Claude Opus <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Sep 8, 2026
…rom the other side

#468 merged to master (7c95b75) between this branch's
#481 merge and now. It is the defect class this work's sweep reports on, so
leaving it unmerged would have published a sweep naming an open PR as the owner of
candidates that PR had already settled.

WHAT CONFLICTED

ONE conflict, in ProcessingShard.getWorkIfAvailable's last-resort stale sweep,
where both sides rewrote the same comment. Neither side was a superset:

- #481 replaced the "orphans it forever / the load gate reads low" claim,
  which its purge makes false, with the purge that now collects the entry.
- #468 added why the removal is conditional on the inspected container, and
  a dated CLEARED SUSPICION for this site.

Resolved by keeping BOTH - #481's purge sentence in place of the false
claim, and #468's conditional-removal reasoning and cleared suspicion
after it. Taking either whole side would have silently dropped the other's
content, and a green build would not have shown it.

THE RESULT WORTH RECORDING

#468's cleared suspicion at that sweep rests on exactly the fact leg one of
this work's proof rests on: addWorkContainer is the ONLY writer of workMap outside
tests and runs on the controller. Two people reached the same single-writer
discriminator from opposite directions, days apart, neither citing the other.

That means the two clearances share ONE reopening condition - anything that puts
into a shard off the controller thread - and nothing gates it. Said at all four
places that now depend on it: both code comments, the solutions write-up, and the
test's class javadoc, so a future change cannot invalidate one while reading only
the other.

CITATIONS BROKEN BY THE COMBINATION, AND REPAIRED

#468 retired docs/inflight/bug-stale-sweep-iterator-evicts-fresh-replacement.md
when it merged; #481 cites that note in ShardManager.onFailure's javadoc and
in its solutions write-up. Neither PR is wrong on its own and neither would have
failed its own gate - the dangling reference exists only in the merge. Both
repaired the way docs/citations.md and check-file-refs.sh prescribe, by pointing at
the history that still holds the file
(git show 7c95b75^:docs/inflight/bug-stale-sweep-iterator-evicts-fresh-replacement.md).

EVIDENCE

ShardDisplacementOrphanReachabilityTest 3/3, RetryQueueRebalancePathTest 6/6,
RetryQueueRequeueWindowTest 9/9, ProcessingShardStaleReplacement909Test 4/4,
ShardManagerStaleContainerTest and ShardAvailableCountOwnershipTest green - 31
tests, 0 failures. bin/check-all.sh 16 passed, 0 failed.

The ablation was re-run a THIRD time, on this tree. #468 changes each sweep
removal into a compare-and-remove, so the previous run was again evidence about a
shape that no longer exists. Same result: either sweep alone green, both removed
red at the same assertion. The write-up now records all three runs rather than the
latest one.

Co-authored-by: Claude Opus <noreply@anthropic.com>
…ntries

Picks up #466 (revoke-path commit hands itself to the control thread), #468 (WorkContainer equality
is identity, so the stale sweep removes only the container it inspected), #471 and #476. One
conflict, comment-only, in ProcessingShard.getWorkIfAvailable's controller-side stale branch: #468's
conditional-removal reasoning and its dated cleared suspicion are kept; its sentence "leaving the
queue entry behind orphans it forever - nothing else removes an entry whose container is in no shard"
is replaced by this branch's, because ShardManager.purgeDepartedRetryEntries() now does exactly
that on the pass after. The code beneath merged clean: #468's evictIfStillResident plus the
controller-thread retryQueue.remove.

Two citations of docs/inflight/bug-stale-sweep-iterator-evicts-fresh-replacement.md - which #468
retired - repaired to history pointers per docs/citations.md, in the solutions write-up and
ShardManager's javadoc.

#468 also settles the one premise this branch's purge rested on by argument: it removes entries by
key while equality is identity, safe here only because the queue has one writer. Verified on the
merged tree from fresh reports: RetryQueueRebalancePathTest, RetryQueueRequeueWindowTest,
RetryQueueTest, RetryQueueIteratorConfinementTest, ShardManagerTest, ShardPopulationRaceTest,
WorkManagerTest, WorkManagerStaleCheckDoubleLookupTest, ArchitectureTest,
RebalanceCallbackRuleControlTest - all green.

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

github-actions Bot commented Sep 8, 2026 •

Copy link
Copy Markdown

[superseded - the quarantine lane is now empty] 🧪🔒 Quarantine Lane Report

The superseded report, collapsed because it no longer applies
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: MultiInstanceRebalanceTest.largeNumberOfInstances: 🔴 failing → 🟡🎲 passed (flapper).

Updated for ff9ac3d · run 34182079057 · 2026-09-08 03:07 UTC

Superseded by a newer quarantine lane report.

…ntries

One conflict: the residual-failures note this branch had appended a dated
update to was deleted by #473, which migrated it to
docs/solutions/test-flakiness/. The note stays deleted; the update - that
#431 closed as superseded by this branch and the refutation stands
unchanged - follows the content as a citation note beside the #431
reference in the write-up, per docs/citations.md.

Claude-Session: 460f7df9-dcc2-4b00-a9f9-62f3a2c6d5e4
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown

🧪🔒 Quarantine Lane Report

The quarantine lane is empty - no @Quarantined tests remain, so none ran.

Any earlier row on this PR asking for a @Quarantined annotation or a docs/quarantined-tests.md
entry to be deleted is withdrawn - there is nothing left to delete. A merge-blocking review
thread, if one was opened for that row, still has to be resolved by hand.

Lane: non-gating; rules: see the Quarantine Audit check.

Since the previous push: MultiInstanceRebalanceTest.largeNumberOfInstances left the lane (was 🟡🎲 passed (flapper)); RegistrationRaceStaleResidentIT.freshArrivalCollidingWithStaleShardResidentMustStillGetProcessed left the lane (was 🟡🎲 passed (flapper)).

Updated for f42fdc5 · run 34182650633 · 2026-09-08 03:11 UTC

astubbs added a commit that referenced this pull request Sep 8, 2026
One conflict, inherited from the #481 tip this branch carries: the
residual-failures note #481 had appended to was deleted by
#473, which migrated it to docs/solutions/test-flakiness/. The note
stays deleted here; the dated update that followed it lives on #481
as a citation note in the write-up and arrives with that PR.

Claude-Session: 460f7df9-dcc2-4b00-a9f9-62f3a2c6d5e4
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Sep 8, 2026
Master landed the async-commit acknowledgement (#470, silent loss on
the default commit mode) and the quarantine clearance (#473), which
empties docs/quarantined-tests.md so the release guard no longer blocks on
it and moves the capacity profiles behind a measured tag. With #466
and #468 already in, tier 1 has four of its seven merged; what is
left is #469, #481, #480 and #477.

Claude-Session: 460f7df9-dcc2-4b00-a9f9-62f3a2c6d5e4
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
@astubbs
astubbs merged commit c2d35c0 into master Sep 8, 2026
31 checks passed
@astubbs
astubbs deleted the fix/retry-queue-controller-purges-departed-entries branch September 8, 2026 03:27
astubbs added a commit that referenced this pull request Sep 8, 2026
The owner PR that superseded #431 has squash-merged. Tier 1 now
has five of its seven merged; what is left is #469, #480
(being reworked off the wire) and #477.

Claude-Session: 460f7df9-dcc2-4b00-a9f9-62f3a2c6d5e4
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Sep 8, 2026
…s now canonical

#481 landed on master as c2d35c0. This branch carried
#481's original branch commits, so every region reconciled by hand last
time came back as a conflict between #481-as-merged and
#481-as-this-branch-had-it. Master wins those; only the reachability
verdict, the test and the cleared-suspicion comment are layered on top.

FIVE HUNKS, AND THE RULE APPLIED TO EACH

- ShardManager.onFailure javadoc, the citation to the note #468 retired -
  MASTER. Both sides had repaired the same dangling reference the same way; master
  carries the wording added when #481 merged master.
- The identical citation in docs/solutions/runtime-errors/retry-queue-write-lock-
  on-the-rebalance-path.md (add/add - the file is new on both sides) - MASTER,
  same reason. That file is now byte-identical to master.
- ShardManager.onFailure javadoc, the paragraph after "What else the purge now
  backstops" - OURS. Master has #481's paragraph and nothing else there;
  this side is the verdict layered under it, which is the content this branch adds.
- The inflight note's closing section - OURS. Master ends at "Production
  reachability is still not established"; this side answers it.
- The inflight note's #431 paragraph - OURS, and this is the ONE hunk where
  master's text is not kept, so the reason is worth stating. Master says "The
  2026-09-07 stamp ABOVE says ...". That stamp is not above it here: this branch
  replaced it with the 2026-09-08 PROPOSED marker, because
  bin/check-inflight-tags.sh refuses a note carrying two. Keeping master's sentence
  would leave a pointer to something the merged file does not contain, so this
  side's wording stands - it makes #481's point, and records what the
  superseded stamp said so the supersession loses nothing.

THE TWO AUTO-MERGES THAT WERE WRONG LAST TIME, RE-CHECKED

Both correct this round, because the corrections were already committed rather
than being made against #481 for the first time:

- ProcessingShard's cleared-suspicion block still reads "the sweep that takes it
  OUT OF ITS SHARD" and not "from BOTH structures" - the wording #481
  falsifies. Its diff against master is exactly this branch's own block and
  nothing else.
- The note carries exactly one inflight-vetted marker.

NOT A LOSS, THOUGH IT LOOKED LIKE ONE

A sweep for files differing from master that this branch never edited flagged
#482's five (BatchTestMethods, CoreBatchTest, KafkaTestUtils and two docs).
Cause: #482 landed on master DURING this resolution, so MERGE_HEAD is
c2d35c0 and #482 is simply not in this merge. Nothing was dropped; it
arrives in the next one. Recorded because "file differs from master and I never
touched it" is normally the signature of a silent merge loss, and here it was not.

EVIDENCE

ShardDisplacementOrphanReachabilityTest 3/3, RetryQueueRebalancePathTest 6/6,
RetryQueueRequeueWindowTest 9/9, RetryQueueTest 7/7,
RetryQueueIteratorConfinementTest 5/5, ProcessingShardStaleReplacement909Test 4/4,
ShardManagerStaleContainerTest 3/3 - 37 tests, 0 failures.
bin/check-all.sh 16 passed, 0 failed.

Co-authored-by: Claude Opus <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Sep 8, 2026
, #481, #482, #485

Two conflicts, and one silent auto-merge artefact that only the compiler found.

PartitionState. #469 replaced the pair of booleans with a version counter, deleting
stateChangedSinceCommitStart; #410's ledger snapshots at the same point. Joined by taking
master's counter whole - the single completionCount load, tested and stashed as
completionCountBeingCommitted - and moving the ledger's snapshotForCommit() inside that same branch,
still ahead of createOffsetAndMetadata(), so the ledger is still snapshotted before the offer is made
and trimmed only on the answer to that offer.

The artefact: restoreCompletedButUncommittedWork() still called setDirty(), which #469
deleted, and git merged both sides clean because neither touched the other's lines. It is
recordCompletion() now - the replay has moved the partition's state on, so it stamps a new version
and isDirty() derives the rest. PartitionStateAbortedTransactionReplayTest 7/7 and
PartitionStateCommitWindowSeamTest 3/3 cover the join.

The flake ledger takes both sides' rows and master's retirement of the simpleBatchTest section, which
#482 fixed - expectation-versus-input, not the library.

config/infer-known-findings.txt takes master's version whole. The
"1 NULLPTR_DEREFERENCE AbstractParallelEoSStreamProcessor.processWorkCompleteMailBox" line this
branch carried was a merge artefact: #346 added it, #466 retired it in the same change
that reshaped the mailbox loop, and an earlier merge here re-took #410's older side. The
static lane was red on it. Re-ran infer locally on the merged tree - 9 findings, all known, none new.

Verified: ProducerManagerTest 22/22, ProducerRecoveryTest 15/15, the PartitionState family, the
RetryQueue family, WorkManagerTest, ArchitectureTest, TestConventionsArchTest,
TransactionalClaimCoverageTest.

Co-Authored-By: Claude Fable 5.1 <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>
astubbs added a commit that referenced this pull request Sep 9, 2026
…ever holds the offset (#492)

WHAT CHANGED FOR A USER: a rebalance can no longer remove a record that a later assignment had
already re-registered. `ShardManager.removeWorkFromShardFor` - the revoke and lost path - removed by
KEY with `removeWorkAtOffset(consumerRecord.offset())`, so whatever occupied the offset when the
removal landed is what left the shard. It now removes only the container the revoked record was
registered as, or a stale one, and never a live container from a later registration.

THE DEFECT CLASS, AND WHERE THIS SITE SITS IN IT. #468 closed the same class
at the poller's stale sweep: a removal keyed on the offset cannot say WHICH of two containers at that
offset it meant, and the fix was to make `WorkContainer` equality identity so that
`Map.remove(key, value)` is a true compare-and-remove. #483's defect-class
sweep reported this site alongside it - "the one remaining unconditional by-key shard removal" - and
deliberately left it, on the grounds that it belonged with #468's mechanism rather than with a
reachability proof. This is that. No fork or upstream issue tracks it; it was reported in a commit
body and on a `docs/inflight/` note, so this PR closes nothing.

THE CALLER HOLDS NO CONTAINER, WHICH IS WHY THE FIX IS SHAPED DIFFERENTLY. The stale sweep inspects a
container and then wants that one gone. This sweep is handed the `ConsumerRecord`s ONE generation was
still carrying as incomplete (`PartitionState.onPartitionsRemoved` ->
`removeAnyShardEntriesReferencedFrom`), so what it can name is the REGISTRATION, not an inspected
container. That works because `PartitionState.maybeRegisterNewPollBatchAsWork` puts the same record
instance into `incompleteOffsets` and into the `WorkContainer` it builds, in one loop body - so "the
container this generation registered for this record" is `occupant.getCr() == revokedRecord`, and a
later generation's re-delivery of the same offset is a different object because it came from a
different fetch. That identity has one named exception, stated at the site: `addNewIncompleteRecord`
puts unconditionally while `addWorkContainer` DROPS an arrival whose resident is not stale, so an
in-generation replay of an already-registered offset leaves the partition naming record B while the
shard holds the container over record A. The staleness condition below covers it.

TWO CONDITIONS, AND THE MIDDLE OPTION WAS WRONG. Registration identity alone declines for a container
from another registration that is nonetheless STALE, and declining there would leave a stale container
holding an offset of a revoked partition - the state this sweep exists to prevent. Staleness alone
declines for a live container built from the record the sweep was handed, which is what a revoke sweep
driven before the partition's state has been swapped sees, and is what
`ShardManagerLincheckTest.revokeSweep` models on every invocation: that harness's removal operation
would have become a silent no-op while staying green. Verified rather than assumed -
`incrementPartitionAssignmentEpoch` starts from `KAFKA_OFFSET_ABSENCE = -1`, so that harness's
`EPOCH = 0L` containers are live against the epoch its constructor assigns. So the guard declines for
exactly one thing - a LIVE container from another registration - which makes the change a no-op
everywhere except in the defect case, and each condition has its own ablation arm.

THE HARM, IF IT IS REACHED, IS THE LOST RECORD - #468's, not a misdirection. The live container
is gone from the shard while its own `PartitionState` carries the offset as incomplete, so nothing
selects it and nothing completes it, and the commit high-water mark cannot pass it until the partition
is re-polled. The v6 scope note this came from said the cost was "misdirection bounded to one
control-loop tick by #481's purge"; that is the DISPLACEMENT orphan's cost, not this one's.
This removal is a shard removal, and the purge collects retry-queue entries.

REACHABILITY: NOT TODAY, ON TWO INDEPENDENT ARGUMENTS, AND THE STRONGER ONE IS STRUCTURAL.

- Thread ordering, which has to name BOTH production routes. On the ordinary route the poll thread
  runs both rebalance callbacks, so a generation's revoke sweep completes before the assignment that
  could register a replacement begins. On the CLOSE route the sweep runs on the CONTROL thread
  (`maybeCloseConsumer` -> `onLeavePrepare` -> `onPartitionsRevoked`), which
  `PartitionStateManager.resetOffsetMapAndRemoveWork`'s javadoc calls live in every commit mode - and
  that is also `addWorkContainer`'s thread, so the two still cannot interleave. "Both callbacks are on
  the poll thread" is the half-statement, and it was written that way here first.
- `resetOffsetMapAndRemoveWork` installs `RemovedPartitionState` BEFORE it calls in, so
  `checkIfWorkIsStale` is true for EVERY occupant and the staleness condition carries all of them: on
  the shipped path this method is behaviourally identical to the by-key removal it replaces, and the
  decline branch is defence for a caller that sweeps before the swap. That says nothing about threads.

Nothing checks either argument. The conditional form costs one reference comparison and rests on
neither, which is exactly why #468 wrote `getWorkIfAvailable`'s last-resort sweep conditionally
against a race it had shown was unreachable there.

THE NPE GUARDS ON THIS PATH ARE UNTOUCHED, AND THE CLEARED SUSPICION NAMES THE RIGHT OBJECT. The
single-read `getShard` idiom #345 put in stays where it was; the new work is inside
`ProcessingShard`, below it. The staleness question resolves the partition state from the OCCUPANT,
not from `revokedRecord` - and in the only branch that asks, the occupant is by definition a different
registration - so the discriminator is two facts: the state is installed before the call (and a
partition with no state `continue`s without sweeping at all), and every `ShardKey` variant is
partition-scoped, so an occupant of this shard belongs to the revoked partition. WHAT WOULD REOPEN IT:
a caller from a path that has not installed a state, or a topic-scoped shard key - the latter being the
reopener `addWorkContainer`'s own cleared suspicion already lists, which reopens both at once.

EVIDENCE. `ShardRevokeSweepReplacementEvictionTest`, three arms, RED-then-GREEN through
`PartitionState.onPartitionsRemoved` so the argument list is built by production code - one level below
the state swap, which is what makes the decline branch reachable at all. Ablation matrix, predicted
before running, one arm red per ablation and no other:

- whole guard removed, back to `removeWorkAtOffset(offset)` -> the displacement arm
- staleness condition removed -> `aStaleContainerFromAnotherRegistrationIsStillSweptOut`
- registration-identity condition removed -> `aRevokeSweepStillRemovesALiveContainerBuiltFromTheRecordItWasHanded`
- decline retires the occupant instead of leaving it -> the displacement arm's accounting assertion

That fourth ablation is why the accounting assertion exists: making the decline call
`population.onRetired()` + `excludeFromSelection(occupant)` left every other assertion GREEN while
creating a permanent `RecordPopulation` deficit, which is this class's recurring defect and has no
clamp and nothing to reconcile it.

TWO INSTRUMENTATION FAILURES, RECORDED RATHER THAN TIDIED AWAY. The registration-identity ablation
reported NO failure on its first run: dropping the condition left an unused local, the module never
recompiled, and the grep for failures matched nothing - a silent false negative in the experiment
meant to prove the condition earns its place. Re-run with the build outcome asserted, it is red as
predicted. Separately, `@SuppressWarnings("ReferenceEquality")` was written on the identity comparison
and then measured: deleted, rebuilt under `-Pci`, `BUILD SUCCESS`. Neither `WorkContainer` nor Kafka's
`ConsumerRecord` overrides `equals`, so Error Prone never fired - it suppressed nothing and disagreed
with `isResident`'s bare `==` two methods away. Removed, with the reason written where it was.

SAME-DEFECT-CLASS SWEEP over `ShardManager`, `ProcessingShard` and `PartitionState`. Fixed: the one
above; no unconditional by-key removal of a container remains in main. Dismissed with discriminators:
`ProcessingShard.onSuccess` (re-verified rather than inherited - `WorkManager.handleFutureResult` is
the third staleness checkpoint and drops a stale result before `onSuccessResult`, so a returning stale
container cannot remove the fresh one that replaced it); `addWorkContainer`'s by-key INSERTION
(#483's leg 1, plus #336's admit-first, which reads the outcome from the map rather than
the earlier read); `removeStaleWorkContainersFromShard` and `getWorkIfAvailable`'s last-resort sweep
(already conditional, #468); `ShardManager.getShard` / `compute` / `computeIfPresent`
(single-read Optional idiom, #345, and atomic per-key, #336 - not check-then-act);
`RetryQueue.remove` / `removeAll` at every call site including `onSuccess`, `onFailure` and
`purgeDepartedRetryEntries` (same shape, but it is the queue's keying model rather than a removal that
forgot to name its target, so a fix is a change to that model - reported and left by #483, and
left here); `PartitionState.incompleteOffsets.remove` and the truncation prune (offsets over records,
control-thread-only - "this offset is complete" does not depend on which record object represents it).

`removeWorkAtOffset` now has no production caller. Kept as the modelling primitive four test classes
use for "a container departs its shard", with its javadoc rewritten: it used to open by naming the
`onPartitionsRemoved` caller this change moved away, and now says what it is and which of the two
conditional removals a main-code site should reach for instead.

RECORDS. `docs/solutions/logic-errors/a-by-key-removal-cannot-say-which-container-it-meant-2026-09-07.md`
- the class's owner - gains a dated section for the second site, because its own sweep's only hit was a
false positive and the real one was found a day later.
`docs/inflight/bug-shard-displacement-orphans-the-retry-queue-entry.md` gets a pointer, not a
narrative: its subject, state and `PROPOSED closed` marker are untouched, and what is recorded is only
that a reader arriving at #483's four-item list can see which one moved.

Reproduce: `bin/ci-unit-test.sh`; `bin/lincheck-test.sh`; `bin/check-all.sh`;
`./mvnw -pl parallel-consumer-core -am test -Dtest='ShardRevokeSweepReplacementEvictionTest,ShardStaleSweepReplacementEvictionTest,ShardManagerRevokeSweepNpeTest,ShardDisplacementOrphanReachabilityTest'`;
`bin/check-pr-analysis-surfaces.sh 492`.

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