Skip to content

refactor(core): confine the consumer to its owning thread, and make ownership a lifecycle - #393

Merged
astubbs merged 6 commits into
masterfrom
refactor/thread-confined-consumer-ownership
Sep 1, 2026
Merged

astubbs merged 6 commits into
masterfrom
refactor/thread-confined-consumer-ownership

Conversation

@astubbs

@astubbs astubbs commented Aug 31, 2026 •

Copy link
Copy Markdown
Owner

Extracted from #29 and cut fresh from master, where it compiles and passes
on its own. That PR's own decomposition plan called for this split and said why: this is the largest
piece of it by main-code volume, and its shape is a design decision about consumer ownership rather
than a patch, so it earns review separate from the lock fix it has been travelling with.

Description

KafkaConsumer is not thread safe, and this codebase runs two long-lived threads near it.
ThreadConfinedConsumer wraps the consumer and refuses any call from a thread that does not own it.
ConsumerOwnership makes that a lifecycle rather than a one-shot flag: the poll thread claims at
start of life, releases when the poll loop exits, and a closing thread may claim only what is
unclaimed or already its own.

Never stealing is the point. A guard that let close bypass the check would legalise closing
mid-poll, which is the failure it exists to prevent.

What ships here is the guard INSTALLED, not the guard GUARDING

Say this plainly, because the paragraphs above read as though the wrapper is already refusing calls,
and on this branch it is not.

AbstractParallelEoSStreamProcessor still holds and calls the raw consumer from
options.getConsumer(), and nothing calls claimConsumerOwnership(). Ownership therefore never
leaves UNCLAIMED, whose documented meaning is that every thread is allowed - so no call is
refused at runtime, on any path, today. What this PR delivers is the wrapper, the ownership
lifecycle, their tests, and a seam that is correct and ready.

That is deliberate and it matches where the enforcement lives: the ArchitectureTest rule that
pins the invariant stays on #29, and the claim call is wired there. It is
recorded here so a reviewer does not approve this as a shipped protection, and so nobody later reads
the unwired seam as an oversight and removes it.

Why this is separate from the deadlock fix

The measured claim on #29 is about roughly twenty lines of lock change - a
revoke path that declines with tryLock() instead of blocking - verified by a four-cell control
across both rebalance assignors. That control never measured this code. Reviewed together, the
verification of one invites being read as evidence for the other. They are independent in fact: the
deadlock fix references this wrapper only in comments and compiles without it.

It carries a regression it caused, and the test that proves it

Restructuring ConsumerManager for thread confinement replaced a per-poll updateCache() at poll
entry with one-time priming in init(). That left the pause cache written only when a poll
ended - so during every paused long poll, the control thread's back-pressure wakeup read the
previous poll's "not paused" value, never fired, and each pause cost a full long-poll timeout with
the pipeline drained. Measured as a four- to tenfold transactional throughput collapse that read as a
flaky CI lane for weeks.

The entry refresh is restored here, deliberately before pollingBroker.set(true) rather than
after it as on master, so wakeup() cannot reach the consumer while those calls run - preserving the
thread-confinement property this change exists for.

ConsumerManagerPauseCacheTest is red-proven on this branch, not assumed. Removing the entry
refresh fails it with expected: 1; restoring it passes. MockConsumer.schedulePollTask observes
the cache from inside the poll it describes, so the test is deterministic - no timeouts, no
concurrency.

That the fix ships beside the code that caused it is the argument for this split rather than an
awkwardness of it.

Verification

  • All 16 tests across the four suites pass on master with only these files added
  • main and test-compile clean
  • bin/check-all.sh - every gate passes
  • The regression test demonstrated failing before it was trusted passing

What deliberately did not come with it

  • ArchitectureTest stays on fix(core) confluentinc#857: the revoke path declines the commit lock instead of blocking on it #29. It holds this work's
    consumer-holder allowlist and that branch's rebalance-blocking rule; splitting a shared file
    drags unrelated work whichever way it is cut.
  • The docs stayed too, and the reason is worth stating. One test cited a solution write-up on
    that branch; following the citation pulled in a plan, then two inflight notes, then bin/ scripts.
    A cascade that does not terminate is the tell that those documents are that PR's interconnected
    research trail rather than this change's rationale. The citation now names the topic instead of a
    path, because a path that does not resolve on the branch it is read from is worse than no citation.
    The gate's escape hatch was not used.

Two things arrived after review, and one of them is unrelated to the subject

Answering the review at the code. The automated review read the two ConsumerManager.subscribe
overloads as dead code. It was right that nothing calls them and right that nothing at the code
said so - the "guard INSTALLED" section above is where that fact lived, and a PR body is not where
the next reader of ConsumerManager looks. The review reaching exactly the conclusion that section
exists to prevent is the evidence a body-only note was not enough, so the reasoning now sits on the
methods. The review's second finding, that init()'s javadoc offered an example its catch cannot
actually see, was a real inaccuracy and is corrected. Both are comments only.

A SpotBugs finding on a line this branch wrote, which the review did not reach:
bin/check-pr-analysis-surfaces.sh reported HES_EXECUTOR_OVERWRITTEN_WITHOUT_SHUTDOWN on the
foreignThread assignment in ThreadConfinedConsumerTestBase. The static lane is non-gating, so it
was green and silent. The fixture now shuts down what it is about to drop, chosen over the
rule-registry route because suppressing by rule would switch HES off repo-wide. That section of
the report now reads none.

Unrelated to this change, and deliberately here anyway: the Unit Tests lane went red once on
ReactorBatchTest.simpleBatchTest under KEY ordering - a known, already-tracked, still-undiagnosed
flake, green on re-run. It is recorded as a fourth sighting in
docs/inflight/test-untracked-ci-flakes.md, which is the one file in this diff that has nothing to
do with consumer ownership. It is here because that ledger's rule is to record a sighting before the
CI log carrying its evidence expires, and this one's evidence is worth keeping: the failing batch
payload shows the same three-way key collision as the 2026-08-25 sighting, in a different module,
which promotes the ledger's untested expectation-versus-input reading to the leading one.

Checklist

  • Docs updated - the ownership lifecycle, the never-steal rule and the cache-refresh placement
    all carry their reasoning in javadoc at the point of use
  • N/A - internal thread-safety enforcement; no user-facing feature to document under
    docs/features/
  • Tests added/updated - ThreadConfinedConsumerTest, ConsumerManagerCloseOwnershipTest,
    ConsumerManagerPauseCacheTest (red-proven), and ConsumerManagerCommitRetryBudgetTest
    updated for the wrapped constructor
  • Title & body reflect the final content of this PR
  • N/A - asking for @claude review this on the PR instead, which is the route that can open
    inline review threads

…wnership a lifecycle

Extracted from #29 and cut fresh from master, where it stands on its
own. Its decomposition plan called for exactly this and said why: it is the largest piece of that
branch by main-code volume, and its shape is a design decision about consumer ownership rather
than a patch, so it earns separate review.

WHAT IT IS

KafkaConsumer is not thread safe, and this codebase runs two long-lived threads near it.
ThreadConfinedConsumer wraps the consumer and refuses any call from a thread that does not own
it; ConsumerOwnership makes that a lifecycle rather than a one-shot flag - the poll thread claims
at start of life, releases when the poll loop exits, and a closing thread may claim only what is
unclaimed or already its own. Never stealing is the point: a guard that let close bypass the
check would legalise closing mid-poll.

WHY IT IS SEPARATE FROM THE DEADLOCK FIX

The measured claim on #29 is about roughly twenty lines of lock change -
a revoke path that declines with tryLock instead of blocking - verified by a four-cell control on
both assignors. That control never measured this code. Reviewing the two together invites the
verification of one to be read as evidence for the other, and they are independent: the deadlock
fix references this wrapper only in comments, and compiles without it.

IT CARRIES A REGRESSION IT CAUSED, AND THE TEST THAT PROVES IT

Restructuring ConsumerManager for thread confinement replaced a per-poll updateCache() at poll
ENTRY with one-time priming in init(). That left the pause cache written only when a poll ended -
so during every paused long poll the control thread's back-pressure wakeup read the previous
poll's "not paused" value, never fired, and each pause cost a full long-poll timeout with the
pipeline drained. Measured on the 857 branch as a four- to tenfold transactional throughput
collapse that read as a flaky lane for weeks.

The entry refresh is restored here, deliberately BEFORE pollingBroker.set(true) rather than after
it as on master, so wakeup() cannot reach the consumer while these calls run - preserving the
thread-confinement property this change exists for.

ConsumerManagerPauseCacheTest holds that contract and is RED-PROVEN on this branch, not assumed:
removing the entry refresh fails it with "expected: 1", restoring it passes. MockConsumer's
schedulePollTask observes the cache from inside the poll it describes, so the test is
deterministic - no timeouts, no concurrency.

VERIFIED

All sixteen tests across the four suites pass on master with only these files added; main and
test compile clean; bin/check-all.sh 15/15.

WHAT DELIBERATELY DID NOT COME

ArchitectureTest stays on #29. It holds this work's consumer-holder
allowlist AND that branch's rebalance-blocking rule, and splitting a shared file would drag
unrelated work in either direction.

Nor did the docs. One test cited a solution write-up that lives on that branch, and following the
citation pulled a plan, then two inflight notes, then bin scripts - an interconnected research
trail, not this change's rationale. The citation is now by topic rather than by path, because a
path that does not resolve on the branch it is read from is worse than no citation.
@github-actions

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 Aug 31, 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 30 30 ➖ 0
Duplicated lines 963 963 ➖ 0
Duplication 0.12% 0.12% ➖ 0
Rule Limit Status
Max duplication 0.5% ✅ Pass (0.12%)
Max increase vs base +0.1% ✅ Pass (+0.00%)

No new clones introduced by this PR.

✅ jscpd (language-agnostic)

PR Base Change
Clones 88 88 ➖ 0
Duplicated lines 1257 1257 ➖ 0
Duplication 1.01% 1.02% 🙂 -0.01%
Rule Limit Status
Max duplication 2% ✅ Pass (1.01%)
Max increase vs base +0.1% ✅ Pass (-0.01%)

No new clones introduced by this PR.

Powered by astubbs/duplicate-code-cross-check

@github-actions

Copy link
Copy Markdown

🧪🔒 Quarantine Lane Report

Quarantined test Outcome Owner Meaning
ProducerManagerTest.producedRecordsCantBeInTransactionWithoutItsOffsetDirect 🔴 failing (expected) #262 quarantine holding

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

@github-actions

github-actions Bot commented Aug 31, 2026 •

Copy link
Copy Markdown

📌 Duplicate code detection tool report

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

🆕 New file similarities introduced

File A File B Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ConsumerManagerCloseOwnershipTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ThreadConfinedConsumerTest.java 35.2
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerManager.java 32.2

🔺 Increased similarities

File A File B Base (%) PR (%) Change
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ParallelEoSSStreamProcessorRebalancedTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessorTest.java 32.6 32.8 +0.2
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/Java8StreamUtils.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/JavaUtils.java 32.4 32.6 +0.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/JavaUtils.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/CollectionUtils.java 37.4 37.6 +0.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/Java8StreamUtils.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/CollectionUtils.java 30.1 30.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.1 48.2 +0.1
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/BatchTestBase.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 30.3 30.4 +0.1
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RacingCommitCycleState.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RacingEncodeWindowState.java 58.8 58.9 +0.1
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyUnitTestBase.java parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorUnitTestBase.java 31.2 31.3 +0.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PCModuleCollaboratorOwnershipTest.java 32.6 32.7 +0.1
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/KeyOrderLedgerIT.java 31.4 31.5 +0.1
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java parallel-consumer-vertx/src/test-integration/java/bz/stub/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 35.6 35.7 +0.1
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/DiagnosticQuietCapIT.java 52.7 52.8 +0.1
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/truth/CommitHistorySubject.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/truth/LongPollingMockConsumerSubject.java 36.2 36.3 +0.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 55.9 55.9 +0.1
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorBatchTest.java 52.0 52.0 +0.1
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 36.1 36.1 +0.1
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 39.6 39.6 +0.1
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java 50.7 50.7 +0.1
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 44.5 44.6 +0.1
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/CoreAppTest.java parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/ReactorAppTest.java 39.4 39.5 +0.1

...and 26 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 40.45
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java 36.26
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 36.96
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java 36.81
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.01 ⚠️
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/BootstrapResetTripleWriteProbes.java 40.45
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CalibrationProbes.java 36.96
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.01 ⚠️
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CalibrationProbes.java 36.81
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/BootstrapResetTripleWriteProbes.java 36.26
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 55.93 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 38.35
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 34.29
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 33.21
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 32.46
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 32.37
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 31.56
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 64.86 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 58.66 ⚠️
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 42.89
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 42.07
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 36.09
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 33.37
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 31.66
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 64.86 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 54.75 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 41.77
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 35.42
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 35.15
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 32.67
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 30.49
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 33.91
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/ThrowableUtils.java 32.6
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 55.93 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 48.42
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 39.12
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 30.92
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 30.59
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 58.66 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 54.75 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 50.0 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 36.88
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 34.68
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 32.68
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 50.0 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 42.07
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 41.77
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 36.97
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 43.66
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 30.46
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/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 36.88
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 36.09
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 35.15
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/RecordContextInternal.java 34.0
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContext.java 30.46
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 43.66
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 34.0
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 43.26
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java 39.36
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 37.59
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/BrokerPollSystem.java 35.17
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerManager.java 32.18
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 30.67
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ProducerManager.java 30.48
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java 30.32
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/BrokerPollSystem.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 35.17
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 32.18
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/test/java/bz/stub/parallelconsumer/CommitResponseTimeoutSymptomTest.java 30.77
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 43.5
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 39.36
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 36.09
parallel-consumer-reactor/src/main/java/bz/stub/parallelconsumer/reactor/ReactorProcessor.java 30.8
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/EncodingNotSupportedException.java 55.97 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 50.21 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 48.42
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 48.21
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 38.35
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCInternalRuntimeException.java 37.05
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 32.39
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 30.02
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 37.05
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/test/java/bz/stub/parallelconsumer/internal/PCModuleCollaboratorOwnershipTest.java 32.73
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PollThreadStallDiagnosis.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/AmbientProbeExtension.java 32.78
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PollThreadStallDiagnosisTest.java 30.26
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 30.48
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/main/java/bz/stub/parallelconsumer/internal/utils/JavaUtils.java 32.57
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/CollectionUtils.java 30.23
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 37.57
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/Java8StreamUtils.java 32.57
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 35.44
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java 32.6
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 42.55
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/MetricsTeardownCannotBreakCloseTest.java 32.09
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/EncodingNotSupportedException.java 47.87
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 34.15
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 33.3
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 32.46
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 32.39
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 30.92
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 55.97 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 47.87
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 46.84
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 45.93
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 44.92
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 44.79
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 39.12
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 34.29
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.21
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 46.44
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 44.92
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 34.97
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 34.1
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 50.21 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 46.84
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 46.44
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 33.21
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 30.59
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 60.29 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 45.93
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 34.97
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 34.15
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 32.37
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 30.02
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 60.29 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 44.79
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 34.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 33.3
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 31.56
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 34.31
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionStateManager.java 32.84
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 30.32
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 43.39
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java 32.84
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/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 39.58
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 38.31
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 37.88
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkContainer.java 37.83
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardAvailableCountOwnershipTest.java 37.43
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 30.67
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 38.31
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 36.86
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 33.75
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkContainer.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkClaimStateMachineTest.java 49.11
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 37.83
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 43.39
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 37.88
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 37.59
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 36.86
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java 34.31
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/AmbientProbeExtension.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PollThreadStallDiagnosis.java 32.78
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AmbientProbeExtensionTest.java 30.07
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 32.74
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 57.08 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 43.62
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 36.14
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 40.1
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 39.63
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 36.14
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/RebalanceTest.java 35.44
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/RebalanceTest.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/RebalanceEoSDeadlockTest.java 35.44
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 54.25 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 43.62
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 39.63
parallel-consumer-vertx/src/test-integration/java/bz/stub/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 30.85
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 57.08 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 54.25 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 40.1
parallel-consumer-vertx/src/test-integration/java/bz/stub/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 35.66
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/ChaosRevokeUnderWorkKeyOrderIT.java 38.78
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 38.34
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 38.0
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ProgressProbe.java 33.4
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 32.37
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 47.25
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 38.34
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 32.29
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 52.38 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 47.25
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 38.0
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 34.74
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ProgressProbe.java 30.26
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.87
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 41.9
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.87
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 41.9
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 32.37
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 52.38 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 38.78
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/ChaosKeyOrderIT.java 34.74
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 32.29
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 52.76 ⚠️
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 52.76 ⚠️
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 31.53
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 31.53
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ProgressProbe.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 33.4
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 30.26
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 38.32
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 33.08
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/KafkaTestUtils.java 31.17
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AmbientProbeExtensionTest.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/AmbientProbeExtension.java 30.07
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/BatchTestBase.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 30.41
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/QuarantineLaneReportScriptTest.java 47.69
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineRegistryScriptTest.java 45.26
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitRejectionTestBase.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitResponseTimeoutSymptomTest.java 31.59
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 35.42
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitRejectionTestBase.java 31.59
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerOffsetCommitter.java 30.77
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.05 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java 50.74 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 44.6
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/BatchTestBase.java 30.41
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 36.24
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 36.24
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerCommitTimeoutTest.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MockConsumerCommitTimeoutTest.java 44.33
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 35.42
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 33.91
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.79
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/AbstractParallelEoSStreamProcessorTestBase.java 33.08
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ParallelEoSSStreamProcessorRebalancedTest.java 32.79
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 47.69
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineRegistryScriptTest.java 30.36
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 45.26
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineLaneReportScriptTest.java 30.36
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.52 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 87.14 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 86.71 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 83.78 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 83.78 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 83.78 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 82.3 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 82.3 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ConsumerManagerCloseOwnershipTest.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerStaleContainerTest.java 33.83
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 43.5
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 37.36
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/metrics/PCMetrics.java 32.09
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PCModuleCollaboratorOwnershipTest.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PollThreadStallDiagnosis.java 30.26
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 43.26
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorConfigurationTest.java 38.32
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 34.68
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 31.66
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 30.49
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ThreadConfinedConsumerTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ConsumerManagerCloseOwnershipTest.java 35.2
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/BlockedThreadAsserter.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/BlockedThreadAsserterTest.java 30.38
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/BlockedThreadAsserterTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/BlockedThreadAsserter.java 30.38
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 37.57
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/Java8StreamUtils.java 30.23
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/KafkaTestUtils.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorTestBase.java 31.17
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 32.74
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 35.44
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 42.55
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/MetricsTeardownCannotBreakCloseTest.java 37.36
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/OffsetEncodingBackPressureTest.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/OffsetEncodingBackPressureTest.java 37.56
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckHarness.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerLincheckTest.java 31.34
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckToolchainProbeTest.java 31.0
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckToolchainProbeTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerLincheckTest.java 35.81
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckHarness.java 31.0
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 46.49
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RacingEncodeWindowState.java 38.0
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 46.49
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateCommitShiftCompounding894Test.java 42.53
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java 33.72
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 42.53
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/PartitionStateCommitEncodeShift894Test.java 33.72
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerLincheckTest.java 32.97
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueLincheckTest.java 31.54
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerLincheckTest.java 30.8
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.25
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.85 ⚠️
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.85 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/OffsetEncoderWidenedRangeRaceTest.java 38.0
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 41.25
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java 31.54
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerLincheckTest.java 30.53
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 37.43
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 33.3
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 41.25
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckToolchainProbeTest.java 35.81
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java 32.97
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckHarness.java 31.34
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerRevokeSweepNpeTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerStaleCheckDoubleLookupTest.java 34.16
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.25
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/EpochAndRecordsMapRaceTest.java 33.83
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 39.58
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 33.75
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardAvailableCountOwnershipTest.java 33.3
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/state/WorkManagerTest.java 54.25 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkContainer.java 49.11
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/PartitionStateLincheckTest.java 30.8
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueLincheckTest.java 30.53
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/ShardManagerRevokeSweepNpeTest.java 34.16
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkClaimStateMachineTest.java 54.25 ⚠️
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.28
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.28
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 36.43
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.45
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/integrationTests/CoreAppMetricsIntegrationTest.java 36.31
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/VertxAppTest.java 35.35
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 83.78 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 83.4 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 83.04 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.63 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 79.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 79.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 78.42 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 78.42 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 82.3 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 81.92 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 81.57 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 81.17 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 78.42 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 78.42 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 78.42 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 77.03 ⚠️
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.31
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 70.11 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/main/java/bz/stub/parallelconsumer/examples/core/CoreApp.java 36.43
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 46.27
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/CoreAppTest.java 39.45
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 83.78 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 83.4 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 83.04 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.63 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 79.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 79.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 78.42 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 78.42 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 82.3 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 81.92 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 81.57 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 81.17 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 78.42 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 78.42 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 78.42 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 77.03 ⚠️
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 70.11 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 83.78 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 83.4 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 83.04 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.63 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 79.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 79.84 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 78.42 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 78.42 ⚠️
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 46.27
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/CoreAppTest.java 35.35
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 44.82
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 80.84 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 50.74 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 48.87
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 48.04
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.12 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyUnitTestBase.java

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

File Similarity (%)
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorUnitTestBase.java 31.28
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 87.14 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 86.75 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 85.95 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 83.04 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 83.04 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 83.04 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 81.57 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 81.57 ⚠️
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 44.82
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java 30.8
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 80.84 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 52.05 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 50.11 ⚠️
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 48.04
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.12 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorUnitTestBase.java

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

File Similarity (%)
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyUnitTestBase.java 31.28
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 86.71 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 86.32 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 85.95 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 82.63 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 82.63 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 82.63 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 81.17 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 81.17 ⚠️
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 42.89
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 41.33
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java 37.73
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 37.47
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 35.42
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 32.68
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java

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

File Similarity (%)
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java 42.45
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 41.33
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 36.97
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 33.37
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 32.67
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java

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

File Similarity (%)
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java 40.76
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 37.47
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java 36.09
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 42.45
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 40.76
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 37.73
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 35.66
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 30.85
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.52 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 86.75 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 86.32 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 83.4 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 83.4 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 83.4 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 81.92 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 81.92 ⚠️
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.11 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java 48.87
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 44.6

@github-actions

github-actions Bot commented Aug 31, 2026 •

Copy link
Copy Markdown

⚠️ SpotBugs Report

312 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.

astubbs added a commit that referenced this pull request Aug 31, 2026
…and migrate the #119 answer somewhere it survives

Two jobs, and the second is the one that would have cost something.

AUDITED: the "Still open" list was written 2026-08-19 and three of its items have since been done

  * The review deferral's PRECONDITION IS MET. It was deferred until #204, #31,
    #57 and #267 landed - all four have, master has been merged in, and the deadlock
    fix was re-verified afterwards on a four-cell control across both assignors. Review is now the
    right next step rather than a wasted cycle. Two NEW parents have appeared since that order was
    written - #381 and #393 - and the note says explicitly that neither is a reason to
    defer again, because neither changes this tree.
  * The roadmap edit is done, and the constraint the item stated is respected: it was not to be
    edited early in a way that asserts something not yet true, and the new wording says the fix is
    measured and unmerged, which is what is true now.
  * The merge strategy is recommended and the squash message written, in the scratchpad rather than
    the PR body.

MIGRATED: the #119 answer now lives in the family ledger

That answer existed only in this PR's own note, which is DELETED when the PR lands - so the
established answer to "does #119 close with this?" would have gone with it, and the next
person would have re-derived it from the same sightings. It is now in bug-857-family.md, which is on
master and is the durable owner of this family's accounting.

The answer, briefly: no, because #119 is a symptom bucket rather than a defect. The AB-BA
cycle the fix breaks cannot close in PERIODIC_TRANSACTIONAL_PRODUCER at all - its second edge lives
in a committer built only for the consumer-commit modes - which leaves the unbounded transactional
revoke wait, #44, the only issue upstream ever labelled a verified bug, untouched. Closing
#119 here would retire the remainder silently, which is the specific damage the merge
checklist names.

One mechanical note for whoever edits that ledger next: it carries a file-wide post-merge
checked-begin/checked-end block, so a new section inside it must NOT bring its own pair. A nested
pair breaks the outer one and the gate then flags lines far above the edit, which is a confusing
way to find out.
astubbs added a commit that referenced this pull request Aug 31, 2026
…efect, and the extraction already ruled one suspect out

This note predicted that the Performance Tests failure shared a cause with the Integration Tests one
- the stale pause cache - on the reasoning that the mechanism is commit-mode-independent. The lane
has now run with that fix in place and still fails, so the prediction is REFUTED. Recorded as a
refuted prediction rather than replaced by the new number, because a prediction that did not hold is
worth as much as one that did and vanishes if only the outcome is written down.

The measurement, same test and identical configuration:

  #381  processed=3000000/3000000  elapsedMs=42024  71387 rec/s  PASS
  #29   processed=2191095/3000000  elapsedMs=60554  36184 rec/s  FAILED

#381 is test-scope and cut from master, which makes it the closest thing to a master baseline the
lane can produce - it does not run on master. Getting that baseline by riding the reporter through
on a PR the failing one already depends on was the point of the extraction, and it arrived in time
to stop a silent halving from merging.

Two samples on one side against one on the other, all on hosted runners: enough to attribute, not
enough to treat the ratio as precise.

AND ONE SUSPECT ELIMINATED FOR NOTHING

#393's performance lane passes, and its thread-confinement refactor is also
in the failing tree. So the consumer-ownership work is not the cause, established without running an
experiment.

The general form is worth more than the result: a branch cut out of a suspect tree is a control arm
for whatever stayed behind. Check whether the decomposition already gave you one before designing a
bisect.

The cheapest untried ablation is named - the revoke fork's two log lines were raised to INFO, and
per-loop INFO logging in a three-million-record run is the right shape to cost this much throughput.
The coherence check and the pause-observation fields are on the same list. One term at a time, same
lane, control arm.

Numbers here are anchored to the runs that produced them and written in the past tense, not as
standing properties, so they read as evidence rather than as current state that nothing will
update.
…first review

First review and simplify pass over this branch - it had never had one. PR
#393 carried zero claude[bot] comments, and the green claude-review on
#29 predates this code by three weeks, so there was no prior review to
inherit. Three reviewers (reuse, quality, efficiency) ran over the branch diff; what follows is what
survived scrutiny.

DELETED A MIRROR THE BASE COMMIT HAD JUST ARGUED AGAINST

assignmentSizeCache, getAssignmentSize() and the consumer.assignment() call inside updateCache() are
gone. The field was a fresh copy of a fact Kafka owns, its only readers were one log line and a
getter nothing called, and it made updateCache() ask the consumer three times instead of two - twice
per poll, since this branch refreshes on entry as well as exit. assignment() takes the consumer's
lock and copies the assignment set to a new HashSet before .size() throws it away.

This is not a preference. The commit this branch sits on, b2e6c19, deleted pausedForThrottling for
being exactly this shape and shipped
docs/solutions/architecture-patterns/a-mirror-of-state-another-component-owns-is-a-contract-nobody-wrote.md
to name the class - "a mirror is usually a threading constraint wearing a field's clothes" - and its
own body records that the poll hot path should "read Kafka once per pass, not three to five times".
Adding an unread mirror in the next commit would have reopened the case that document closed. If
#29 needs a control-thread assignment size, it should arrive with the reader
that justifies it and the contract the document asks for at the field.

The per-poll log line goes back to log.debug from log.trace, at the level it has always been. The
demotion was not a decision, it was fallout from appending the assignment-size argument to that line.

DELETED getConsumerClass(), WHICH COULD NOT HAVE WORKED

Its javadoc says it exists "for reflection-based checks (e.g., auto-commit detection)", but the
`consumer` field is a ThreadConfinedConsumer now, and getClass() is final on Object - so it returns
ThreadConfinedConsumer.class and never KafkaConsumer, MockConsumer, LegacyKafkaConsumer or
AsyncKafkaConsumer. Every branch of
AbstractParallelEoSStreamProcessor#getAutoCommitEnabled tests exactly those names and then reflects
into fields that exist only on the real driver, so wiring this in would have silently failed the
auto-commit-disabled check rather than reporting anything. Nothing calls it today, so removing it is
behaviour-preserving and the trap goes with it. Whatever needs the driver's type must unwrap the
delegate, not ask the wrapper.

The other unwired members stay: claimConsumerOwnership, releaseConsumerOwnership and the two
subscribe overloads are package-private, correct, and the seam
#29 wires in - splitting them out buys a second review of code that will be
reviewed again when it gains a caller.

TWO GUARD-INTERNAL FIXES, ONE OF THEM IN THE REPO'S NAMED DEFECT FAMILY

releaseOwnership's failure log re-read `ownership` instead of reporting the `witness` its own branch
had tested. When the CAS is what failed, the message names an owner the method never saw and says the
caller does not hold something it held a moment earlier - the two-read divergence
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/AGENTS.md calls out as its own class,
in the one place a reader turns to when the guard misfires.

claimOwnership's `previousOwner != null && previousOwner != current` had a conjunct that cannot be
false: isOwnedBySomeoneOtherThan already established it. The null sentinel and the ternary that built
it are gone with it.

ONE TEST FIXTURE INSTEAD OF TWO COPIES

ThreadConfinedConsumerTest and ConsumerManagerCloseOwnershipTest each built a MockConsumer behind a
ThreadConfinedConsumer plus a named foreign thread - the clone both duplication engines flagged on
the PR. They now share ThreadConfinedConsumerTestBase. The copies had already drifted in the way that
matters: only one unwrapped ExecutionException, so an assertion failing on the foreign thread
surfaced in the other as a wrapper naming neither the assertion nor the thread. The shared version
unwraps, and the foreign thread's name is a constant the rejection-message assertion reads rather
than restates.

WHAT WAS LEFT ALONE, AND WHY

The entry refresh before pollingBroker.set(true), the never-steal rule, RELEASED as a state distinct
from UNCLAIMED, ConsumerOwnership being top-level rather than nested, wakeup() staying undelegated,
close() logging rather than branching on a failed claim, and the 19 duplicated signatures in the
Lombok excludes interface - all defended in the extraction commit or forced by @DeleGate, all
untouched.

VERIFIED

ConsumerManagerPauseCacheTest re-proven RED against this diff, not assumed: with updateCache() now
making two consumer calls instead of three, removing the entry refresh still fails it with
"expected: 1", and restoring it passes. The 16 tests across the four suites still pass; the full core
unit suite is 546 passed, 0 failed, 8 skipped; main and test compile clean; bin/check-all.sh 15/15.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UH2q829FDKQcqQseE8Cp7q
astubbs added a commit that referenced this pull request Aug 31, 2026
… branch calls - record the merge decision before it becomes a surprise

The simplify pass on #393 removed assignmentSizeCache,
ConsumerManager.getAssignmentSize() and the consumer.assignment() call in updateCache(), having
established there were no callers. That is true on that branch and the reasoning is sound - the
commit it sits on deleted pausedForThrottling for being the same shape, and the poll hot path is
meant to read Kafka once per pass, not three times.

It is not true of the merged result. This branch adds a public
AbstractParallelEoSStreamProcessor.getAssignmentSize() over the deleted method, and
MultiInstanceRebalanceTest calls it in a failure-time state dump. A "no callers" check run inside one
branch cannot see the branch that will merge it, which is the general form worth remembering: after
extracting work into a dependency, a deletion justified by zero callers has to be re-asked against
every branch that will merge it back.

Recorded rather than fixed, because the fix belongs to the merge and the merge is not yet due -
#393 has not landed. It fails loudly as a compile error when it happens, so
this is a note to save the next session ten minutes, not a defence against silence.

The note also says what the resolution is NOT: reverting the deletion. The surviving caller is a
diagnostic on a failure path, called once per dump, so the per-poll cost that justified removing the
cache does not apply to it - read consumer.assignment().size() at the point of use, or drop the
field. Nothing on master calls either method, so no shipped API is involved.
…rule, not vigilance

ThreadConfinedConsumer guards by overriding each Consumer method it cares about and naming that
method on a Lombok @DeleGate excludes interface, so no competing passthrough is generated. The two
lists must agree and nothing checks that they do.

Drop a signature from the excludes interface and the generated delegate wins: the call reaches the
consumer without the ownership check, with no compile error and no failing test. A new Consumer
method arriving in a Kafka client upgrade is the same hole approached from the other side - it is
delegated by default, and a default is how a guard acquires a gap nobody chose.

Added to the existing candidate list in the ArchUnit note rather than as a new note, because that
file already owns this decision and a second list would drift from it - the same reasoning the note
itself applies to frozen baselines.

Two conditions recorded with it. It is the per-invariant exception the note already allows, not the
post-v6 programme, since it pins an invariant that arrives with the work rather than policing
structure. And it must wait until the guard is actually wired, because a rule pinning an unenforced
seam pins nothing - ownership never leaves UNCLAIMED on this branch, which allows every thread.

Suggested by the simplify pass on this wrapper. Not created as a tracked task: whether it is worth
the rule is the maintainer's call, and the note is where such calls are weighed.
astubbs added a commit that referenced this pull request Aug 31, 2026
…t not come back the way it left

#393 removed ConsumerManager.getConsumerClass(), which this branch still
defines. Recorded next to the getAssignmentSize decision because both surface in the same merge and
they want opposite handling.

The method could never have worked. consumer is a ThreadConfinedConsumer and Object.getClass() is
final, so it returned the wrapper's class - never KafkaConsumer, MockConsumer, LegacyKafkaConsumer or
AsyncKafkaConsumer. Its purpose was reflective auto-commit detection, which string-matches precisely
those four names and then reflects into fields only a real driver carries.

That is what makes it worth a line here rather than a shrug. Having no auto-commit check is a gap
someone eventually notices. Having one that always takes the not-a-known-driver path looks like a
check, passes, and reports nothing - so restoring the method during conflict resolution would leave
the branch better defended on paper and no better defended in fact.

If the capability is wanted, it has to unwrap the delegate. The note says so at the point where the
conflict will be resolved, because that is the moment someone chooses a side, and the version that
compiles is the wrong one.
@astubbs

astubbs commented Aug 31, 2026

Copy link
Copy Markdown
Owner Author

@claude review this

@claude

claude Bot commented Aug 31, 2026 •

Copy link
Copy Markdown

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


Review complete

  • Read PR body, commits, and inject-branch-context notes
  • Read the diff (b2e6c190..HEAD, verified = origin/master..HEAD)
  • Review ThreadConfinedConsumer and ConsumerOwnership
  • Review ConsumerManager changes (pause-cache regression fix)
  • Review tests, and actually ran them locally
  • Post findings

Summary

This is a clean, well-reasoned extraction. The ownership lifecycle (UNCLAIMED → OWNED → RELEASED → re-claim) correctly closes the gap a simple "who owns it now" boolean/thread-id comparison would miss — the window between the poll loop releasing and the closing thread taking over. I traced the non-stealing tryClaimOwnership() CAS loop and the checkThread guard against all the states and didn't find a hole.

I ran the four new/changed test classes locally (./mvnw -pl parallel-consumer-core test -Dtest=...) and they match the PR's claim exactly: 16/16 pass — ThreadConfinedConsumerTest (9), ConsumerManagerCloseOwnershipTest (3), ConsumerManagerPauseCacheTest (1), ConsumerManagerCommitRetryBudgetTest (3).

I also verified the honesty claim in the PR body: claimConsumerOwnership()/releaseConsumerOwnership()/claimOwnership()/releaseOwnership() have zero callers anywhere outside ConsumerManager/ThreadConfinedConsumer themselves (grep -rn across src/main), so ownership genuinely never leaves UNCLAIMED today and the guard is inert, as stated.

The pause-cache fix logic checks out: wakeup() only forwards to consumer.wakeup() while pollingBroker is true (ConsumerManager.java:204), so moving updateCache() to before pollingBroker.set(true) on entry is what makes the entry-refresh race-free against a concurrent wakeup() — matching the same property the pre-existing exit-refresh already relied on. The metaCache volatile + javadoc addition is a reasonable, well-justified fix for the AT_STALE_THREAD_WRITE_OF_PRIMITIVE-blind-spot noted in this directory's own AGENTS.md.

Findings

1. Dead code: two new ConsumerManager methods have no callers (ConsumerManager.java — subscribe(Collection<String>, ConsumerRebalanceListener) and subscribe(Pattern, ConsumerRebalanceListener), plus the Collection/Pattern imports added to support them).

AbstractParallelEoSStreamProcessor.subscribe() (lines 540/546/553/560) still calls consumer.subscribe(...) on this.consumer, which is the raw consumer (options.getConsumer(), set at line 338) — not through ConsumerManager. I grepped both src/main and src/test for callers of consumerManager.subscribe( / ConsumerManager's new overloads and found none.

Given the PR's own "no half-finished implementations" discipline and that everything else here is scoped tightly to what's actually reachable, this pair looks like it was added in anticipation of #29 wiring AbstractParallelEoSStreamProcessor through ConsumerManager rather than holding the raw consumer directly — but as it stands on this branch it's unreachable code. Worth either a one-line note (dead-for-now, wired in #29) or dropping it until #29 needs it, per the repo's stated preference against speculative surface.

Fix this →

2. Minor: ConsumerManager.init()'s javadoc example doesn't match the actual construction order (ConsumerManager.java:98-99). It says the missing-group.id case is "validated later in the PC constructor's checkGroupIdConfigured()" — but tracing AbstractParallelEoSStreamProcessor's constructor, validateConfiguration() (which calls checkGroupIdConfigured(), line 386) runs at line 340, strictly before module.brokerPoller(this) at line 357, which is what eagerly constructs ConsumerManager (via BrokerPollSystem's constructor requiring it) and triggers init(). So in the current wiring, a missing group.id throws at line 386 before init() is ever reached — the try/catch's stated example can't actually occur; only other exceptions can reach it. Not a functional bug (the catch is harmless either way, and the "still diagnosable" rationale for logging the exception remains valid for genuine non-group-id failures), just a javadoc inaccuracy that could mislead a future reader about why the try/catch exists.

Not re-litigated

Everything the PR body explicitly scoped out checks out as scoped out: ArchitectureTest.java is untouched, and docs/inflight/static-archunit-main-code-rules.md records the deferred pin on the @Delegate excludes-list drift risk rather than attempting it here — that's the right call given the guard isn't wired yet. The wrapper's method coverage (poll/commit*/assignment/pause/paused/resume/groupMetadata/subscribe/close) is narrower than the full Consumer interface, but that's fine today since it exactly matches what ConsumerManager itself calls; the coverage-completeness question is explicitly the deferred ArchUnit rule's job once #29 wires the claim.
· branch refactor/thread-confined-consumer-ownership

The automated review read the two new ConsumerManager.subscribe overloads as
dead code and asked for them to be removed or explained. It was right that
nothing calls them, and right that nothing at the code said so - the PR body's
"guard installed, not guarding" paragraph is where that fact lived, and a PR
body is not where the next reader of this file will look. So the reviewer
reached exactly the conclusion that paragraph exists to prevent, which is the
evidence that a body-only note was not enough.

Keeping them rather than deleting: they are the seam #29 wires, where
the processor is changed to hold this manager instead of the raw consumer and
the ArchUnit rule pinning the invariant lands with it. A prior simplify pass on
this branch already kept them for that reason. Deleting and re-adding is churn
that also loses the reasoning a second time. The note now sits on the methods,
so the next reader gets the answer where the question occurs to them.

The review's second finding was a real inaccuracy and is corrected here. The
init() javadoc offered a missing group.id as the example of what its catch
absorbs, but the processor's constructor runs validateConfiguration() - and so
checkGroupIdConfigured() - before it asks the module for the broker poller, and
the poller is what first constructs this manager and calls init(). On that path
the missing-config error has already been thrown, naming the config, before
priming is reached, so the stated example cannot occur. The catch is justified
by other priming failures and by the manager being built lazily, which is what
the javadoc now says instead.

Comments only - no behaviour changes.
… at it

Found by bin/check-pr-analysis-surfaces.sh, not by the review: SpotBugs
(fb-contrib HES_EXECUTOR_OVERWRITTEN_WITHOUT_SHUTDOWN) fires on the
foreignThread assignment in this fixture's @beforeeach, and it fires on a line
this branch wrote - the category AGENTS.md says you fix or explain, and which
nobody had read here. The static lane is non-gating, so it went green and said
nothing, which is the #356 shape that script exists to catch.

The named harm is not present: the pool's threads are daemons, so a leaked one
could not hold a JVM open, and JUnit runs the teardown between tests so the
field is never actually overwritten while live. But overwriting a live
ExecutorService field is a leak shape regardless of who currently guarantees it
cannot happen, and the guarantee here is JUnit's lifecycle rather than anything
this class states. Shutting down what is about to be dropped is simply correct.

Chose this over the registry route deliberately.
docs/inflight/static-spotbugs-rule-registry.md sanctions suppression by RULE, in
a checked-in filter, which would switch HES off for the whole repository and
lose every future instance in new code - and it prices that at "the count of
off-rules only goes down". Three lines at one site is the cheaper answer.

Verified rather than assumed: SpotBugs over the module at the CI settings
reported the finding before and does not report it after, with test sources
demonstrably in scope (test classes appear among the other 303 findings).

Same-class sweep: HES_EXECUTOR_OVERWRITTEN_WITHOUT_SHUTDOWN has exactly one
other instance in the reactor, ChaosConductor$ChaosConductorBuilder.pcExecutor,
which also carries HES_EXECUTOR_NEVER_SHUTDOWN. It is pre-existing on master in
a file this branch does not touch, so it is inherited and stays for the
registries rather than being bulk-fixed here.
@astubbs

astubbs commented Sep 1, 2026

Copy link
Copy Markdown
Owner Author

Both findings addressed, plus one the review did not reach. Pushed as d9e3614 and de74f62.

1. The unwired subscribe pair — kept, and now explained at the code

Worth either a one-line note (dead-for-now, wired in #29) or dropping it until #29 needs it, per the repo's stated preference against speculative surface.

Took the first option. They are the seam #29 wires, where the processor is
changed to hold ConsumerManager instead of the raw consumer and the ArchUnit rule pinning the
invariant lands with it; a prior simplify pass on this branch had already kept them for that reason.

The useful part of the finding is not that they should go — it is that nothing at the code said
why they stay
. That fact lived only in the PR body's "guard installed, not guarding" paragraph,
and a PR body is not where the next reader of ConsumerManager will look. The review reaching
exactly the conclusion that paragraph exists to prevent is the evidence that a body-only note was
not enough, so the note now sits on the methods themselves.

2. init() javadoc — a real inaccuracy, corrected

So in the current wiring, a missing group.id throws at line 386 before init() is ever reached — the try/catch's stated example can't actually occur

Confirmed and fixed. validateConfiguration() (and through it checkGroupIdConfigured()) runs
before the constructor asks the module for the broker poller, and the poller is what first
constructs this manager and calls init() — so on that path the missing-config error has already
been thrown, naming the config, before priming is reached. The javadoc now says what the catch is
actually for: genuine broker-side priming failures, which have no backstop, and the fact that the
manager is built lazily so nothing guarantees that ordering for a future caller.

3. Not from the review — a SpotBugs finding on a line this branch wrote

bin/check-pr-analysis-surfaces.sh reports one finding in the "on lines this PR wrote" section:
fb-contrib's HES_EXECUTOR_OVERWRITTEN_WITHOUT_SHUTDOWN on the foreignThread assignment in
ThreadConfinedConsumerTestBase. The static lane is non-gating, so it went green and said nothing.

The named harm is absent — the pool's threads are daemons and JUnit's teardown runs between tests —
but overwriting a live ExecutorService field is a leak shape whoever currently guarantees it
cannot happen, and the guarantee here is JUnit's lifecycle rather than anything the class states.
The fixture now shuts down what it is about to drop. Chose that over the registry route on purpose:
docs/inflight/static-spotbugs-rule-registry.md sanctions suppression by rule, which would switch
HES off repo-wide and lose every future instance in new code.

Verified rather than assumed: SpotBugs over the module at the CI settings reported it before and
does not report it after, with test sources demonstrably in scope.

Same-class sweep: HES_EXECUTOR_OVERWRITTEN_WITHOUT_SHUTDOWN has exactly one other instance in
the reactor — ChaosConductor$ChaosConductorBuilder.pcExecutor, which also carries
HES_EXECUTOR_NEVER_SHUTDOWN. Pre-existing on master in a file this branch does not touch, so it
stays inherited rather than being bulk-fixed here.

The other six inherited findings the script lists in ConsumerManager (non-atomic increments of the
wakeup counters, and the commitRequested visibility one) are all on lines this branch did not
write, and are left to the registries.

Not changed

All comments and one test fixture — no behaviour change, so the PR's claims stand as written. The
full core unit suite is green locally, and all 15 gates in bin/check-all.sh pass.

… key collision

The Unit Tests lane went red on ReactorBatchTest.simpleBatchTest under KEY
ordering with the ledger's exact signature - Expected size: 3 but was: 4. That
made it a sighting to record before the log expires, which is the rule the
ledger exists to serve.

The payload is the reason this is worth more than a tally. The five records
carried keys 34, 62, 34, 34, 77 and arrived as {o0,o1}, {o4}, {o2}, {o3}: a
three-way collision on one key, two singletons, four batches against an
expectation of ceil(5/2). The 2026-08-25 sighting carried keys 29, 36, 36, 36,
71 arriving as {o0,o4}, {o1}, {o2}, {o3} - a different module, a different
collided key, the same shape. The ledger had called the expectation-versus-input
reading a lead nobody had tested; it now has two independent draws behind it,
which promotes it from one of three equal readings to the leading one. The
experiment that settles it is unchanged and still unrun.

Also restated the master-state argument rather than reusing it, because this is
the first sighting on a branch carrying main Java and the previous entries all
leaned on "no main Java" to rule out the PR. The narrower argument: relative to
the head the failure first appeared on, this branch's diff is comments plus one
core test fixture that ReactorBatchTest never loads, and its one poll-path change
reorders an existing updateCache() call rather than adding work.

The whole section is written in post-merge terms and marked accordingly, so it
still reads correctly once the branch it was found on is gone.

@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 merged commit 951ae1e into master Sep 1, 2026
34 of 35 checks passed
@astubbs
astubbs deleted the refactor/thread-confined-consumer-ownership branch September 1, 2026 04:29
astubbs added a commit that referenced this pull request Sep 1, 2026
…on Linux - it fails, and the probe says a member went silent

THE RATE EXISTS NOW, AND SO DOES A FAILURE

One failure in ten consecutive runs at the default scale, plus a passing pilot, on an otherwise idle
Linux box whose /etc/environment pins ActiveProcessorCount=8. That is the first time this test has
failed anywhere but CI - the nineteen green runs recorded in August were all on an M2 Mac Pro, and a
machine that never fails cannot separate a coordinator problem from a PC one.

IT IS A STALL, NOT THE OVERLOAD THE AUGUST SWEEP MEASURED

The detector's verdict was FLAT - "it stopped rather than ran out of time" - at 432,799 of 500,000
records with 12s of no movement. The confounded 2026-08-28 sweep failed the opposite way, with
TimeoutException at scales the machine could not finish. That difference is the whole reason this run
is evidence and that one was not.

THE PROBE MOVES THE STANDING CLAIM, WITHOUT SETTLING IT

The ambient probe caught ZOMBIE_MEMBER/REBALANCE_BLOCKED: the group dwelt in PreparingRebalance for
15s because "a member is not answering the rebalance", with the commit path full of
RebalanceInProgressException for the duration. This note's title claim - that the residual is the
Kafka group protocol under churn - describes a coordinator that cannot converge. What was observed is
a coordinator blocked on a silent member, and the members are PC instances.

It is not proof. The capacity profile kills instances continuously, and an instance killed mid-JoinGroup
is by construction a member that stops answering. But the open question is now much sharper: is the
unresponsive member one the harness stopped, or one still running?

THREE INSTRUMENTATION GAPS STAND BETWEEN THAT QUESTION AND ITS ANSWER

ProgressTracker.withDiagnostic has never been called anywhere - the hook exists, its javadoc names
pc::describeProgress, and every stall this test has ever produced ends with "no consumer diagnostic
supplied". dumpInstanceState deliberately cannot report the assignment since #393
removed the mirrored accessor. And probes.log and pc-poll-rebalance-lifecycle.log are empty on every
passing run, so a failing run has no passing run to be read against - whether a 15s dwell is anomalous
or routine under this churn is not answerable from what the runs record.

THE HANDOFF'S "NO MEASUREMENT AT ALL" WAS WRONG WHEN WRITTEN

Corrected beside the original rather than over it. Nineteen runs were already recorded in the very
note the handoff cited as owning the question. What was true is narrower: the experiment script had
never been run, having landed the same day. "The instrument has never been run" and "the question has
never been measured" are different claims, and conflating them buried a result and sent an earlier
session hunting CI history for a number that was one grep away.
astubbs added a commit that referenced this pull request Sep 1, 2026
…all four were decided

Its status line said "cluster 1 measured, clusters 2-4 undecided". That stopped being true on
2026-08-27 and nothing updated it, so a reader arriving today would think three open decisions were
waiting for them.

WHAT LANDED, WITH THE COMMIT FOR EACH

Cluster 2, ThreadConfinedConsumer, became #393 (951ae1e) - the plan said
do not land as-is, last and separately, and that is exactly how it went. Cluster 3, the counter
adjustment, became #336 (3e668a4). Cluster 4, the pausedForThrottling
reset, became #376 (b2e6c19). Cluster 1 is this PR and is still open.

THE OUTCOME WAS BETTER THAN THE PLAN IMAGINED, IN THE SAME WAY TWICE

Clusters 3 and 4 were framed here as "half a fix" and "probably a regression", which invites patching
or reverting. Neither happened. Each turned out to mirror a fact something else already owned, and
both were fixed by deleting the mirror: the load gate is now derived by conservation, and the
back-pressure pause is read from Kafka instead of tracked alongside it. Recorded because the plan's
framing would have led somewhere worse, and that is worth a future planner knowing.

WHAT WAS NOT DONE

The document is not rewritten to match today's code. The decomposition it argued is the reason those
three PRs exist, and anyone arriving from one of them needs the reasoning as it stood on 2026-08-18.
Only the status line and a closing section were added, per docs/citations.md's rule about dated
records.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UH2q829FDKQcqQseE8Cp7q
astubbs added a commit that referenced this pull request Sep 1, 2026
…o its instrument branch

THE PLAN IS DELETED, AND THE ARGUMENT FOR KEEPING IT WAS WRONG

It was defended here on the grounds that a reader arriving from one of the three PRs it produced would
need its reasoning. Checked: none of #393, #336 or #376 references it. Its
only durable citation was one line in the architecture-patterns write-up; the other three were in
notes that are deleted when this PR lands.

Nothing was lost, because that write-up already carried all four clusters as sections, in more detail
than the plan had - the measured counter table, the eager-versus-cooperative reasoning. What it did
NOT carry is the observation the plan could not have made either, so that is added: clusters 3 and 4
were the same defect twice. Each kept a local copy of a fact something else already owned, and the fix
in both was to delete the copy rather than correct it - the load gate derived by conservation, the
pause read from Kafka. The tell, stated for next time, is a field whose bugs are all of the form "X
changed and Y did not": that is a second source of truth asking to be removed, not an accounting error
to be balanced.

Three citations repaired. Two quote or lean on the plan's own text, so they point at history
(`git show a0ade8a:...`) as docs/citations.md prescribes, rather than being cut.

THE A/B DEADLOCK PROBE MOVES TO #405

Same reasoning as the torture harness it now sits beside: an overnight instrument, run by hand, in
this PR only because it was written here. Its A/B results stay - those are a finding about the
deadlock, not a property of the instrument.

That PR also gains a note on why neither instrument runs. The short version is that the obvious
reading - "a scheduled soak lane needs building" - is wrong: experiments.yml already is one, and the
real gap is that an A/B needs a control tree the lane cannot pass, and an eight-hour design does not
fit a four-hour cap.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UH2q829FDKQcqQseE8Cp7q
astubbs added a commit that referenced this pull request Sep 2, 2026
Ten commits, no Java overlap - master's core work (#257's produce-lock
handover, #393's thread-confined consumer) is nowhere near the offsets
package this branch changes. All three conflicts were in docs, and all three
were two ledgers being appended to from both sides on the same day.

WHAT THE RESOLUTION KEPT

Both flake ledgers gained entries from master AND from this branch on
2026-09-01, so every conflict resolution keeps both sides rather than choosing
one:

- test-load-tightness-flakes.md: master's inFlightMessagesCommittedIfProcessed-
  DuringShutdown[1] paragraph and this branch's committedOffsetRemoved[1] latest
  recurrence are about different tests and neither supersedes the other.
- test-untracked-ci-flakes.md: both sides added a processInKeyOrder row for
  sightings on the same day from different branches. Merged into one entry
  rather than two, because two rows under one test name is exactly the
  conflation master's own section warns against. This branch's four sightings
  are folded in as a sub-section of master's [3] bullet, where they turn "seen
  once, not reproduced" into a control-armed contention finding - and master's
  isolated-run result stops reading as a contradiction, since isolation removing
  the failure is what the contention reading predicts.
- refactoring.md auto-merged: master deleted the produce-lock double-release
  OPEN QUESTION entry because #257 answered it.

TWO REPAIRS MADE WHILE IN THERE

Master's table had a blank line between two rows, which markdown renders as two
tables with the second missing its header. Closed up.

The JStream entry said "delete this entry when #116 lands" - a marker
docs/inflight/AGENTS.md explicitly forbids on master, because the merge is the
moment nobody is looking here. Replaced with the migrate-rather-than-delete
outcome that doc names, and the attestation block it opened is now closed
rather than running into the next section's.

INHERITED AND READ

#403 makes Node the default for new bin/ scripts and deletes
check-shell-sigpipe.sh; #382 rewrites the hook guards to derive identity
from the command rather than the session; a new core AGENTS.md binds @GuardedBy
to any field change in the engine. This branch adds no scripts and changes no
shared field, so none of the three change what it does - recorded because a
green build is not evidence the ground under a design held still.

AND ONE FIX THE MERGE COULD NOT BE COMMITTED WITHOUT

#403's new bin/check-source-patterns.mjs refused this merge commit,
reporting seven of #381's experiment runners as new shell scripts and
advising --no-verify. They are master's, already grandfathered there, and this
branch never touched them.

The cause is that its `added-files` scope is the union of committed and staged
additions against the merge base - and while a merge is staged but not yet
committed, HEAD is still the pre-merge tip, so every file master added since
the branch was cut is an addition against that base. It corrects itself the
moment the merge commit exists, which is why nothing on master has seen it: it
fires only in the window where the fix has to be applied.

Membership of origin/master settles it without needing to know about merges at
all - a path already there is not new to this repository, whoever staged it -
so the subtraction lives in bin/lib/added-files.mjs as a pure function of three
lists. That placement is what lets it be tested by control pair like every rule
in the table, instead of standing up a fixture repository, which is the reason
the runner had no test to break. The four must-NOT-match cases are red-proven
against the pre-fix implementation.

Carried here rather than split out because the alternative was committing this
merge with --no-verify, and a gate that fires on somebody else's merged work
teaches exactly that bypass.
astubbs added a commit that referenced this pull request Sep 7, 2026
… contract does not cover

The commit before this one made "only the controller thread may call these" a declaration checked by
ArchUnit reachability. That check is static, and its own javadoc enumerates three ways a poll-thread
call can still arrive at a waiting acquire with the rule green: a reference that is STORED rather
than invoked (ArchUnit's model gives a gauge or an executor task the same shape as a stream stage,
so the walk cannot say WHEN a reach happens), a user-supplied `ConsumerRebalanceListener` (dynamic
dispatch through an interface is out of reach of any deny list, and it is code the walk cannot start
from), and a `synchronized` BLOCK (a MONITORENTER is not an access - the reason the rule would not
have caught confluentinc#857 itself). None of those is closable by widening the rule.

The note describes the guard that closes them, and it is NOT implemented here: the
#393 ownership shape applied to `RetryQueue`. That PR's pieces are named so
the next reader copies rather than designs - `ConsumerOffsetCommitter`'s volatile
`Optional<Thread> owningThread`, set once by `claim()` when the owning thread's loop starts and read
by `isOwner()`, and `PCModule.consumerManager()`'s thread-confinement wrapper, whose own comment
states the lifecycle rule this would follow. Applied here: the controller claims the queue when the
control loop starts (a lifecycle step, not a constructor argument, because the object exists before
the thread that will own it), the `@ControllerThreadOnly` methods assert the current thread is the
owner and fail loudly instead of taking the lock, and the guard is UNARMED while nobody has claimed -
which is what leaves unit tests that drive a `RetryQueue` directly, and init-time use, unaffected.
Cost: one reference compare per call, on a path already taking a lock.

It is positioned against the convention on master rather than beside it.
`parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/AGENTS.md` owns
"Declare thread confinement with `@ThreadConfined`, and assert it at the entry point", and the note
cites it: the two existing patterns are `RetryQueue.RetryQueueIterator`
(`@ThreadConfined(ThreadConfined.ANY)` plus `assertOnOwningThread`, with
`RetryQueueIteratorConfinementTest` failing when the two disagree) and `ThreadConfinedConsumer`, both
from #433. This guard is that shape with a NAMED thread - the control thread
- which the rule says is the right value when the code really does pin one, and which is what gives
the assertion something specific to compare against.

Two design questions are what defer it, and both are stated rather than guessed. What "fail loudly"
does inside `consumer.poll()`: a throw leaves a rebalance callback abnormally and its blast radius is
the group, while "log an error and decline" is the behaviour the queue-first sweep already treats as
safe - the better signal in a test is the worse one in production. And claim/release across a
restart: `claim()` is called once and never released, so a controller that stops and starts, or a
second processor in one JVM, needs a decision on whether a claim can be replaced, refused or dropped
at close.

Filed per `docs/inflight/AGENTS.md`: `core-` because it is product behaviour and the prefix names an
area, `task` + `reliability` because no single defect is named yet, `concurrency` label, and
`deferred` with what it waits on. No counts and nothing a command could answer.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018rEzrWYFr6oEzy6porczd3
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