Skip to content

test: a backpressure test that only passed by racing its own setup - #98

Merged
astubbs merged 9 commits into
masterfrom
fix/brokerpoller-backpressure-vacuous-await
Aug 4, 2026
Merged

astubbs merged 9 commits into
masterfrom
fix/brokerpoller-backpressure-vacuous-await

Conversation

@astubbs

@astubbs astubbs commented Jul 31, 2026 •

Copy link
Copy Markdown
Owner

What

Diagnoses AND fixes the BrokerPollerBackpressureTest.brokerPollPausedWithEmptyShardsButHighInFlight failure from the highcpu lane (run 30603617471), closing out the "diagnose, don't dismiss" inflight ledger entry. The test is rewritten as brokerPollPausedWhenBlockedInFlightFillsBuffer - its first await could never be satisfied once records arrived, and only ever passed by evaluating vacuously before partition assignment.

Fix verification (characterization-first): arrival-syncing the ORIGINAL await (3-line change) made it time out deterministically on a quiet box with zero load - RED at exactly the predicted line, 10.0s timeout - empirically confirming the diagnosis before the rewrite. The rewritten test awaits the real steady state (150 out-for-processing / 50 awaiting-selection, derived from named constants), which pins the static-buffer take-cap as a regression guard and verifies upstream confluentinc#836's in-flight-counts-toward-backpressure behaviour non-vacuously for the first time. Validation: rewritten class green across repeated runs; the three refactored classes green; full integration suite 110/110 (forkCount=4) + unit suites green locally, re-run after merging master so the result includes #100's broker-poll / rebalance-commit change.

Verdict: test-design bug (vacuous await) - not contention, not a main-code wedge, not a duplicate

  • messageBufferSize(150) pins the load factor statically at 15 (PCModule.initDynamicLoadFactor), so with all 10 workers latch-blocked, PC takes at most 10x15 = 150 of the test's 200 unique-key records. getNumberOfWorkQueuedInShardsAwaitingSelection() floors at 50 - the first await's == 0 condition is unsatisfiable once records arrive. No timeout increase can fix it.
  • Green runs pass only through a race: the await's first checks run before partition assignment (~1-2s), when the shard map is empty and the condition is vacuously true. Proof: the same-sha green Integration run (30603617430) finished the whole 2-test class in 5.5s including two 1s sleeps - a non-vacuous pass is arithmetically impossible.
  • Under box load (8 Integration broker-forks + 32 Unit forks + two PIT sweeps + Performance), produce/setup latency pushed the await start past record arrival (assignment 04:16:25.126, await start ~04:16:25.6) - from there the 10s timeout was deterministic.
  • Not a duplicate of the tight-absolute-timeout contention pattern (docs/solutions/test-flakiness/parallel-integration-tests-flaky-under-concurrency-2026-07-28.md) - loosening bounds would mask a broken condition. No fork/upstream issue tracks it; not quarantined. Test inherited from upstream Make PC message buffer size configurable confluentinc/parallel-consumer#682/Fix buffer size include in flight messages in backpressure calculation logic confluentinc/parallel-consumer#836.
  • Structural corollary: the test's named scenario (paused with empty shards + high in-flight) is unreachable by design - the take-cap and the pause threshold are the same number (150); pause fires via buffer-full (150 in-flight + 50 in shards > 150).

Changes

  • BrokerPollerBackpressureTest.java - test rewritten: steady-state awaits from named constants, arrival-race-free, javadoc explaining why "paused with empty shards" is unreachable by design (take-cap == pause threshold), 30s bounds (conditions got STRONGER; only the wall-clock allowance grew). Sibling test untouched.

  • docs/solutions/test-flakiness/vacuous-await-condition-brokerpoller-backpressure-2026-07-31.md - the single durable artifact for this fix: mechanism, the same-sha green/red arithmetic-impossibility proof technique, the classification verdict (what this was NOT), and the prevention rule ("await X == 0 where X starts at 0 and only later becomes non-zero is a red flag"). The working plan doc was collapsed into this one - it was created and completed inside this PR, so its forward-looking half was inert and its diagnosis narrative duplicated this file.

  • docs/inflight.md - ledger entry: DIAGNOSED + FIXED, with mechanism, verdicts, and pointers here.

  • CHANGELOG.adoc + regenerated README.adoc - Unreleased entry for the fix.

  • BrokerIntegrationTest.java (+ RetriesTest.java, DrainCloseTest.java) - one way to stand up a PC integration test, instead of three copies. All three opened with the same 18 lines (consumer/pcOpts/pc fields, then setupTopic() → createNewConsumer(NEW_GROUP) → options builder → new ParallelEoSStreamProcessor → subscribe), varying only in the options each test cares about - the clone the duplication bot kept flagging on every push here. startPcOnNewTopic(options) now does it once, taking the builder pre-seeded with the consumer, so each setUp keeps only its distinctive line. Its javadoc is written to be found - usage snippet first, then pointers to the sibling helpers (produceMessages, getTopic, getKcu, setupTopic, ensureTopic) - so the next test author reuses the toolkit instead of re-deriving the setup and getting it subtly wrong.

    • It returns the processor rather than assigning inherited fields on purpose: five other subclasses (TransactionTimeoutsTest, TransactionMarkersTest, RebalanceEoSDeadlockTest, RebalanceTest, PartitionOrderProcessingTest) already declare their own consumer/pc fields, which base-class fields of the same name would have silently shadowed - the exact trap the refactor exists to remove. Additive to the base (no lifecycle change), so the other 18 integration tests are untouched.
    • Result: PMD CPD clones 33 → 29, duplicated lines 1001 → 874, and the recurring inline clone thread has stopped firing.

🤖 Generated with Claude Code

Checklist

  • Changelog entry added (CHANGELOG.adoc, under == Unreleased; README regenerated from it)
  • Docs updated - new solutions doc (the working plan was collapsed into it), inflight ledger shrunk to a pointer, javadoc on the new shared helper
  • Tests added/updated - the test rewrite IS the change (validated RED-first), plus the shared-fixture refactor of three ITs; full integration + unit suites green
  • Title & body reflect the final content of this PR
  • N/A - Self-hosted runner / security implications: no CI or workflow changes

…st await, fix plan

The 2026-07-31 highcpu-lane failure of brokerPollPausedWithEmptyShardsButHighInFlight
(run 30603617471) is a test-design bug, not contention and not a main-code wedge:
messageBufferSize=150 pins the load factor statically at 15, so with all workers
latch-blocked at most 150 of the 200 unique-key records are ever taken - the first
await's shards-drained==0 condition is unsatisfiable once records arrive, and green
runs pass only by evaluating it vacuously before partition assignment. Plan rewrites
the await to the satisfiable steady state (150 out / 50 awaiting) and records the
finding; the inflight ledger entry is updated with the diagnosis and branch pointer.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Dependency Review

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

Scanned Files

None

@claude

claude Bot commented Jul 31, 2026 •

Copy link
Copy Markdown

Claude finished @astubbs's task in 3m 14s —— View job


Code Review: docs(plan): BrokerPollerBackpressureTest flake diagnosed - vacuous first await, fix plan

  • Gather context (PR diff, repo guidelines)
  • Read changed files
  • Verify diagnosis reasoning against source code
  • Post review feedback

Summary

Docs-only PR (docs/inflight.md ledger update + new docs/plans/2026-07-31-001-fix-brokerpoller-backpressure-vacuous-await-plan.md). No production or test code is touched — as stated, the actual test fix is a follow-up commit.

I cross-checked the core diagnostic claims against the current source rather than taking them at face value:

  • Static load factor = 15: PCModule.initDynamicLoadFactor() (parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/PCModule.java:126-133) — messageBufferSize=150 / getTargetAmountOfRecordsInFlight() (maxConcurrency(10) * batchSize(1) = 10) = 15, remainder 0 → DynamicLoadFactor(15, 15). Matches.
  • Take-cap = 150: getQueueTargetLoaded() = getPoolLoadTarget() (10) * factor (15) = 150 (AbstractParallelEoSStreamProcessor.java:1106-1108), and calculateQuantityToRequest() only requests target - current more work, so once numberRecordsOutForProcessing hits 150 with all workers latch-blocked, no further shard records are selected. Matches the claimed 50-record floor on getNumberOfWorkQueuedInShardsAwaitingSelection().
  • Pause threshold: WorkManager.isSufficientlyLoaded() (WorkManager.java:234-235) = (awaitingSelection + outForProcessing) > targetAmountOfRecordsInFlight * loadingFactor = > 150. So 150 out + 50 in shards = 200 > 150 → pause, exactly as described, and confirms the "take-cap == pause-threshold ⇒ empty-shards-while-paused is unreachable" structural claim.
  • Line reference: line 67 of BrokerPollerBackpressureTest.java is indeed the vacuous awaitingSelection == 0 await; the sibling test's awaitingSelection == 195 await (line 97) is a satisfiable steady state, supporting the "not a main-code wedge, sibling test proves pause/resume works" claim.
  • BrokerPollSystem pause mechanics: pause is evaluated once per poll loop iteration and only affects future fetches (consumerManager.pause), not already-returned records — consistent with the doc's timeline argument that all 200 records can land before backpressure engages, making the 150/50 split deterministic once assignment completes.

Everything I checked lines up with the code. This is a well-substantiated diagnosis, not just an assertion — the arithmetic proof (green-run duration making a non-vacuous pass "arithmetically impossible") is a nice piece of evidence and a good template for the new "vacuous await condition" flake class.

Minor / non-blocking notes

  • The plan's Unit 1 proposes deriving the steady-state numbers from named constants (MESSAGE_BUFFER_SIZE, MESSAGE_COUNT) that don't exist yet in the test — fine as a plan since it's forward-looking, just flagging so the follow-up PR doesn't silently keep magic numbers.
  • The empirical run timings/IDs (5.518s, timestamps, run 30603617471/30603617430) weren't independently re-verified against CI logs in this review — the arithmetic/code-based argument stands on its own regardless, so this doesn't affect the verdict.
  • docs/inflight.md and the plan doc are internally consistent (same numbers, same terminology for "in-flight" = out-for-processing) and the cross-linked solutions doc (parallel-integration-tests-flaky-under-concurrency-2026-07-28.md) exists as referenced.

No blocking issues found. The diagnosis is sound and the plan's proposed fix (await the satisfiable 150/50 steady state, rename the test, add a solutions doc) directly addresses the root cause rather than papering over it with a longer timeout.

@github-actions

github-actions Bot commented Jul 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 29 33 🙂 -4
Duplicated lines 874 1001 ❤️ -127
Duplication 2.62% 3.00% 👍 -0.38%
Rule Limit Status
Max duplication 5% ✅ Pass (2.62%)
Max increase vs base +0.1% ✅ Pass (-0.38%)

No new clones introduced by this PR.

✅ jscpd (language-agnostic)

PR Base Change
Clones 76 82 👍 -6
Duplicated lines 1100 1175 ❤️ -75
Duplication 3.34% 3.57% 👍 -0.23%
Rule Limit Status
Max duplication 5% ✅ Pass (3.34%)
Max increase vs base +0.1% ✅ Pass (-0.23%)
⚠️ 1 new clones introduced
  • 10 lines: parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/BrokerPollerBackpressureTest.java:8 <-> parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/DrainCloseTest.java:6

Powered by astubbs/duplicate-code-cross-check

@github-actions

github-actions Bot commented Jul 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:

🔺 Increased similarities

File A File B Base (%) PR (%) Change
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/RebalanceEoSDeadlockTest.java parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/RebalanceTest.java 36.5 36.7 +0.2
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerCommitTimeoutTest.java parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerSaslAuthenticationTest.java 49.3 49.4 +0.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java 39.0 39.1 +0.1
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerCommitTimeoutTest.java parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java 56.4 56.4 +0.1
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerEarlyCloseTest.java parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerSaslAuthenticationTest.java 52.5 52.6 +0.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 36.5 36.5 +0.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 31.1 31.1 +0.1
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerSaslAuthenticationTest.java parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java 46.6 46.6 +0.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 60.6 60.7 +0.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 45.3 45.4 +0.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 32.4 32.5 +0.1
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 35.5 35.6 +0.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java 30.4 30.4 +0.1
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 32.9 32.9 +0.0
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContext.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/RecordContextInternal.java 35.0 35.0 +0.0
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CommitRejectionTestBase.java parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerCommitTimeoutTest.java 32.4 32.5 +0.0
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerCommitTimeoutTest.java parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerEarlyCloseTest.java 70.2 70.2 +0.0
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java 41.8 41.8 +0.0
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 50.4 50.4 +0.0
parallel-consumer-core/src/main/java/io/confluent/csid/utils/Java8StreamUtils.java parallel-consumer-core/src/main/java/io/confluent/csid/utils/JavaUtils.java 35.2 35.2 +0.0

...and 28 more

Full similarity report
parallel-consumer-core/src/main/java/io/confluent/csid/utils/Java8StreamUtils.java

📄 parallel-consumer-core/src/main/java/io/confluent/csid/utils/Java8StreamUtils.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/csid/utils/JavaUtils.java 35.21
parallel-consumer-core/src/test/java/io/confluent/csid/utils/CollectionUtils.java 33.11
parallel-consumer-core/src/main/java/io/confluent/csid/utils/JavaUtils.java

📄 parallel-consumer-core/src/main/java/io/confluent/csid/utils/JavaUtils.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/csid/utils/CollectionUtils.java 39.37
parallel-consumer-core/src/main/java/io/confluent/csid/utils/Java8StreamUtils.java 35.21
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 54.24 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 40.37
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 37.07
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PCRetriableException.java 36.94
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 35.6
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 35.6
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 35.29
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 34.26
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 30.18
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 60.66 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 54.48 ⚠️
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 40.26
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 36.78
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 32.4
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 31.31
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 60.66 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 50.41 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 36.52
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 32.22
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 31.36
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 30.01
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PCRetriableException.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PCRetriableException.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 36.94
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 32.91
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 54.24 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 53.48 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 44.95
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 35.02
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 33.83
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 31.28
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 31.28
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java 30.43
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 30.15
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerOptions.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerOptions.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/ProducerManager.java 32.58
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/PartitionState.java 30.53
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 54.48 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 50.41 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 45.38
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 33.73
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 32.94
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 30.9
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 45.38
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 36.78
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 36.52
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 32.49
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContext.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContext.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/RecordContextInternal.java 35.03
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 32.75
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 33.73
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/RecordContextInternal.java 32.8
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContext.java 32.75
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 32.4
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 31.36
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/RecordContextInternal.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/RecordContextInternal.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContext.java 35.03
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PollContextInternal.java 32.8
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 32.94
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/BrokerPollSystem.java 32.86
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/BrokerPollSystem.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/BrokerPollSystem.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 32.86
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/ExternalEngine.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/ExternalEngine.java

File Similarity (%)
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 39.61
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 60.48 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 53.48 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 50.98 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 48.71
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 40.37
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java 39.06
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 37.23
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 34.15
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 34.15
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/PCRetriableException.java 32.91
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 39.06
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 31.15
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 30.43
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/PCModule.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/PCModule.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/PCModuleTestEnv.java 32.82
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/ProducerManager.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/ProducerManager.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerOptions.java 32.58
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/ProducerManagerTest.java 30.79
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 51.75 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 37.81
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 37.81
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 37.23
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 35.29
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 35.02
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 33.02
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 60.48 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 51.75 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 48.57
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 47.53
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 47.53
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 46.81
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 44.95
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 37.07
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalRuntimeException.java 31.15
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 48.71
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 46.81
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 45.46
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 38.5
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 38.5
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 30.18
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 30.15
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 50.98 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 48.57
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 45.46
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 34.26
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 33.83
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 33.02
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 32.07
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 32.07
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 63.79 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 47.53
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 38.5
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 37.81
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 35.6
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 34.15
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 32.07
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 31.28
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 63.79 ⚠️
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/EncodingNotSupportedException.java 47.53
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/NoEncodingPossibleException.java 38.5
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 37.81
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ExceptionInUserFunctionException.java 35.6
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/InternalException.java 34.15
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/offsets/OffsetDecodingError.java 32.07
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerException.java 31.28
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/PartitionState.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/PartitionState.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/PartitionStateManager.java 30.6
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelConsumerOptions.java 30.53
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/PartitionStateManager.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/PartitionStateManager.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/WorkManager.java 41.64
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/PartitionState.java 30.6
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/ProcessingShard.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/ProcessingShard.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/ShardManager.java 38.28
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/ShardManager.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/ShardManager.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/ProcessingShard.java 38.28
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/WorkManager.java

📄 parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/WorkManager.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/state/PartitionStateManager.java 41.64
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/AmbientProbeExtension.java

📄 parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/AmbientProbeExtension.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/AmbientProbeExtensionTest.java 30.21
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/KafkaSanityTests.java

📄 parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/KafkaSanityTests.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/csid/utils/LoopingResumingIteratorTest.java 33.99
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java

📄 parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 55.46 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 46.95
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 38.67
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java

📄 parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 44.12
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 41.06
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 38.67
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/RebalanceEoSDeadlockTest.java

📄 parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/RebalanceEoSDeadlockTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/RebalanceTest.java 36.7
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/RebalanceTest.java

📄 parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/RebalanceTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/RebalanceEoSDeadlockTest.java 36.7
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java

📄 parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 60.75 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 46.95
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 41.06
parallel-consumer-vertx/src/test-integration/java/io/confluent/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 30.1
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java

📄 parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 60.75 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 55.46 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 44.12
parallel-consumer-vertx/src/test-integration/java/io/confluent/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 39.36
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java

📄 parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 48.75
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 35.57
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java

📄 parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 48.75
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 37.66
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 32.13
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkCooperativeIT.java

📄 parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkCooperativeIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 50.42 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java

📄 parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkCooperativeIT.java 50.42 ⚠️
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 35.57
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 32.13
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java

📄 parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 37.66
parallel-consumer-core/src/test/java/io/confluent/csid/utils/CollectionUtils.java

📄 parallel-consumer-core/src/test/java/io/confluent/csid/utils/CollectionUtils.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/csid/utils/JavaUtils.java 39.37
parallel-consumer-core/src/main/java/io/confluent/csid/utils/Java8StreamUtils.java 33.11
parallel-consumer-core/src/test/java/io/confluent/csid/utils/LoopingResumingIteratorTest.java

📄 parallel-consumer-core/src/test/java/io/confluent/csid/utils/LoopingResumingIteratorTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/KafkaSanityTests.java 33.99
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/AbstractParallelEoSStreamProcessorTestBase.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/AbstractParallelEoSStreamProcessorTestBase.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessorTest.java 30.24
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/AmbientProbeExtensionTest.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/AmbientProbeExtensionTest.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/AmbientProbeExtension.java 30.21
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/BatchTestBase.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/BatchTestBase.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CoreBatchTest.java 30.5
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CheckQuarantineOwnersScriptTest.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CheckQuarantineOwnersScriptTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/QuarantineLaneReportScriptTest.java 45.37
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/QuarantineRegistryScriptTest.java 43.75
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CommitRejectionTestBase.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CommitRejectionTestBase.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java 32.49
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerCommitTimeoutTest.java 32.47
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CoreBatchTest.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CoreBatchTest.java

File Similarity (%)
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorBatchTest.java 51.95 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyBatchTest.java 50.64 ⚠️
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/VertxBatchTest.java 44.78
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/BatchTestBase.java 30.5
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerCommitTimeoutTest.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerCommitTimeoutTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerEarlyCloseTest.java 70.23 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java 56.44 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerSaslAuthenticationTest.java 49.37
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CommitRejectionTestBase.java 32.47
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerEarlyCloseTest.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerEarlyCloseTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerCommitTimeoutTest.java 70.23 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java 55.0 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerSaslAuthenticationTest.java 52.58 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerSaslAuthenticationTest.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerSaslAuthenticationTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerEarlyCloseTest.java 52.58 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerCommitTimeoutTest.java 49.37
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java 46.65
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerCommitTimeoutTest.java 56.44 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerEarlyCloseTest.java 55.0 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/MockConsumerSaslAuthenticationTest.java 46.65
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CommitRejectionTestBase.java 32.49
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/ParallelEoSSStreamProcessorRebalancedTest.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/ParallelEoSSStreamProcessorRebalancedTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessorTest.java 34.78
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessorTest.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessorTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/ParallelEoSSStreamProcessorRebalancedTest.java 34.78
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/AbstractParallelEoSStreamProcessorTestBase.java 30.24
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/QuarantineLaneReportScriptTest.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/QuarantineLaneReportScriptTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CheckQuarantineOwnersScriptTest.java 45.37
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/QuarantineRegistryScriptTest.java 33.24
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/QuarantineRegistryScriptTest.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/QuarantineRegistryScriptTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CheckQuarantineOwnersScriptTest.java 43.75
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/QuarantineLaneReportScriptTest.java 33.24
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/TestConventionsArchTest.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/TestConventionsArchTest.java

File Similarity (%)
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/TestConventionsArchTest.java 90.39 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/TestConventionsArchTest.java 89.72 ⚠️
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/TestConventionsArchTest.java 89.72 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/ExceptionConstructorsTest.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/ExceptionConstructorsTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/InternalRuntimeExceptionTest.java 30.08
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/InternalRuntimeExceptionTest.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/InternalRuntimeExceptionTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/ExceptionConstructorsTest.java 30.08
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/PCModuleTestEnv.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/PCModuleTestEnv.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/PCModule.java 32.82
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/ProducerManagerTest.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/ProducerManagerTest.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/ProducerManager.java 30.79
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/TestParallelEoSStreamProcessor.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/internal/TestParallelEoSStreamProcessor.java

File Similarity (%)
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelEoSStreamProcessor.java 30.9
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/offsets/OffsetEncodingBackPressureTest.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/offsets/OffsetEncodingBackPressureTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/offsets/OffsetEncodingBackPressureUnitTest.java 40.06
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/offsets/OffsetEncodingBackPressureUnitTest.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/offsets/OffsetEncodingBackPressureUnitTest.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/offsets/OffsetEncodingBackPressureTest.java 40.06
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/truth/CommitHistorySubject.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/truth/CommitHistorySubject.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/truth/LongPollingMockConsumerSubject.java 36.65
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/truth/LongPollingMockConsumerSubject.java

📄 parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/truth/LongPollingMockConsumerSubject.java

File Similarity (%)
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/truth/CommitHistorySubject.java 36.65
parallel-consumer-mutiny/src/main/java/io/confluent/parallelconsumer/mutiny/MutinyProcessor.java

📄 parallel-consumer-mutiny/src/main/java/io/confluent/parallelconsumer/mutiny/MutinyProcessor.java

File Similarity (%)
parallel-consumer-reactor/src/main/java/io/confluent/parallelconsumer/reactor/ReactorProcessor.java 52.54 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyBatchTest.java

📄 parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyBatchTest.java

File Similarity (%)
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorBatchTest.java 79.04 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CoreBatchTest.java 50.64 ⚠️
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/VertxBatchTest.java 49.22
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyPCTest.java

📄 parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyPCTest.java

File Similarity (%)
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorPCTest.java 69.57 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyTest.java

📄 parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyTest.java

File Similarity (%)
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorTest.java 33.52
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyUnitTestBase.java

📄 parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyUnitTestBase.java

File Similarity (%)
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorUnitTestBase.java 32.18
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/TestConventionsArchTest.java

📄 parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/TestConventionsArchTest.java

File Similarity (%)
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/TestConventionsArchTest.java 91.16 ⚠️
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/TestConventionsArchTest.java 90.49 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/TestConventionsArchTest.java 89.72 ⚠️
parallel-consumer-reactor/src/main/java/io/confluent/parallelconsumer/reactor/ReactorProcessor.java

📄 parallel-consumer-reactor/src/main/java/io/confluent/parallelconsumer/reactor/ReactorProcessor.java

File Similarity (%)
parallel-consumer-mutiny/src/main/java/io/confluent/parallelconsumer/mutiny/MutinyProcessor.java 52.54 ⚠️
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorBatchTest.java

📄 parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorBatchTest.java

File Similarity (%)
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyBatchTest.java 79.04 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CoreBatchTest.java 51.95 ⚠️
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/VertxBatchTest.java 50.48 ⚠️
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorPCTest.java

📄 parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorPCTest.java

File Similarity (%)
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyPCTest.java 69.57 ⚠️
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorTest.java

📄 parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorTest.java

File Similarity (%)
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyTest.java 33.52
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorUnitTestBase.java

📄 parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorUnitTestBase.java

File Similarity (%)
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyUnitTestBase.java 32.18
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/TestConventionsArchTest.java

📄 parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/TestConventionsArchTest.java

File Similarity (%)
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/TestConventionsArchTest.java 91.16 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/TestConventionsArchTest.java 90.49 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/TestConventionsArchTest.java 89.72 ⚠️
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java

📄 parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java

File Similarity (%)
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 41.48
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 40.26
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 39.8
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java 35.38
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 32.22
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java

📄 parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java

File Similarity (%)
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 39.8
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java 39.29
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/ParallelStreamProcessor.java 32.49
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelEoSStreamProcessor.java 31.31
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/JStreamParallelStreamProcessor.java 30.01
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java

📄 parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java

File Similarity (%)
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java 41.78
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 41.48
parallel-consumer-core/src/main/java/io/confluent/parallelconsumer/internal/ExternalEngine.java 39.61
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java

📄 parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelStreamProcessor.java

File Similarity (%)
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 41.78
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 39.29
parallel-consumer-vertx/src/main/java/io/confluent/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 35.38
parallel-consumer-vertx/src/test-integration/java/io/confluent/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java

📄 parallel-consumer-vertx/src/test-integration/java/io/confluent/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java

File Similarity (%)
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 39.36
parallel-consumer-core/src/test-integration/java/io/confluent/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 30.1
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/TestConventionsArchTest.java

📄 parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/TestConventionsArchTest.java

File Similarity (%)
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/TestConventionsArchTest.java 91.16 ⚠️
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/TestConventionsArchTest.java 91.16 ⚠️
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/TestConventionsArchTest.java 90.39 ⚠️
parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/VertxBatchTest.java

📄 parallel-consumer-vertx/src/test/java/io/confluent/parallelconsumer/vertx/VertxBatchTest.java

File Similarity (%)
parallel-consumer-reactor/src/test/java/io/confluent/parallelconsumer/reactor/ReactorBatchTest.java 50.48 ⚠️
parallel-consumer-mutiny/src/test/java/io/confluent/parallelconsumer/mutiny/MutinyBatchTest.java 49.22
parallel-consumer-core/src/test/java/io/confluent/parallelconsumer/CoreBatchTest.java 44.78

@github-actions

Copy link
Copy Markdown

✅ SpotBugs Report

No bugs found (new bugs only — baseline from base branch excluded).

@github-actions

github-actions Bot commented Jul 31, 2026 •

Copy link
Copy Markdown

🧪🔒 Quarantine Lane Report

Quarantined test Outcome Owner Meaning
ChaosChurnStormIT.churnStormMeetsSlosAndBalancesLedger 🚨✅ PASSED - ACTION REQUIRED #80 fix landed → delete annotation + registry entry
PartitionStateCommittedOffsetIT.committedOffsetRemoved 🟡🎲 passed (flapper) #80 proves nothing - passes most runs by nature

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

@astubbs astubbs changed the title docs(plan): BrokerPollerBackpressureTest flake diagnosed - vacuous first await, fix plan bug: BrokerPollerBackpressureTest flake diagnosed - vacuous first await, fix plan Jul 31, 2026
…isfiable shards-drained condition

Characterization-first: arrival-syncing the original awaitingSelection==0 await
made it time out deterministically on a quiet box (RED, 10.0s at the exact
predicted line), confirming the diagnosis - the static messageBufferSize load
factor caps take-out at 150 of 200 records, so the condition only ever passed
vacuously before partition assignment.

Rewritten as brokerPollPausedWhenBlockedInFlightFillsBuffer: awaits the real
steady state (150 out / 50 awaiting, from named constants - pinning the
take-cap as a regression guard), then asserts the pause, which non-vacuously
verifies upstream confluentinc#836's in-flight-counts-toward-backpressure behaviour for
the first time. 30s bounds (conditions stronger, only wall-clock allowance
grew). Solutions doc records the new 'vacuous await condition' flake class;
changelog + README regenerated; plan units ticked; ledger entry DIAGNOSED+FIXED.

Validation: RED reproducer deterministic; rewritten class green 3/3; full
integration suite 110/110 (forkCount=4) + unit suite green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@claude

claude Bot commented Jul 31, 2026 •

Copy link
Copy Markdown

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


Code Review: fix(test): rewrite vacuous BrokerPollerBackpressureTest await

  • Gather context (PR diff, repo guidelines)
  • Read changed files
  • Verify diagnosis/plan against source code
  • Post review feedback

Summary

This sync adds the actual test fix on top of the earlier docs-only diagnosis (previously reviewed). Changed files: BrokerPollerBackpressureTest.java (the fix), CHANGELOG.adoc/README.adoc (entry), docs/inflight.md (ledger → DIAGNOSED+FIXED), and updates to the plan/solutions docs.

I re-verified the core claim against source: PCModule.initDynamicLoadFactor() (parallel-consumer-core/.../internal/PCModule.java:126-133) computes staticLoadFactor = 150 / 10 = 15 exactly (no remainder), confirming the test's own javadoc comment (MAX_CONCURRENCY × MESSAGE_BUFFER_SIZE/MAX_CONCURRENCY must divide exactly). The rewritten test's steady-state await:

await().atMost(30s).untilAsserted(() -> {
    assertThat(pc.getWm().getNumberRecordsOutForProcessing()).isEqualTo(MESSAGE_BUFFER_SIZE);      // 150
    assertThat(pc.getWm().getNumberOfWorkQueuedInShardsAwaitingSelection()).isEqualTo(MESSAGE_COUNT - MESSAGE_BUFFER_SIZE); // 50
});

is non-vacuous by construction: both metrics start at 0 at test start, so the assertion cannot pass before partition assignment/record arrival — unlike the old == 0 check. This is a correct fix for the diagnosed root cause. Named constants (MAX_CONCURRENCY, MESSAGE_BUFFER_SIZE, MESSAGE_COUNT) replace the magic numbers flagged as a minor note in the earlier review, and the 210 literal at the end is now MESSAGE_COUNT + 10. CHANGELOG.adoc/README.adoc and the docs/inflight.md ledger entry are consistent with the change.

Minor / non-blocking note

  • Plan doc vs. implementation drift: docs/plans/2026-07-31-001-fix-brokerpoller-backpressure-vacuous-await-plan.md's "Execution note" for Unit 1 states "The arrival-sync step then stays in the rewritten test - it is what makes the final version race-free." However, the actual rewritten test (BrokerPollerBackpressureTest.java:93-96) has no separate arrival-sync await (await(... awaitingSelection > 0 ...)) — it goes straight to the steady-state untilAsserted. That's fine functionally (the steady-state assertion is non-vacuous on its own, as noted above, so no separate sync step is actually needed), but the plan doc's claim is now inaccurate/stale relative to what shipped. Worth a one-line correction in the plan doc so it doesn't mislead a future reader into thinking there's a guard clause that isn't there.

No functional issues found in the test rewrite itself — the fix directly addresses the diagnosed vacuous-await bug rather than papering over it with a longer timeout, and the arithmetic backing it (150 = 15 × 10, 50 = 200 − 150) checks out against current source.

@astubbs astubbs changed the title bug: BrokerPollerBackpressureTest flake diagnosed - vacuous first await, fix plan fix(test): BrokerPollerBackpressureTest awaited an unsatisfiable condition - rewrite vacuous first await Jul 31, 2026
Comment thread CHANGELOG.adoc
astubbs and others added 2 commits July 31, 2026 17:39
…'s new scope rule

Master's just-merged scope rule forbids root-cause narratives in the ledger -
the write-up lives in the solutions doc; the entry now just points at PR #98
and instructs its own deletion on merge.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@claude

claude Bot commented Jul 31, 2026 •

Copy link
Copy Markdown

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


Code Review: BrokerPollerBackpressureTest rewrite (sync)

  • Gather context (PR diff, repo guidelines)
  • Read changed files
  • Verify diagnosis/fix against source code
  • Post review feedback

Summary

Re-reviewed the current head (3d8aeeb) against origin/master. This sync's diff matches what the two prior automated reviews already covered (test rewrite + changelog/README + inflight ledger). I independently re-verified the core mechanics rather than re-trusting the earlier passes:

  • PCModule.initDynamicLoadFactor() (parallel-consumer-core/.../internal/PCModule.java:126-133): 150 / 10 = 15, remainder 0 → static load factor 15. Confirms the new MESSAGE_BUFFER_SIZE javadoc's "must divide exactly by MAX_CONCURRENCY" claim.
  • WorkManager.getNumberRecordsOutForProcessing() / getNumberOfWorkQueuedInShardsAwaitingSelection() both exist and are used correctly (WorkManager.java:154,235,254-255).
  • The rewritten steady-state await (BrokerPollerBackpressureTest.java:93-96) checks both outForProcessing == 150 and awaitingSelection == 50 inside a single untilAsserted block, so it can't pass on a partial/transient state — this is non-vacuous by construction, unlike the old awaitingSelection == 0 check which could pass before partition assignment.
  • Static load factor (150/10, no dynamic adjustment branch since messageBufferSize > 0) stays fixed for the whole test, so the 150/50 split is stable once reached — no risk of the steady-state window closing after it's first observed.
  • Timeout bumps from 10s→30s are applied uniformly across all awaits in the test, consistent with the PR's claim that conditions got stronger, not looser.

Minor / non-blocking

  • Stale plan-doc claim, still unfixed from the previous review round: docs/plans/2026-07-31-001-fix-brokerpoller-backpressure-vacuous-await-plan.md:189-194 ("Execution note") says the arrival-sync reproducer step "stays in the rewritten test - it is what makes the final version race-free." The shipped test (BrokerPollerBackpressureTest.java:93-96) has no separate arrival-sync await — it goes straight to the steady-state untilAsserted, which is non-vacuous on its own. This was already flagged in the 05:41 review on this PR and hasn't been corrected. Not functionally important (the solutions doc at docs/solutions/test-flakiness/vacuous-await-condition-brokerpoller-backpressure-2026-07-31.md describes the fix accurately), but worth a one-line correction so the plan doc doesn't mislead a future reader.
  • The duplicate-code bot flagged 14 lines shared between BrokerPollerBackpressureTest.java:41 and RetriesTest.java:39 — this is just the standard @BeforeEach/field boilerplate pattern already present across this test package (consumer/pcOpts/pc fields, setUp()), not new duplication introduced by the logic change. No action needed.
  • Unrelated to this diff: a Quarantine Lane thread on this PR is currently merge-blocking (ChaosChurnStormIT.churnStormMeetsSlosAndBalancesLedger passed and needs its @Quarantined annotation + registry entry removed, or the thread resolved with a reason). That's independent of the test-rewrite content reviewed here.

No functional issues in the fix itself. The rewritten await correctly targets a satisfiable steady state derived from named constants, matches the diagnosed root cause, and the arithmetic backing it (150 = 15×10, 50 = 200−150) checks out against current source.

@astubbs

astubbs commented Jul 31, 2026

Copy link
Copy Markdown
Owner Author

Status of the two red advisory checks - neither is caused by this PR (gating checks are all green: Unit / Integration / Performance / PR Checklist).

  1. highcpu / Mutation (PIT, full) (optional) - infrastructure: the self-hosted runner lost communication with the server mid-job (GitHub annotation on the job). The box was running three concurrent highcpu lanes at the time. Advisory/experimental job; nothing in this PR (an integration-test rewrite + docs) is input to the mutation sweep.

  2. highcpu / Chaos Pain Suite - pre-existing systemic finding from feat(chaos): cooperative-sticky variant of the W4 revoke-under-work scenario - PC's first cooperative-assignor coverage #87, not this PR: the failing test is ChaosRevokeUnderWorkCooperativeIT.revokeUnderWorkStaysProtocolHonestWithCooperativeAssignor, the cooperative-sticky W4 scenario that merged to master today in feat(chaos): cooperative-sticky variant of the W4 revoke-under-work scenario - PC's first cooperative-assignor coverage #87 and entered this branch via the master merge (10d6339). It has been red on every highcpu run since it landed, across branches and seeds:

    Per the chaos lane design, RED = real finding - this needs feat(chaos): cooperative-sticky variant of the W4 revoke-under-work scenario - PC's first cooperative-assignor coverage #87 follow-up (diagnose via the replay commands logged with each seed), independent of this PR.

Meanwhile the check most relevant to this PR - highcpu / Integration (optional) - is green: the rewritten brokerPollPausedWhenBlockedInFlightFillsBuffer passed on exactly the loaded self-hosted box class that exposed the original vacuous-await race (the failure this PR diagnoses and fixes).

…folding only

The rewritten test needs no separate arrival-sync await: the steady-state
assertion (150 out AND 50 awaiting in one untilAsserted) is unreachable
before records arrive, so it is non-vacuous by construction. Flagged by the
automated review.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@claude

claude Bot commented Jul 31, 2026 •

Copy link
Copy Markdown

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


Code Review: BrokerPollerBackpressureTest rewrite (re-sync)

  • Gather context (PR diff, repo guidelines)
  • Read changed files
  • Verify diagnosis/fix against source code
  • Post review feedback

Summary

Re-reviewed the current head (d46b5dc) against origin/master. The diff is unchanged from the last review pass except for one new commit, d46b5dc, which fixes the exact stale plan-doc note flagged by both prior automated reviews on this PR: docs/plans/2026-07-31-001-fix-brokerpoller-backpressure-vacuous-await-plan.md's "Execution note" no longer claims a separate arrival-sync await survives into the shipped test. It now correctly states that the arrival-sync was reproducer-only scaffolding, and that the shipped steady-state assertion (150 out and 50 awaiting inside one untilAsserted) is non-vacuous by construction because it's unreachable before records arrive. That matches what's actually in BrokerPollerBackpressureTest.java:93-96 — no outstanding doc/code drift remains.

Re-verified the core mechanics once more against current source (all unchanged since last pass):

  • PCModule.initDynamicLoadFactor() (parallel-consumer-core/.../internal/PCModule.java:126-129): 150 / 10 = 15, remainder 0 → static load factor 15. Confirms the MESSAGE_BUFFER_SIZE javadoc's "must divide exactly by MAX_CONCURRENCY" claim.
  • The rewritten steady-state await (BrokerPollerBackpressureTest.java:93-96) checks getNumberRecordsOutForProcessing() == 150 and getNumberOfWorkQueuedInShardsAwaitingSelection() == 50 together in one untilAsserted, so it can't pass on a partial/pre-assignment state — this is the correct fix for the diagnosed vacuous awaitingSelection == 0 check.
  • docs/inflight.md's ledger entry was also shrunk to a pointer (per a new ledger scope rule merged into master) rather than repeating the full narrative — consistent with the solutions doc at docs/solutions/test-flakiness/vacuous-await-condition-brokerpoller-backpressure-2026-07-31.md, which still carries the full mechanism write-up.

Non-blocking notes (already addressed / not new)

  • The duplicate-code bot's flag on BrokerPollerBackpressureTest.java:41 vs RetriesTest.java:39 was already addressed inline by the PR author: it's pre-existing package-wide setUp() boilerplate, unchanged by this PR's logic, and out of scope per repo policy.
  • The Quarantine Lane thread on ChaosChurnStormIT was already addressed inline by the PR author with run-by-run evidence (this branch and master both went red again right after the one green run) — correctly resolved as "flapper, not a landed fix," and unrelated to this PR's content regardless.
  • Unrelated to this diff: the ChaosRevokeUnderWorkCooperativeIT chaos-lane failure noted in the PR author's own comment is a pre-existing finding from feat(chaos): cooperative-sticky variant of the W4 revoke-under-work scenario - PC's first cooperative-assignor coverage #87 (landed via the master merge into this branch), not something introduced here.

No functional issues in the fix itself, and no outstanding review comments remain unaddressed. The rewritten await correctly targets a satisfiable steady state derived from named constants, matches the diagnosed root cause, and all arithmetic backing it (150 = 15×10, 50 = 200−150) checks out against current source.

@astubbs

astubbs commented Jul 31, 2026

Copy link
Copy Markdown
Owner Author

Review response - all three open threads addressed and resolved, one code-review finding fixed in d46b5dca.

  1. Plan doc stale claim (automated review, flagged twice): the Execution note said the reproducer's arrival-sync await "stays in the rewritten test." It does not, and the reviewer was right that this misleads a future reader. Corrected in d46b5dca - the arrival-sync was scaffolding for the RED reproducer only; the shipped test needs none, because the steady-state assertion (150 out and 50 awaiting inside one untilAsserted) is unreachable before records arrive and is therefore non-vacuous by construction. The solutions doc was already accurate and is unchanged.

  2. Duplicate-code threads (x2, BrokerPollerBackpressureTest.java:41): pre-existing package boilerplate (field declarations + setUp() shape), identical on master; this PR's diff only substitutes named constants into the builder call. No new duplication introduced - resolved with that reasoning in-thread.

  3. Quarantine Lane merge-blocking thread (ChaosChurnStormIT.churnStormMeetsSlosAndBalancesLedger "unexpected pass"): resolved via the thread's own option 2, with evidence - the scenario passed once at 05:30 on this branch, then failed at 05:38 on master and again at 05:41 on this branch. Owner PR fix(core): draining PC stops polling - 10kHz busy-spin + zombie partition hold (#857-family silent stall) #80 is still open and has not removed the quarantine, so reality still matches the ledger. Recommendation left for fix(core): draining PC stops polling - 10kHz busy-spin + zombie partition hold (#857-family silent stall) #80's owner: mark the entry flapping = true so an occasional green stops raising merge-blocking threads on unrelated PRs. Nothing in this PR touches chaos tests or the registry.

No functional changes to the fix itself since the last green validation run (integration suite 110/110 locally; highcpu Integration green on the loaded box).

@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 and others added 2 commits August 3, 2026 14:18
The plan was created and fully executed inside this PR, so its forward-looking
half (requirements trace, scope boundaries, implementation units, open
questions, risks) is now inert, while its diagnosis narrative duplicated the
solutions doc almost line for line.

Keeps the durable artifact and folds in the one thing only the plan carried:
the classification verdict - what this was NOT (not the tight-timeout
contention pattern, not a main-code bug, not already tracked) - which is the
part most likely to save a future reader from the wrong fix.

Repoints the two inbound references: the test javadoc and the inflight ledger
now cite the solutions doc, which is the artifact that still makes sense in a
year. README regeneration also picks up #86's ambient-probe changelog entry
from the master merge.

Test re-verified green after the javadoc repoint (2/2).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ckpressure-vacuous-await

# Conflicts:
#	README.adoc
@claude

claude Bot commented Aug 3, 2026 •

Copy link
Copy Markdown

Claude finished @astubbs's task in 2m 20s —— View job


Code Review: BrokerPollerBackpressureTest rewrite (re-sync)

  • Gather context (PR diff, repo guidelines)
  • Read changed files
  • Verify diagnosis/fix against current source
  • Post review feedback

Summary

Re-checked at the current head (e1b4f2ab). The only new commit since the last review round is a merge of origin/master into this branch (pulling in #100's rebalance-commit fix) — git diff origin/master...HEAD is byte-identical in scope to what was already reviewed: the same 5 files (BrokerPollerBackpressureTest.java, CHANGELOG.adoc, README.adoc, docs/inflight.md, the new solutions doc).

Since #100 touches BrokerPollSystem.java and WorkManager.java — files this PR's diagnosis depends on — I specifically re-verified those dependencies weren't disturbed by the merge:

  • PCModule.initDynamicLoadFactor() (internal/PCModule.java:126-129) still computes the static load factor as messageBufferSize / targetAmountOfRecordsInFlight with an exact-division check — 150 / 10 = 15, remainder 0. Unchanged.
  • WorkManager.isSufficientlyLoaded() (state/WorkManager.java:234-235), getNumberRecordsOutForProcessing(), and getNumberOfWorkQueuedInShardsAwaitingSelection() (:254-255) are all present and unchanged. The pause threshold and take-cap arithmetic the test pins (150 out-for-processing / 50 awaiting-selection) still hold.
  • #100's actual change (commit rebalance-exception handling in ConsumerOffsetCommitter) doesn't intersect the backpressure/pause-threshold code path at all.

Re-verified the fix itself once more against source:

  • The rewritten steady-state await (BrokerPollerBackpressureTest.java:93-96) asserts getNumberRecordsOutForProcessing() == MESSAGE_BUFFER_SIZE (150) and getNumberOfWorkQueuedInShardsAwaitingSelection() == MESSAGE_COUNT - MESSAGE_BUFFER_SIZE (50) together inside one untilAsserted — both metrics start at 0, so this can't pass before partition assignment/record arrival. That's the correct fix for the previously-vacuous awaitingSelection == 0 check.
  • docs/inflight.md's ledger entry (lines ~416-421) is shrunk to a pointer per the new ledger scope rule, consistent with the full write-up in docs/solutions/test-flakiness/vacuous-await-condition-brokerpoller-backpressure-2026-07-31.md, which I re-read in full — it's internally consistent with the shipped test (same 150/50 numbers, same javadoc rationale, accurate "Related" links) and the earlier stale plan-doc claim flagged in prior review rounds has already been corrected (that plan doc was subsequently collapsed into the solutions doc entirely, per bdaddf18).
  • CHANGELOG.adoc/README.adoc entries match, and correctly sit under Build & CI (exempt from the new issue-citation rule introduced by #109, also merged in via master).

All threads from the four prior review rounds on this PR (duplicate-code clones, the stale plan-doc note, the quarantine-lane thread) were already resolved by the author with sound reasoning, and nothing in this sync reopens them.

No functional issues found. The fix directly addresses the diagnosed vacuous-await root cause, the arithmetic backing it still checks out against current source after the master merge, and no new code was introduced by this sync — it's a clean rebase.

@claude

claude Bot commented Aug 4, 2026 •

Copy link
Copy Markdown

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


Task list

  • Gather context (PR diff, comments, custom instructions)
  • Run code review over the current diff
  • Post review feedback

Code Review: BrokerPollerBackpressureTest rewrite (re-sync at 8328acfa)

Summary: This sync is a routine merge of origin/master into the branch, pulling in 4e3fdbbe ("ci(review): make the reviewer's test-running grants actually match, and let it run ./mvnw") — a CI-tooling-only commit that touches no source files. git diff origin/master...HEAD --stat confirms the PR's actual content is unchanged and still exactly matches the PR description: 5 files, +161/-22 (CHANGELOG.adoc, README.adoc, docs/inflight.md, the new solutions doc, and BrokerPollerBackpressureTest.java).

I diffed each file against origin/master directly rather than trusting that nothing moved:

  • BrokerPollerBackpressureTest.java: byte-identical logic to the version reviewed and accepted across the last five review rounds (including the author's own "lgtm" on 2026-08-03). The rewritten brokerPollPausedWhenBlockedInFlightFillsBuffer still asserts getNumberRecordsOutForProcessing() == MESSAGE_BUFFER_SIZE (150) and getNumberOfWorkQueuedInShardsAwaitingSelection() == MESSAGE_COUNT - MESSAGE_BUFFER_SIZE (50) together in one untilAsserted — non-vacuous by construction since both metrics start at 0. Named constants replace the old magic numbers, timeouts are uniformly 30s.
  • CHANGELOG.adoc / README.adoc: identical Unreleased entry in both, correctly placed under Build & CI (exempt from the issue-citation rule from ci: cite the issue instead of the PR, and stop duplicate reviews #109, which is already merged into this branch's history).
  • docs/inflight.md: ledger entry correctly shrunk to a pointer per the newer ledger-scope convention, with a "delete this entry when test: a backpressure test that only passed by racing its own setup #98 merges" note — consistent with the full mechanism write-up retained in the solutions doc.
  • Since none of WorkManager.java / PCModule.java / BrokerPollSystem.java appear in the diff against current origin/master, the load-factor/pause-threshold arithmetic this fix depends on (150 = 15×10 static load factor, 50 = 200−150 shard remainder) is unaffected by anything that landed on master since the last review.

All prior review threads on this PR (the two duplicate-code clone reports, the stale plan-doc note, the quarantine-lane thread) were already resolved by the author with sound reasoning in earlier rounds, and this sync doesn't reopen or affect any of them.

No functional issues found, and no new content to review beyond what's already been independently verified in the five prior passes on this PR. This is ready as-is.

BrokerPollerBackpressureTest, RetriesTest and DrainCloseTest each opened
with the same 18 lines - consumer/pcOpts/pc fields, then setupTopic() ->
createNewConsumer(NEW_GROUP) -> options builder -> new
ParallelEoSStreamProcessor -> subscribe - differing only in which options
the test actually cares about. The clone detector had been flagging the
pair it could see on every push of #98.

BrokerIntegrationTest.startPcOnNewTopic(options) now does it once, taking
the builder pre-seeded with the consumer, so each setUp keeps only its
distinctive line and the interesting configuration is no longer buried in
boilerplate. Its javadoc is written to be found: it opens with the usage
snippet and points at the sibling helpers - produceMessages, getTopic,
getKcu, setupTopic, ensureTopic - so the next test author reuses the
toolkit rather than re-deriving it, and gets the setup right by default.

It returns the processor rather than assigning inherited fields on
purpose. Five other subclasses (TransactionTimeoutsTest,
TransactionMarkersTest, RebalanceEoSDeadlockTest, RebalanceTest,
PartitionOrderProcessingTest) already declare their own consumer/pc
fields, which base-class fields of the same name would silently shadow -
legal, and exactly the sort of trap this refactor is meant to remove. The
consumer and built options were scaffolding in all three classes anyway,
used nowhere outside setUp.

Additive to the base: no lifecycle change, no new @beforeeach, so the
other 18 integration tests are untouched.

Verified: the three refactored classes green (4 tests), plus the full
integration suite.
@claude

claude Bot commented Aug 4, 2026 •

Copy link
Copy Markdown

Claude finished @astubbs's task in 2m 19s —— View job


Code Review: BrokerPollerBackpressureTest rewrite (re-sync at abfac345)

  • Gather context (PR diff, repo guidelines)
  • Read changed files
  • Verify diagnosis/fix against current source
  • Post review feedback

Summary

This sync adds one new commit, abfac345 ("test: one way to stand up a PC integration test, instead of three copies"), which is the follow-up the author promised in the 2026-08-04 duplicate-code thread — it's landed in this PR rather than a separate one. It directly resolves the clone-detector finding that recurred on every prior push (BrokerPollerBackpressureTest.java:41 vs RetriesTest.java:39).

What changed: BrokerIntegrationTest.startPcOnNewTopic(UnaryOperator<ParallelConsumerOptionsBuilder<K,V>>) (new, BrokerIntegrationTest.java:189-198) centralizes the setupTopic() → createNewConsumer(NEW_GROUP) → options-builder → new ParallelEoSStreamProcessor<> → subscribe sequence that BrokerPollerBackpressureTest, RetriesTest, and DrainCloseTest each duplicated. Each setUp() now reduces to one call passing only its distinctive options; the consumer/pcOpts fields are gone from all three since (per commit message) they were unused outside setUp().

I didn't just take the commit message at face value — verified independently:

  • grep confirms consumer/pcOpts have zero remaining references in the three refactored files outside the (now-removed) declarations — nothing silently broke by dropping them as fields.
  • The field-shadowing rationale for not exposing pc/consumer as inherited fields checks out: TransactionTimeoutsTest.java:73 does declare its own private ParallelEoSStreamProcessor<String, String> pc field, so a same-named base field would indeed have been silently shadowed there — exactly the trap the javadoc says this design avoids.
  • getTopic() (@Getter String topic on BrokerIntegrationTest) is set by the helper's own setupTopic() call before getTopic() is read in subscribe(UniSets.of(getTopic())), so topic wiring is correct — and the subclasses' direct field reads of topic (e.g. BrokerPollerBackpressureTest.java:65) still resolve to the same value since topic is a package-visible field in the same package.
  • Ran ./mvnw -o -pl parallel-consumer-core -am test-compile locally: BUILD SUCCESS, confirming the refactor is type-sound (generic UnaryOperator<ParallelConsumerOptionsBuilder<K,V>> wiring, builder chaining, and the removed imports all resolve cleanly).
  • No other callers of startPcOnNewTopic exist yet outside the three refactored classes, and the change is purely additive to the base class (no @BeforeEach change, no lifecycle change) — consistent with the commit message's claim that the other 18 integration tests are untouched.

I couldn't execute the actual Testcontainers-backed integration tests in this sandbox (no Docker access), so I can't independently confirm the runtime behavior the author reports ("three refactored classes green + full integration suite"), only that the code compiles and is logically sound by inspection.

The rest of the diff (BrokerPollerBackpressureTest.java's test-logic rewrite, CHANGELOG.adoc/README.adoc, docs/inflight.md) is byte-identical to what's been independently re-verified across six prior review rounds on this PR and remains correct — no changes there.

Non-blocking notes

  • This should make the recurring duplicate-code bot thread go away on the next push, since the flagged clone no longer exists in either file.
  • Minor: startPcOnNewTopic's javadoc usage example (options -> options.ordering(KEY).maxConcurrency(10)) is illustrative pseudocode, not literally copied from a caller — fine as-is, just noting it's not verbatim from BrokerPollerBackpressureTest (which also sets messageBufferSize).

No functional issues found. The refactor is well-scoped, addresses real duplication (not just the two files the bot could see — DrainCloseTest had the identical pattern too), and doesn't touch the previously-reviewed core fix.

@astubbs

astubbs commented Aug 4, 2026

Copy link
Copy Markdown
Owner Author

Review response (abfac345) - no blocking findings; closing the one verification gap the review identified.

Runtime confirmation the sandbox couldn't get. The review noted it could verify the refactor only by inspection, having no Docker for the Testcontainers-backed tests. Run locally since: the three refactored classes green (4 tests), then the full integration suite green (bin/ci-integration-test.sh -DforkCount=4 -DreuseForks=true, BUILD SUCCESS) - so the behaviour matches the type-soundness the review confirmed.

The independent check on field shadowing is the useful one. The review verified the rationale rather than taking it from the commit message, finding TransactionTimeoutsTest.java:73's own private ParallelEoSStreamProcessor<String, String> pc - so base-class fields of that name really would have been silently shadowed there. That trap is why the helper returns the processor instead of assigning inherited fields, and it is the reason the refactor was worth checking before writing rather than after.

Minor note, deliberately left as-is. The javadoc usage snippet (options -> options.ordering(KEY).maxConcurrency(10)) is illustrative rather than copied verbatim from BrokerPollerBackpressureTest, which also sets messageBufferSize. That is intentional - the example exists to show the shape to the next test author, and a shorter one reads better for that; a verbatim copy would just age against whichever caller it was cloned from.

On the duplicate-code thread: the review predicted it would stop recurring, and it already has - both duplication engines ran on this push and neither raised the inline thread, with PMD CPD showing clones 33 → 29 and duplicated lines 1001 → 874.

@astubbs astubbs changed the title fix(test): BrokerPollerBackpressureTest awaited an unsatisfiable condition - rewrite vacuous first await test: a backpressure test that only passed by racing its own setup Aug 4, 2026
@astubbs
astubbs merged commit 6d39081 into master Aug 4, 2026
31 of 33 checks passed
@astubbs
astubbs deleted the fix/brokerpoller-backpressure-vacuous-await branch August 4, 2026 02:04
astubbs added a commit that referenced this pull request Aug 4, 2026
…double copyright headers; ledger cleanup

- Remove the concede optimizer that rode in via the pre-session ci/grumpy-runner-workflow
  merge: maven.yml restored to master (byte-identical), bin/ci-concede-check.sh deleted.
  It was removed from PR #75 by a 10-reviewer ce-review as a P0 gate-spoof (a PR could add
  a workflow named "highcpu" with a trivially-passing job and make the REQUIRED gate skip
  real tests) - inflight.md documents why it stays discarded. It should never have been in
  this PR.
- Collapse the doubled Confluent copyright header (a maven-license-plugin confluentinc#888 artifact) in
  the three files that carry it: BrokerIntegrationTest, KafkaClientUtils (both touched by
  this PR) and RetriesTest. Checker still 0 violations across 232 files.
- Ledger: delete the #98 entry (self-marked, #98 merged as 6d39081); shrink #80s own
  now-solved committedOffsetRemoved/drain narrative to a pointer + residual open tracking.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018igSVt74wPQAbRNHkXS4R8
astubbs added a commit that referenced this pull request Aug 4, 2026
…s stop colliding (#112)

The ledger had reached 677 lines and become a record of finished work. Entries
told to "delete when #98 merges" outlived three merges; the rebalance-commit fix
was still filed as awaiting PR after landing as #100; a static-state flake was
still listed as deliberately-unfixed after #101 fixed it at source. Meanwhile
#80, carrying the drain-zombie fix and the largest thing actually in flight,
appeared only as a footnote about quarantine ownership. The file's own scope rule
says entries vanish when work lands; it had stopped being applied.

Every surviving claim is now checked against GitHub, git and the code. Obsolete
entries are deleted rather than annotated: the jscpd cap is above baseline, no
workflow has path filters so the docs-only inconsistency cannot happen, the
ManagedPCInstance header carries its Modifications line, the CommitFailedException
follow-up shipped in #108, and the stacked-PR gap is closed by a new all-branches
ruleset. Upstream references now follow the convention the changelog already uses:
fork numbering reaches #111, so every bare reference at or above #162 was silently
upstream and read as ours.

With the content correct, the file became a directory. It appeared in 26 of the
last 30 master commits, so unrelated PRs conflicted on it constantly - not because
they disagreed, but because their notes were adjacent, and the merge that resolves
such a conflict silently drops one side (it happened between #108 and #110). Each
item is now its own file, named <category>-<slug>.md; two PRs recording unrelated
work touch disjoint files and cannot conflict, and finishing work is `git rm`,
which never conflicts with an edit elsewhere. The prefix is the structure - `ls
docs/inflight/` shows the shape of what is open without reading anything. There is
deliberately no committed index: it would be edited by every PR, which is the
problem the directory solves, and docs/TODO_INDEX.md is the cautionary case.

This was parked on docs/inflight-as-directory with "migrating ~600 lines of
existing entries" named as the reason not to do it. The audit is what made it
cheap. docs/refactoring.md stays a single file - 2 of the last 30 commits touched
it, so it has none of this problem.

The manifest had drifted the same way, which matters more, because it is the
declared source of truth that a future session trusts instead of re-deriving. Five
entries disagreed with reality: bug-857 recorded no fork PR while #29 was open,
#100 merged and #80 in review; fix-909 recorded no PR though #31 is open; bug-912
was in-progress when the schema's word for pushed-but-unPR'd is ready. Nothing
catches this - upstream-map.py validate only checks the schema and
upstream-sweep.sh only watches upstream, so "prs: []" beside an open PR passes
every check we have. Hence the AGENTS.md rule to update it at every lifecycle
transition, not only when starting.

Four rules now live in docs/inflight/AGENTS.md so they are inherited rather than
rediscovered: delete an entry in the PR that resolves it and never leave a "delete
when #NN merges" marker on master; never record what gh or git can answer, which
is why the open-PR table is gone; known code defects belong here even when an
issue exists, because an agent scans this directory and will not read the tracker;
and new guidance about how these notes are written goes into that file too.

Four deferred code items moved to docs/refactoring.md, where deferred work lives:
the SpotBugs thread-visibility findings, the produce-lock double release surfaced
by #110, the commitAndWait message that misstates its own wait, and jacoco's
single exec file under forked surefire.

Also shares the agent-tooling gitignore rules that until now existed only in one
checkout's .git/info/exclude, and deletes an empty duplicate-code-cross-check
clone - a git init that never fetched - rather than ignoring it.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Aug 7, 2026
Reviewing the new solution doc surfaced a hole in the checklist that same PR
had just added: it said to check open PRs, which is a collision check. The PR
that already solved something in your file is by definition merged, so
searching only the open list finds nothing and feels like diligence - worse
than not looking, because it produces false confidence. Same for issues: the
useful ones are usually closed.

Searching merged PRs BY TOUCHED FILE - not by keywords in their titles - finds,
for this investigation:

- #110, the sibling flake on this same producerTransactionLock, fixed
  four days earlier and the source of the control-arm method
- #86, which introduced the ambient probe whose "probe clean" verdict
  this work had to qualify
- #98, the backpressure test that only passed by racing its own setup -
  the sibling rule this doc deliberately does not merge with

None would surface from a symptom search or from the open list. All three are
now cited in the solution doc, with #80, #115 and #68
from the same family, and the confluentinc#803 / confluentinc#809 / confluentinc#833 cluster upstream.

Adds to the doc what the prior-art search actually covered, including what it
did NOT (the highcpu and quarantine lanes), so the next reader knows where the
gaps are instead of assuming there are none.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Aug 21, 2026
…issue-ref gate

TWO THINGS, BOTH FOUND BY VERIFYING RATHER THAN ASSERTING.

1. ReactorPCTest.concurrencyTest failed locally at "expected < 1200 but was 1266" while the full
Maven reactor ran alongside two Docker image builds on a 12-core box. Diagnosed as contention WITH A
CONTROL ARM, not by assumption, and recorded because no entry for it existed anywhere: not the
inflight ledger, the quarantine registry, docs/solutions, docs/plans or the hardening audits.

  branch, uncontended: 5 pass / 0 fail   1000, 1073, 1000, 1062, 1000
  master, uncontended: 5 pass / 0 fail   1000, 1000, 1076, 1000, 1000

Indistinguishable, both well under the threshold, run SEQUENTIALLY because running the arms together
would reintroduce the variable under test.

The control was warranted rather than skipped, and the note says why: this branch's stack modifies
ShardManager, WorkManager, ProcessingShard and WorkContainer - the classes that bound concurrency -
adding the language proxy's abandonment path. There is even a route from that change to this exact
symptom: onAbandonedResult decrements numberRecordsOutForProcessing, and a DOUBLE decrement would
under-count in-flight work, let extra records out, and read as concurrency exceeding its maximum.
The author already guarded it, with an early return placed before an unconditional decrement. It is
also unreachable from this test - nothing in core or reactor calls the abandon path - which is the
half the master baseline confirms empirically.

The note says what not to do: do not raise MAX_CONCURRENCY_OVERFLOW_ALLOWANCE and do not quarantine.
Quarantine needs a diagnosis and is master-state; this fails on neither master nor an idle box.
Loosening the allowance would delete the only signal that the bound is real, in the library whose
whole purpose is bounded concurrency.

2. The gate was RED on a commit already pushed, and I had not re-run it after writing that file. It
flagged five "unqualified issue references" that are JVM thread ids in a quoted jstack (#98, #99,
#118, #119, #188). Wrapped in the gate's own documented exempt-begin/exempt-end markers for quoted
source material - which is what that mechanism exists for, not a way around a red check. Gate now
exits 0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WcdtMdmdhyYug3krZRWkZT
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