Skip to content

perf(offsets): stop walking every offset when only distance-based encoders are active - #106

Merged
astubbs merged 14 commits into
masterfrom
perf/sparse-offset-encoding
Sep 7, 2026
Merged

astubbs merged 14 commits into
masterfrom
perf/sparse-offset-encoding

Conversation

@astubbs

@astubbs astubbs commented Aug 3, 2026 •

Copy link
Copy Markdown
Owner

Description

OffsetSimultaneousEncoder.invoke() visited every offset between the committed base offset and the highest succeeded offset. When that range spans a large gap - up to ~2.1 billion - it becomes a multi-second scan on the commit path. This PR makes it visit only the offsets where the completion state actually changes, when it is safe to do so.

This resolves the encoder's own long-standing TODO: "VERY large offset ranges is slow (Integer.MAX_VALUE) - encoding scans could be avoided".

Why this is safe

RunLengthEncoder accumulates the open run by the delta to the previously-seen offset, not by counting calls:

final long delta = relativeOffset - previousRangeIndex;
...
currentRunLengthSize = Math.toIntExact(Math.addExact(currentRunLengthSize, delta));

So for a maximal run of same-state offsets [a,b]:

  • the call at a sees a state change, closes the previous run and opens a new one of size 1;
  • the call at b adds delta b-a, giving exactly b-a+1;
  • any extra calls inside (a,b) telescope to the same total, so redundant visits are harmless.

Visiting each run's first and last offset is therefore byte-identical to visiting all of them. Both ends are required - visiting only run starts would close every run at length 1 - and offset 0 is required as the initial anchor, since previousRangeIndex starts at KAFKA_OFFSET_ABSENCE.

Run boundaries can only occur at an incomplete offset or immediately next to one, so the visit set is {0, length-1} plus each in-range incomplete's own offset and its two neighbours. It is sized by the number of incompletes, never by the range - which is the whole point when the range can be ~2.1 billion wide.

What is NOT changed

BitSet and ByteBuffer encoders write one unit of output per call and genuinely need every offset. The full scan is retained whenever any active encoder requires it. That is expressed as OffsetEncoder.requiresEveryOffset(), which defaults to the safe value (true) and is overridden only in RunLengthEncoder - so any future encoder gets correct behaviour without knowing this optimisation exists, and opts in deliberately.

Note the sparse path is reachable in production precisely because the large-range case is the one where BitSetEncoder cannot even be constructed, leaving only the RunLength encoders.

Verification

A new differential test (OffsetSimultaneousEncoderSparseIterationTest, 130 cases, fixed seed) runs both strategies over generated scenarios and asserts the encodings are byte-for-byte identical, that the key sets match, and - importantly - that the sparse path was actually taken (otherwise the test could pass while testing nothing). Scenarios cover: zero-length and single-offset ranges, no/all incompletes, incompletes at first/last/middle, adjacent blocks at both ends, incompletes outside the range, alternating runs of width {1,2,3,17,500}, and randomised lengths {1,2,3,7,64,999,5000} × densities {0, .01, .1, .5, .9, 1.0} with varied base offsets. Plus an independent round-trip through packSmallest → decodeCompressedOffsets, a test that the full scan is used while a BitSet encoder is active, and the ~2.1B-range production trigger.

No existing test is weakened, skipped or excluded. RunLengthEncoderTest changes are javadoc only - its assertions (hasSize(2) / hasSize(0)) are untouched; the old comment asserted the encoder "walks every offset", which this PR makes false.

The two defects review found, and how the tests were proven

Codex found two defects in the first version of the in-range filter, both confirmed by an independent Claude review, both fixed in 0583b385a. They break the same premise, which is what makes them correctness bugs rather than edge cases: the boundary proof holds only if the visit set contains every in-range incomplete. Miss one and the run boundary beside it is never visited, the run is absorbed into its neighbour, and the encoding silently diverges from the full scan - no exception, a bad commit.

Both are latent, not reachable by a running deployment: the first needs highestSucceededOffset == Long.MAX_VALUE, and the only production supplier of the incompletes set collects into a natural-order TreeSet.

The regression tests were verified by sabotage, not assumed. With the old loop restored, each new test fails with its predicted symptom - an empty encoding map for the Long.MAX_VALUE range, a byte mismatch against the full scan for the reverse-ordered set - while all 130 pre-existing scenarios still pass. That is direct proof the fixed-seed differential test could never have caught either defect, rather than an assertion that it does not happen to generate the shapes.

Core suite green on the merged tree - 0 failures, 0 errors, with only the suite's pre-existing assumption-based skips. Reproduce with ./mvnw -Pci -pl parallel-consumer-core -am test.

Side benefit: the CI unit gate

RunLengthEncoderTest drops from tens of seconds to a fraction of one. It is the slowest class in the unit suite and - because surefire cannot split a single class across forks - a hard floor on the 2-core gate, so removing it moves the whole gate rather than just that class. It is also the suite's largest source of run-to-run variance (the same class has been measured anywhere from 67s to 166s for identical code, depending on fork placement), which is what had made the gate hard to benchmark at all.

Warning

The gate-level seconds originally quoted here have been withdrawn pending a re-measurement. They were taken before #265 closed a leak in which core's junit-platform.properties was packaged at the root of the core tests jar, so every dependent module ran thread-parallel regardless of its own parallel-tests setting. This branch has now merged that fix, so the old baseline describes a gate that no longer exists. The class-level win is not in doubt - it is a change in algorithmic complexity, visible in isolation - but the whole-gate delta is being re-taken on the merged tree. Tracked in docs/inflight/branch-parallel-measurement-contamination.md.

Reviewer notes

  • dropEncodersRequiringEveryOffset() is a package-private test seam on a production class - it reproduces the production encoder line-up on small, fast ranges so the differential test doesn't need a 2.1B-wide range. It is a mutator that production code must never call; flagging it explicitly rather than burying it.
  • Exception timing differs on the sparse path: a v1 run-length overflow now throws on one large delta rather than incrementally. The outcome is identical - the encoder is removed from activeEncoders on first throw and so never reaches registerEncodings, leaving it absent from encodingMap either way - and the overflow predicate is the same, since both paths reach the same total run length. Covered by the differential test and by testSimultaneousWithOverflowErrors.
  • The in-range filter is a hand-written loop rather than SortedSet#subSet, deliberately: subSet throws IllegalArgumentException if it is ever handed an already-restricted view, and that would surface as a failure to encode a commit. That rationale stands; the first version of the loop did not. It bounded by an exclusive end offset and exited early on the first out-of-range entry, and cross-model review found two defects in exactly those two decisions (see below). It is worth being explicit that subSet would have honoured the set's own comparator - so the hand-written replacement was worse on precisely the axis the original note claimed safety on. The loop now bounds by the inclusive last offset, which reconstructs highestSucceededOffset and so cannot wrap, and it does not exit early: the early exit encoded an ordering assumption the class explicitly disclaims, and could never fire in production anyway, because encodeOffsetsCompressed samples the high-water mark once and derives both the incompletes set and this range top from it. The reasoning is in the code, so it is not re-added.

Relationship to #105

Independent - different files, and either can merge first. Both have since merged master and dropped their changelog entries under the policy that a PR never adds one, so the rebase they once needed against each other is gone. #105 covers CI test scheduling; this PR reduces the actual CPU work, and the two compose.

Related issues

Mirrors this touches, without a Fixes keyword - it improves the offset-encoding hot path but
does not resolve either issue.

Checklist

  • Changelog entry added (CHANGELOG.adoc, under == Unreleased) - N/A - the entry this PR originally carried was dropped when it merged master. Repo policy changed while this branch was open: a PR never adds a changelog entry, because the file is generated at release time from commit messages. The substance is in the commit body.
  • Docs updated - the docs/inflight.md entries this closed out went with that file when master split it into docs/inflight/; nothing in master's per-item notes tracks this work as open, and docs/todo-index.md is regenerated because this PR deletes two markers
  • Tests added/updated - new differential test guarding byte-identical output between the two iteration strategies, over generated scenarios at a fixed seed
  • Title & body reflect the final content of this PR
  • Self-hosted runner / security implications considered - N/A - no CI, workflow, runner or permission changes; this is a library code change.

🤖 Generated with Claude Code

https://claude.ai/code/session_015Xx8GAnzc8F7ksrvpYj8hC

…oders are active

OffsetSimultaneousEncoder.invoke() visited every offset between the committed
base and the highest succeeded offset. When the range spans a large gap - up to
~2.1 billion - that is a multi-second scan on the commit path, and it is exactly
the case where BitSet encoders cannot be constructed, leaving only RunLength.

RunLengthEncoder accumulates the open run by the DELTA to the previously seen
offset, not by counting calls. So for a maximal run [a,b], visiting a (opens the
run) and b (adds b-a) yields the identical run length to visiting every offset,
and extra visits inside the run telescope harmlessly. invoke() therefore only
needs each run's first and last offset, which the incompletes already imply.

The full scan is retained whenever any active encoder requires every offset
(BitSet, ByteBuffer). That is expressed as OffsetEncoder.requiresEveryOffset(),
defaulting to the safe value so a future encoder opts into sparse deliberately.

Byte-identical output is enforced by a new 130-case differential test that runs
both strategies over generated scenarios (fixed seed) and compares encodings
byte-for-byte, and also asserts the sparse path is genuinely taken.

RunLengthEncoderTest: 62.3s -> 0.2s. It was the slowest class in the unit suite
and, because surefire cannot split one class across forks, a hard floor on the
CI gate - as well as its largest source of run-to-run variance.

Resolves the encoder's own long-standing TODO (VERY large offset ranges is slow).

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

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown

Dependency Review

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

Scanned Files

None

@claude

claude Bot commented Aug 3, 2026 •

Copy link
Copy Markdown

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


Claude is reviewing this PR

Tasks

  • Gather context (PR body, diff, files)
  • Read changed source files in detail (OffsetSimultaneousEncoder, RunLengthEncoder, OffsetEncoder)
  • Read new differential test (OffsetSimultaneousEncoderSparseIterationTest)
  • Check correctness of sparse iteration logic vs RunLengthEncoder delta-based accumulation (traced by hand through multiple scenarios)
  • Check requiresEveryOffset() default & override wiring (only RunLengthEncoder overrides; BitSetEncoder/ByteBufferEncoder correctly default to true)
  • Verify copyright headers (bin/check-copyright-headers.sh — 0 violations)
  • Run unit tests locally to verify claims (running now)
  • Post final review

@github-actions

github-actions Bot commented Aug 3, 2026 •

Copy link
Copy Markdown

✅ Duplicate Code Report

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

✅ PMD CPD

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

No new clones introduced by this PR.

✅ jscpd (language-agnostic)

PR Base Change
Clones 96 96 ➖ 0
Duplicated lines 1361 1361 ➖ 0
Duplication 0.80% 0.82% 🙂 -0.02%
Rule Limit Status
Max duplication 2% ✅ Pass (0.80%)
Max increase vs base +0.1% ✅ Pass (-0.02%)

No new clones introduced by this PR.

Powered by astubbs/duplicate-code-cross-check

@github-actions

github-actions Bot commented Aug 3, 2026 •

Copy link
Copy Markdown

📌 Duplicate code detection tool report

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

🆕 New file similarities introduced

File A File B Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ProgressProbe.java 31.4
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineLaneReportScriptTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineRegistryScriptTest.java 30.5
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ProducerManager.java 30.3
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 30.2
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java 30.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetSimultaneousEncoder.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/OffsetSimultaneousEncoderSparseIterationTest.java 30.1

🔺 Increased similarities

File A File B Base (%) PR (%) Change
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/JavaUtils.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/CollectionUtils.java 33.8 36.1 +2.3
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TransactionalBulkCommitTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerTest.java 44.2 45.7 +1.5
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkClaimStateMachineTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerTest.java 53.2 54.5 +1.3
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TransactionalBulkCommitTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkClaimStateMachineTest.java 73.8 75.0 +1.2
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CheckQuarantineOwnersScriptTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineRegistryScriptTest.java 43.4 44.6 +1.2
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkContainer.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TransactionalBulkCommitTest.java 36.5 37.7 +1.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 47.5 48.5 +1.0
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorConfigurationTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/SubmitWorkToPoolShutdownRaceTest.java 36.5 37.3 +0.8
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkContainer.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkClaimStateMachineTest.java 49.2 50.0 +0.8
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CheckQuarantineOwnersScriptTest.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineLaneReportScriptTest.java 39.2 40.0 +0.8
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 44.2 44.9 +0.8
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/ThrowableUtils.java 30.4 30.9 +0.6
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 33.4 34.0 +0.6
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java 35.3 35.9 +0.5
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 32.6 33.1 +0.5
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodedOffsetPair.java parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetMapCodecManager.java 36.7 37.2 +0.5
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ProducerManager.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java 33.8 34.3 +0.5
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/SubmitWorkToPoolShutdownRaceTest.java 40.7 41.2 +0.5
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 38.6 39.1 +0.5
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PollContextInternalTest.java 39.9 40.2 +0.4

...and 128 more

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

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

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

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

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

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

File Similarity (%)
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java 55.1 ⚠️
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/BootstrapResetTripleWriteProbes.java 38.52
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CalibrationProbes.java 37.42
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 55.59 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 37.66
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 31.98
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 30.24
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 30.08
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 55.26 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 55.15 ⚠️
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 43.21
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 41.2
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 33.36
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 32.92
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java 31.37
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 55.15 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 48.05
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 41.22
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 38.57
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 33.91
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 55.26 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 51.98 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 48.05
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 40.35
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 34.17
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java 33.53
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 51.98 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 41.2
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 38.68
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 38.57
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContext.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PollContextInternalTest.java 40.25
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java 35.86
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ProducerManager.java 30.32
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/RecordContext.java

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/SubmitWorkToPoolShutdownRaceTest.java 41.19
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java 39.18
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 37.02
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/BrokerPollSystem.java 35.64
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ProducerManager.java 33.96
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerOptions.java 32.16
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerManager.java 31.6
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java 30.39
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java 30.11
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/BrokerPollSystem.java

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ExternalEnginePipelineBufferTest.java 41.23
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 39.18
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 35.22
parallel-consumer-reactor/src/main/java/bz/stub/parallelconsumer/reactor/ReactorProcessor.java 30.37
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 49.34
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 48.5
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 46.75
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 37.66
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCInternalRuntimeException.java 36.99
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 36.41
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 31.41
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCInternalRuntimeException.java

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 31.71
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 31.41
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 30.9
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 30.24
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/CorruptOffsetMetadataException.java

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 48.5
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 44.92
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 34.01
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 33.13
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 49.34
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 44.92
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 31.98
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetEncoding.java

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/OffsetSimultaneousEncoderSparseIterationTest.java 30.09
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 57.88 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 34.01
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 31.71
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 30.08
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/UnsupportedOffsetEncodingException.java 50.08 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetEncoding.java 37.58
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/CorruptOffsetMetadataException.java 32.04
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/UnsupportedOffsetEncodingException.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 32.2
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionStateManager.java 32.12
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 30.11
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionStateManager.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 44.39
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 39.41
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 36.89
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardAvailableCountOwnershipTest.java 34.85
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkContainer.java 32.38
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueRequeueWindowTest.java 30.14
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 44.39
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueRequeueWindowTest.java 40.22
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 38.55
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 36.8
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerRevokeSweepNpeTest.java 31.42
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkContainer.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionStateManager.java 42.96
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 37.02
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 36.89
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 36.8
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java 32.2
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/KafkaSanityTests.java

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

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

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalCrashReplayIT.java 46.18
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalPartialResultSetIT.java 36.56
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TransactionalClaim.java 33.73
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalVisibilityIT.java 32.4
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalEagerProcessingIT.java 31.1
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalCrashReplayIT.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalBatchVisibilityIT.java 46.18
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TransactionalClaim.java 35.21
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalEagerProcessingIT.java 32.94
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalEagerProcessingIT.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java 35.39
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TransactionalClaim.java 33.03
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalCrashReplayIT.java 32.94
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalBatchVisibilityIT.java 31.1
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalPartialResultSetIT.java

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 42.64
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkKeyOrderIT.java 40.71
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 37.29
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 33.78
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 33.0
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 43.22
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 42.64
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 39.07
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkKeyOrderIT.java 51.6 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 43.22
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 37.29
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 33.82
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkCooperativeDrainIT.java

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 39.07
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 33.82
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 33.78
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ProgressProbe.java 31.44
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/DiagnosticQuietCap.java

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorBatchTest.java 52.4 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java 50.61 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 44.42
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/BatchTestBase.java 30.34
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ForeignThread.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ThreadConfinedConsumerTestBase.java 34.89
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/JStreamLiveResultStreamTest.java

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/ParallelEoSSStreamProcessorRebalancedTest.java 32.27
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorTestBase.java 31.74
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineLaneReportScriptTest.java

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 87.28 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 86.9 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 86.9 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 83.53 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 83.53 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 83.53 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 82.04 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 82.04 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TransactionalClaim.java

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateDirtyFlagFenceTest.java 39.87
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/LoadFactorCeilingReportingTest.java

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProducerManagerTest.java 44.88
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 40.25
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProduceLockHandover.java 32.84
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProduceLockHandover.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PollContextInternalTest.java 44.88
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/ProduceLockHandover.java 36.17
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 35.86
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionalEagerProcessingIT.java 35.39
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ProducerManager.java 34.27
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionTimeoutsTest.java 33.49
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 30.39
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/SubmitWorkToPoolShutdownRaceTest.java

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetSimultaneousEncoder.java 30.09
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/offsets/WorkManagerOffsetMapCodecManagerTest.java

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/OffsetEncoderWidenedRangeRaceTest.java 43.91
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateCommitShiftCompounding894Test.java 39.89
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java 30.06
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateCommitShiftCompounding894Test.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/LastCommitTimeFenceTest.java 39.87
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerStaleCheckDoubleLookupTest.java 43.75
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 40.22
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 33.82
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 30.14
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardAvailableCountOwnershipTest.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueLincheckTest.java 40.11
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java 32.24
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerLincheckTest.java 31.19
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckToolchainProbeTest.java 30.08
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerRevokeSweepNpeTest.java

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 39.41
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 38.55
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueRequeueWindowTest.java 33.82
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardAvailableCountOwnershipTest.java 31.28
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkClaimStateMachineTest.java

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 83.53 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 82.78 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 82.43 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.43 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 79.23 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 79.23 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 77.82 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 77.82 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 83.53 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 82.78 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 82.43 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.43 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 79.23 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 79.23 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 77.82 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 77.82 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 83.53 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 82.78 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 82.43 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.43 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 79.23 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 79.23 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 77.82 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 77.82 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/VertxAppTest.java

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 43.21
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 41.93
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java 37.99
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 37.81
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 34.17
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 33.91
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java

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

File Similarity (%)
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java 43.35
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 41.93
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 41.22
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 38.68
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 32.92
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java

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

File Similarity (%)
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java 40.38
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 37.81
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java 35.22
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorBatchTest.java 49.93
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java 48.25
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 44.42

@github-actions

github-actions Bot commented Aug 3, 2026 •

Copy link
Copy Markdown

⚠️ SpotBugs Report

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

Updated for 001f50b · run 34083183330 · 2026-09-07 04:39 UTC

@github-actions

github-actions Bot commented Aug 3, 2026 •

Copy link
Copy Markdown

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

Quarantined test Outcome Owner Meaning
ChaosChurnStormIT.churnStormMeetsSlosAndBalancesLedger 🔴 failing (expected) #80 quarantine holding
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.

Superseded by a newer quarantine lane report.

@astubbs
astubbs marked this pull request as draft August 3, 2026 02:33
astubbs added a commit that referenced this pull request Aug 5, 2026
A bare #NN means THIS fork. A bare number above the fork's own highest issue is
therefore almost always an upstream reference pointing at the wrong repo -
harmless-looking today, and wrong for real once the fork's numbering reaches it.
Now that every upstream issue is mirrored, there is nearly always a fork number
to use instead.

The gate runs in the existing PR Checklist job, on ADDED lines only, and adapts
as the repo grows: it reads the fork's current highest issue number from the API
rather than hard-coding a threshold that rots.

Three files are exempt because a bare number legitimately means upstream in
them - CHANGELOG.adoc (its own header says entries below 0.6.0.0 predate the
fork), upstream-map.yaml (every number is upstream by construction), and
upstream-pr-analysis.adoc. Those are named in the module rather than left to
judgement because a naive sweep on 2026-08-05 rewrote exactly those three
wrongly. Same reason the rule skips javadoc member links, code spans and URLs.

Escape hatch mirrors the changelog gate: "issue-refs: N/A - <reason>".

Logic is a testable module with 11 assertions running before the gate, following
changelog-ref-gate.js - that gate has shipped two real misjudgements, so this one
proves its own rules first.

PHASE 5 finished. Five single-mirror PRs carry both numbers in the title (#29,
#31, #51, #57, #116). #53 and #106 span or only partly address several mirrors,
so they get a Related issues section listing them WITHOUT a Fixes keyword -
verified 0 closing references on each. A title listing three mirror numbers helps
nobody, and Fixes on partial work is the error the #233 / #326 / confluentinc#857 mirrors
already document.

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

astubbs commented Aug 6, 2026

Copy link
Copy Markdown
Owner Author

Review note: the changelog hunk needs removing

CHANGELOG.adoc is no longer a per-PR chore. PR #113 (commit e3b1601e, on master) moved release notes to generation from the commit log at release time, and AGENTS.md -> Changelog now says: "Nothing about it is a per-PR chore. Do not add entries in a feature PR." This PR predates that, so its entries are not a mistake by anyone - they just need dropping when you next update from master.

Why removing them loses nothing: the section for the release being cut is generated from git log <last-tag>..HEAD, so this work still gets described - assembled as a set, with related commits merged and the wording rewritten for a reader who was not here. That is the part a per-PR entry could never do.

What it asks of you instead: the commit message is now the raw material. A subject that says what changed and, where it matters, what it changed for a user - with the diagnosis and rejected alternatives in the body.

Specific to this PR

The performance work is clearly user-visible - a multi-second scan on the commit path for large offset ranges is exactly what a changelog exists to tell people about - so this will get an entry at release time.

What changes is the shape. The current hunk runs to roughly 150 words covering OffsetSimultaneousEncoder.invoke(), delta accumulation in RunLengthEncoder, and the differential test across 130 scenarios. The rule is now "one sentence, about 25 words, then the link" - name what a reader would have seen, not how the fix worked. PR #113 was written specifically to remove entries of this shape; its own commit message cites a 316-word entry explaining that a tool-grant string did prefix matching.

The mechanism detail belongs in the commit message and the PR body, where the generator will find it and where a reader who wants it can follow the link.

astubbs added a commit that referenced this pull request Aug 8, 2026
Same class as the previous commit, three more sites the local gate found once
the audit-branch fix merged up:

- "#149, #160, #236" - the shorthand after the first qualified number
  still reads as a bare reference to the gate, and it is right to: nothing about
  position makes #160 unambiguous.
- The salvaged OOM diagnostics carried "PR #49" verbatim from its branch. A
  salvage is not a reason to import a coin-flip reference, so it is qualified
  here too.
- The plan's dependency diagram had "#106 / #207" for the same reason as
  the first item.

bin/check-issue-refs.sh passes across all 20 changed files.

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

Directory move only, so every path is 100% similar and git's exact-rename detection
cannot fail on it. The content edits follow in the next commit.

Generated by bin/rename-packages.sh.
Text edits only. No file moves in this commit, so it cannot dilute the rename
detection in its parent.

Generated by bin/rename-packages.sh.
astubbs and others added 3 commits September 7, 2026 12:35
The branch has sat since early August while master gained several hundred
commits, including the whole-repo io.confluent.* -> bz.stub.* package rename.
The rename had already been applied to this branch by an earlier sweep, so both
sides agree on where every file lives - which is what made this merge tractable
rather than a rewrite. It still produced 115 conflicts, and all but a handful
were artefacts of that rename landing on both sides independently.

What master brings that this branch needs
-----------------------------------------
#207, the offsets decode-path rework this PR declares a
dependency on, is now in the tree: EncodedOffsetPair routes every unreadable
payload through handleUnreadableMetadata, and the new typed exceptions
(CorruptOffsetMetadataException, UnknownOffsetMetadataMagicException,
UnsupportedOffsetEncodingException) arrive with it. Master also fixed three log
statements in OffsetSimultaneousEncoder - they now pass the exception rather
than its getMessage(), and the ByteBuffer arm no longer names BitSetEncoder in
its own warning. All three merged into the branch's rewritten invoke() cleanly.

How the mechanical majority was resolved, and why that was safe
---------------------------------------------------------------
82 of the 115 conflicts were proved to be rename-only before anything was
touched: our side of each was normalised back to the pre-rename spelling (which
has to collapse more than the top-level package, because the rename also folded
io.confluent.csid.utils into ...parallelconsumer.internal.utils and
io.confluent.csid.testcontainers into ...internal.testcontainers) and compared
byte-for-byte against the merge base at that file's pre-rename path. Where the
two matched, our side contributed nothing but the rename and master's outcome
was taken - master's blob where master still has the path, a delete where master
had removed or moved the file. This is the only condition under which taking the
other side wholesale is defensible: a merge that takes theirs renders as nothing
at all in review, so a silent loss would leave no trace to find.

The remaining conflicts were resolved individually:

  Master's outright renames. InternalRuntimeException -> PCInternalRuntimeException
  and its test, and LongPollingMockConsumer moving from the test tree into
  src/main/java/.../internal/utils/. Each of these is a rename/rename conflict, and
  git's ort strategy had already content-merged them: the stage-2 blob at our path
  was byte-identical to master's blob at master's path, which is the proof that our
  side carried only the package rename. Master's path and blob kept; ours deleted.

  TestConventionsArchTest. Git mis-paired the near-identical per-module copies -
  it matched mutiny's base against reactor's ours and examples-core's theirs, and
  reactor's base against vertx's ours and examples-vertx's theirs. A checkout
  --theirs here writes a file that still contains conflict markers, and the markers
  carry paths rather than the plain form, so the habitual grep for '<<<<<<< HEAD'
  cannot see them. Master's blob was taken verbatim at all nine module paths and
  each was then diffed against master to prove no mis-pair survived - a mis-paired
  arch test compiles happily while pointing ArchUnit at another module's packages,
  which is silent loss of coverage rather than a build failure.

  The eight logback test configs. Our side's only non-rename change was deleting
  the dead io.confluent.csid logger entries; master made the same deletion in
  #289 and then rebuilt these files around the pc.log.level property and the
  shared logback-silos.xml include. Confirmed no csid logger survives on master's
  side, so master's is a strict superset.

  bin/check-copyright-headers.sh, bin/ci-mutation-test.sh, bin/rename-packages.sh.
  The branch took the rename tooling from master; master has since moved on. The
  copyright script's blob was found verbatim in master's own history, and the other
  two carried nothing our side originated - ci-mutation-test.sh differed from the
  merge base by the package regex alone, which master's version already spells
  bz.stub. Master's taken for all three.

  .idea/runConfigurations/. Master deleted these; our only change was inside a file
  that no longer exists. Master's deletion accepted.

The two files carrying the branch's own work were resolved hunk by hunk rather
than by taking a side. OffsetSimultaneousEncoder.java had a single conflict, on
the lombok.AccessLevel import the sparse-path test seam needs - ours kept.
RunLengthEncoderTest.java had one javadoc hunk where master had re-pointed the
"needs a delta-aware invoke()" tracking citation from docs/inflight.md to
docs/refactoring.md; ours kept, because the paragraph master was editing
describes a limitation this branch removes. OffsetEncoder.java,
RunLengthEncoder.java and OffsetSimultaneousEncoderSparseIterationTest.java did
not conflict at all.

The result differs from the merged master commit by exactly the branch's own
change plus a regenerated docs/todo-index.md - nothing else survived the merge
from our side, which is the check that the rename-only resolutions neither lost
nor smuggled anything.

CHANGELOG.adoc: the branch's entry is dropped
---------------------------------------------
Repo policy changed while this branch sat. #113 moved release notes to
generation from the commit log at release time, and AGENTS.md's Changelog section
now states that a PR never adds an entry and never adds an Unreleased section.
The review note on #106 asks for exactly this. Nothing
is lost: the generator reads the commit log, and this branch's commit message
already carries the full substance - the delta-accumulation argument, the
byte-identical guarantee, the differential test, and the RunLengthEncoderTest
62.3s -> 0.2s measurement.

README.adoc is generated from src/docs/README_TEMPLATE.adoc, so master's is
taken. The template's only non-rename change on this branch - stop embedding the
changelog in the README - had already been made independently on master, word for
word, so master's side loses nothing there either.

docs/inflight.md: master's deletion accepted
--------------------------------------------
Master deleted the single-file ledger; in-flight state is now one file per item
under docs/inflight/, and that directory tracks only what is OPEN. This branch's
only edits to the old file were closing two items out as DONE - the
RunLengthEncoderTest ~59s floor, and the delta-aware invoke() follow-up - both of
which this PR resolves. A DONE entry has no home in the new directory, and no
open item was carried on those lines, so the deletion loses nothing. None of
master's docs/inflight/ notes track this mechanism as open.

docs/todo-index.md is generated, and bin/todo-index.sh --check went stale because
the branch removed two markers from OffsetSimultaneousEncoder.java: the
"VERY large offset ranges is slow" TODO this PR resolves, and the
"refactor this loop into the encoders" note attached to the loop it rewrote.
Regenerated.

Verified on JDK 17: whole-reactor ./mvnw clean install -DskipTests succeeds, and
the core unit suite runs 833 tests with 0 failures and 0 errors (8 pre-existing
assumption-based skips, none added here). The tree carries no conflict markers -
swept for the marker anchored at line start, since a rename/rename marker carries
paths rather than the plain form - and no io.confluent residue outside the
copyright script's deliberate upstream-path tables and AGENTS.md's own prose
about the rename. No test was weakened, skipped, excluded or quarantined.

bin/check-issue-refs.sh is red on this commit and its findings are all inherited.
The gate scopes itself to files changed since the merge base, and mid-merge that
base is still the OLD one, so every file master touched reads as a line this
branch added - the same artefact bin/check-branch-self-reference.sh documents in
its own header ("MID-MERGE IT ACCUSES YOU OF MASTER'S SENTENCES ... the fix is to
finish the merge"). Its three tree findings are the bare confluentinc#857 in
parallel-consumer-core/src/test/resources/logback-test.xml and the bare #101/#110
in pom.xml; both files are byte-identical here to the master commit being merged,
and neither line existed at the branch tip before it. The remaining six are in the
PR body, which predates the gate and is the author's to settle. Once this commit
exists the merge base is master's tip and the tree arm has nothing to report.
Every other gate passes, including the copyright header check run with
COPYRIGHT_CHECK_REQUIRE_FORK_POINT=1.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Xx8GAnzc8F7ksrvpYj8hC
… merged tree

bin/check-branch-self-reference.sh flagged the paragraph in bug-162 that names this
PR. The single-line marker already there covered only its first line, so the
sentence making the actual claim about this PR was unattested - the block form
covers a paragraph, and this is a paragraph.

The claim is that #106 does not address either truncation case, despite the
mirror body implying it might. Re-checked rather than waved through: against master
this branch changes only the offsets/ encoders and their tests, touches no state/
file, and PartitionState#maybeTruncateBelowOrAbove appears nowhere in its diff. The
claim holds, and the sentence now says how it was established, so the next reader
does not have to redo it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Xx8GAnzc8F7ksrvpYj8hC
@codecov

codecov Bot commented Sep 7, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 82.64%. Comparing base (440b9bd) to head (001f50b).
⚠️ Report is 8 commits behind head on master.
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@             Coverage Diff              @@
##             master     #106      +/-   ##
============================================
+ Coverage     81.91%   82.64%   +0.73%     
- Complexity     1466     1491      +25     
============================================
  Files            95       95              
  Lines          5148     5192      +44     
  Branches        502      509       +7     
============================================
+ Hits           4217     4291      +74     
+ Misses          732      707      -25     
+ Partials        199      194       -5     
Flag Coverage Δ
chaos 52.57% <30.00%> (?)
integration 61.21% <30.00%> (-0.04%) ⬇️
performance 51.63% <30.00%> (?)
unit 78.64% <100.00%> (+0.31%) ⬆️

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

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

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

@github-actions

github-actions Bot commented Sep 7, 2026 •

Copy link
Copy Markdown

🧪🔒 Quarantine Lane Report

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

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

No quarantined test changed outcome since the previous push.

Updated for 001f50b · run 34083183164 · 2026-09-07 04:34 UTC

@github-actions

github-actions Bot commented Sep 7, 2026 •

Copy link
Copy Markdown

🟢 Throughput — OK

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

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

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

What the numbers mean, and what they cannot tell you

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

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

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

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

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

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

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

Runs used: ce6f39a, 70a88bf, 27211b9, c5dde06, 92364a1, 867c407, 7a8dd92, df3bd71, 440b9bd, 11e0500

Since the previous push: ratio 0.856 -> 0.96, share 1.951 -> 1.77, rate 71655 -> 65075 (-9.2%). One push of difference sits inside this test's measured spread - read it as movement, not as a result.

Updated for 001f50b · run 34083183330 · 2026-09-07 04:42 UTC

@astubbs astubbs left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

lgtm

@astubbs

astubbs commented Sep 7, 2026

Copy link
Copy Markdown
Owner Author

@codex review

This is the cross-model pass, so please weigh the correctness argument independently rather than
checking my reasoning is internally consistent. The claim the whole PR rests on:

RunLengthEncoder accumulates by the DISTANCE to the previously-seen offset, not by counting
calls, so it only needs to be shown the first and last offset of each maximal run of same-state
offsets. From that, the visit set is {0, length-1} plus each in-range incomplete offset and its
two neighbours - sized by the number of incompletes, never by the range width, which is the point
when the range can be ~2.1 billion wide.

Where I would look hardest:

  • The boundary argument. For a maximal run [a,b]: is it actually true that either a == 0 or
    a-1 is incomplete, and symmetrically at b? If there is a shape where a run boundary falls
    somewhere the visit set does not reach, the encoding silently differs and the differential test
    may not generate that shape. Off-by-one at lowWaterMark, at length-1, on a zero-length range,
    and on a single-offset range are the cases I would attack.
  • requiresEveryOffset() defaults to true and is overridden only in RunLengthEncoder. Is that
    actually safe-by-default for an encoder someone adds later, or is there a path where the sparse
    decision is taken before the active encoder set is final?
  • Exception timing changes on the sparse path: a v1 run-length overflow now throws on one large
    delta rather than incrementally. I argue the outcome is identical because the encoder is dropped
    from activeEncoders on first throw and never reaches registerEncodings. Please check that
    reasoning rather than take it.
  • The differential test asserts the sparse path was actually taken. Without that it could pass
    while testing nothing. Is the assertion strong enough to catch the case where the production
    encoder line-up silently stops reaching the sparse path?
  • dropEncodersRequiringEveryOffset() is a package-private test seam on a production class - a
    mutator production code must never call. Is flagging it enough, or does it want a stronger
    guard?

Context worth having: this branch has just merged master across the io.confluent.* -> bz.stub.*
package rename, and the great majority of those conflicts were resolved by taking master's side
after proving our side carried only the rename. A merge that takes the other side renders as
nothing at all in a diff, so if anything looks like it was lost rather than merged, say so.

The wall-clock figures the body used to quote are withdrawn and being re-measured; the class-level
win is a complexity change and stands on its own, but do not treat the old gate numbers as evidence.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 3255c6a879

ℹ️ About Codex in GitHub

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

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

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

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

astubbs added a commit that referenced this pull request Sep 7, 2026
Review finding on #105. The write-up's upkeep caveat only covered
one direction - a newly added class is unranked and sorts last - and the reviewer pointed out
that the failure mode actually in front of us is the opposite one, which is worse because it
leaves nothing to see.

Adding a class at least puts something unranked on disk. A class that gets much FASTER, or
disappears, changes nothing observable: surefire's runOrder=balanced keeps sorting, by recorded
costs that describe a suite which no longer exists, and the fork packing decays toward the
unordered scan it replaced. No build goes red, because class ordering is not something an
assertion can be wrong about.

The live instance is core's file, ranked around RunLengthEncoderTest at roughly three times the
next-slowest entry. #106 collapses exactly that class, so landing it without regenerating
the statistics would quietly hand most of this change back. That obligation is recorded in
docs/inflight/pr-blockers-and-collisions.md - the register a session actually inherits - rather
than only in a PR body that stops existing at merge, and it names the remedy: a full
bin/ci-unit-test.sh run on core, committing the rewritten files.

Also states plainly that this change and #106 OVERLAP rather than sum. Packing removes
the idle fork at the end of the run; #106 removes the work that made that fork long. Once
the work is gone the tail is a fraction of its size, so packing keeps helping by proportionally
less against whatever class is next in line. Neither makes the other pointless - a class
scheduled last strands a fork for its own length, whatever that length is - but adding their
gains together would double-count, and a reader of either PR alone would be inclined to.

No wall-clock figure is added, restated or defended here: the PR's headline seconds remain
withdrawn pending re-measurement against a control arm that #265 uncontaminated.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Xx8GAnzc8F7ksrvpYj8hC
astubbs added a commit that referenced this pull request Sep 7, 2026
…w read them per line

Corrects a claim ee9a3b2 carried in from the automated review on
#105. That review compared the wrong unit and the error survived into
both files that commit touched, so it is fixed here in the same terms it was made.

THE MISTAKE, BECAUSE IT IS THE REUSABLE PART. Each line of a .surefire-pc-unit-times file is one
test METHOD, and a heavy class is spread over many of them. surefire's runOrder=balanced sorts
CLASSES - pom.xml's own comment beside the setting says so, and forking cannot split a class, so
the class is the scheduling unit either way. Ranking the raw lines therefore compares one method
of one class against a whole other class, and it badly overstates how far the top class stands
above the next. The review read core's file that way, put RunLengthEncoderTest at roughly three
times the next entry, and named a METHOD as the class that would define the tail after
#106.

Aggregated per class, the top two are close rather than a factor apart, and the third is well
behind:

  awk -F, '{t[$3]+=$2} END {for (c in t) printf "%9.0f  %s\n", t[c], c}' \
      parallel-consumer-core/.surefire-pc-unit-times | sort -rn | head -5

Both files now state the shape and give that command rather than baking in a ratio, which would
be wrong at the next stats refresh anyway.

WHAT IT CHANGES ABOUT THE ARGUMENT, IN BOTH DIRECTIONS. The staleness risk is real and stays -
an ordering built around a class that has since collapsed decays silently, with no red build -
but it is materially smaller than the review stated. It also cuts the other way, in this
change's favour: because forking cannot split a class, #106 moves the floor down to the
second-heaviest class and no further, and that class is substantial. So the residual tail is
most of the present one and packing keeps most of its value rather than being largely
obsoleted. The "overlap, not sum" paragraph stays correct and stays put; only the implication
that the residual tail is small is removed.

No figure is asserted for #106's own collapse. The review took "62.3s -> 0.2s" from that
branch's commit message, but that measurement predates #265's contaminated-arm fix and
disagrees with both the committed statistics and a run on the merged tree, so the class is
described as collapsing by an order of magnitude and the re-measurement now in flight can supply
the number.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Xx8GAnzc8F7ksrvpYj8hC
@astubbs

astubbs commented Sep 7, 2026

Copy link
Copy Markdown
Owner Author

@claude review this

The previous Claude review on this PR is from 2026-08-03 and bin/check-review-posted.sh rejects it
as having stopped partway, so this is a fresh request rather than a duplicate.

Two defects have already been found here by Codex and independently verified - please treat them as
known rather than re-deriving them, and spend your effort on whether there are MORE of the same
shape. Both live in the hand-written in-range filter loop in
OffsetSimultaneousEncoder#buildSparseRelativeOffsetsToVisit:

  1. getEndOffsetExclusive() is lowWaterMark + lengthBetweenBaseAndHighOffset, i.e.
    highestSucceededOffset + 1, which wraps to Long.MIN_VALUE at Long.MAX_VALUE. The comparison
    then holds for every entry, the loop exits immediately, and the range encodes as one completed run
    • incomplete offsets silently encoded as complete.
  2. The early exit assumes ascending iteration, but the field's own javadoc says the set has
    "no order requirement, but SortedSet just in case", and the constructor is public.

The agreed fix bounds by the INCLUSIVE last offset (lowWaterMark + lastRelativeOffset, which
reconstructs highestSucceededOffset and cannot wrap) and drops the early exit entirely. It is not
applied yet - a measurement is using this worktree - so you are reviewing the code WITH those two
defects present. Please say if you think that fix is the right shape, and in particular whether
dropping the early exit has a cost I have dismissed too easily.

Where I would like fresh eyes:

  • The correctness argument itself. Run-length encoding accumulates by DISTANCE to the previously
    seen offset, so it should only need each run's first and last offset. Is the boundary claim
    actually airtight - that for a maximal run [a,b], either a == 0 or a-1 is incomplete, and
    symmetrically at b? A shape where a run boundary falls outside the visit set would encode
    differently and the fixed-seed differential test might never generate it.
  • Other arithmetic on the same operands. Two of the two findings so far are boundary arithmetic
    in new code. Please look for the third rather than assuming there isn't one.
  • requiresEveryOffset() defaults to true and is overridden only in RunLengthEncoder. Is that
    genuinely safe-by-default for an encoder added later, or can the sparse decision be taken before
    the active encoder set is final?
  • The differential test asserts the sparse path was actually taken. Is that assertion strong
    enough to catch the case where the production line-up silently stops reaching the sparse path?

Context: this branch has merged master across the io.confluent.* -> bz.stub.* rename, resolving
most conflicts by taking master's side after proving our side carried only the rename. A merge that
takes the other side leaves no removal for a diff to show, so flag anything that looks lost rather
than merged. The gate-level wall-clock figures in the body are withdrawn pending a re-measurement -
please do not weigh them.

@claude

claude Bot commented Sep 7, 2026 •

Copy link
Copy Markdown

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


Claude is reviewing this PR

Tasks

  • Gather context (PR body, diff, prior comments, Codex findings)
  • Read OffsetSimultaneousEncoder.java sparse-iteration code in full
  • Read OffsetEncoder.java and RunLengthEncoder.java changes
  • Read the differential test OffsetSimultaneousEncoderSparseIterationTest.java
  • Verify the two known Codex findings, look for a third of the same shape
  • Assess the boundary-correctness argument independently
  • Assess requiresEveryOffset() default-safety and decision timing
  • Assess whether the differential test's "sparse path taken" assertion is strong enough
  • Check for merge losses / spot-check RunLengthEncoderTest is javadoc-only
  • Post final review

The boundary-correctness argument itself: airtight, conditional on one thing

The core claim — that a distance-based encoder only needs a run's first and last offset — checks out. A maximal run [a,b] of one completion state can only start where a == 0 or the offset at a-1 differs in state from a (i.e. a-1 or a is incomplete), and symmetrically for b. The visit set ({0, length-1} ∪ each incomplete's own offset and its two clamped neighbours) covers exactly that.

But this proof has an unstated precondition: it requires the visit set to include every in-range incomplete offset. Miss one, and the run boundary next to it silently isn't visited, so RunLengthEncoder never sees the state change — the run is absorbed into its neighbour and the encoded output diverges from the full scan without any exception being thrown. Both of Codex's findings break exactly that precondition, which is why they're correctness bugs and not edge-case cosmetics:

  1. getEndOffsetExclusive() wraparound. It's lowWaterMark + lengthBetweenBaseAndHighOffset, i.e. highestSucceededOffset + 1, which wraps to Long.MIN_VALUE when highestSucceededOffset == Long.MAX_VALUE. That's reachable without tripping the constructor's existing lengthBetweenBaseAndHighOffset < 0 sanity check — e.g. baseOffsetToCommit = Long.MAX_VALUE - Integer.MAX_VALUE, highestSucceededOffset = Long.MAX_VALUE gives a length of Integer.MAX_VALUE + 1 (positive, forces the BitSet-too-large → sparse-only path) while the exclusive bound computed from it overflows. Once it wraps, incompleteOffset >= endOffsetExclusive holds for the very first entry the loop sees, so the loop exits immediately and every in-range incomplete is silently dropped from the visit set — the whole range encodes as one completed run. This is a real, silent-corruption-class bug (incomplete offsets committed as complete), confirmed.
  2. Early-exit assumes natural ascending order of a caller-supplied SortedSet, but the field's own javadoc says "no order requirement, but SortedSet just in case" and the constructor is public. A reverse-ordered (or otherwise custom-comparator) set with an above-range offset before an in-range incomplete causes the same silent drop. Confirmed as a real defect in the public contract, though I could not find a live production call site that actually supplies a non-naturally-ordered set — PartitionState.getIncompleteOffsetsBelow collects into a natural-order TreeSet (toTreeSet()), so today this is latent rather than triggered. It's still a real bug in OffsetSimultaneousEncoder's public API and worth fixing regardless.

I did not find a third instance of this shape in the reachable arithmetic (relativeOffset - 1 / relativeOffset + 1 clamped by Math.max/Math.min cannot overflow given the constructor's existing length-negativity guard — the maximum representable lengthBetweenBaseAndHighOffset before that guard fires still leaves relativeOffset + 1 <= Long.MAX_VALUE). The two Codex found appear to be the full set on this method.

Is the agreed fix the right shape?

Yes on the bound. Replacing the exclusive-bound-plus->= comparison with the inclusive last offset (lowWaterMark + lastRelativeOffset, which by associativity of two's-complement arithmetic reconstructs highestSucceededOffset bit-for-bit regardless of any intermediate wraparound) and comparing with <=/> is correct and cannot itself overflow — there's no addition on the comparison side anymore, just a direct signed comparison. Good fix.

Dropping the early exit trades one unboundedness for a smaller one, and I don't think that cost is negligible enough to wave off. The break wasn't just an ordering assumption — it was also this method's only bound on how much of incompleteOffsets gets scanned. In production, incompleteOffsets is not pre-filtered to the encoded range: OffsetMapCodecManager.encodeOffsetsCompressed passes partitionState.getIncompleteOffsetsBelow(highestSucceeded), which can include a large backlog of offsets stuck well below lowWaterMark (a partition wedged behind one slow/blocked key, for instance). Without the early exit, every commit now does an unconditional continue-filtered scan over that entire backlog, every time — reintroducing an unbounded-by-range-width-but-still-unbounded-by-backlog-size scan on the same commit path this PR exists to fix. It's a smaller axis than the ~2.1B range problem (backlogs are practically bounded by in-flight/concurrency settings, not partition width), but it's the same shape of problem this PR is solving for, reintroduced on a different variable.

A cheaper alternative that keeps the early-exit optimisation without the ordering-assumption bug: enforce (or defensively normalise to) natural ordering once — e.g. assert incompleteOffsets.comparator() == null in the constructor, or copy into a fresh natural-order TreeSet when it isn't — and keep the break against the corrected inclusive bound (incompleteOffset > lastOffsetInclusive → break, no addition, no overflow risk). That preserves the O(nearby incompletes) property the docstring on this very method advertises as "the whole point," rather than silently regressing it to O(size of the full incomplete-offset collection).

requiresEveryOffset() default and decision timing: safe

The default-true override-only-in-RunLengthEncoder design is safe as implemented. activeEncoders is fully populated in the constructor before invoke() ever runs, and during the walk it can only shrink (on EncodingNotSupportedException), never grow — so canIterateSparsely is computed once, up front, against the final line-up, with no window for a late-added encoder to invalidate the decision. addByteBufferEncoder()/dropEncodersRequiringEveryOffset() are both test-only seams, not reachable from invoke(). No issue here.

Differential test: good structure, but doesn't reach the actual bug

The "sparse path was actually taken" assertions (isSparseIterationUsed() on both sides) are the right shape — they'd catch a future change that silently stops reaching the sparse path. However: none of the 130 fixed-seed scenarios, nor the dedicated ~2.1B-range test (overflowedValue = Integer.MAX_VALUE + 100L), exercise an offset anywhere near Long.MAX_VALUE. That's exactly why Codex's finding #1 survived review — the differential test's own trusted-reference design (compare sparse vs. full scan) is structurally incapable of catching this class of bug today, because no scenario reaches the wraparound. Once the fix lands, I'd suggest adding one scenario with highestSucceededOffset = Long.MAX_VALUE (or close to it) and an in-range incomplete near the middle, specifically so this doesn't reopen silently. Also worth a scenario using a custom-comparator SortedSet (e.g. Collections.reverseOrder()) for finding #2, if the fix keeps any order-dependent logic.

dropEncodersRequiringEveryOffset() as a test seam

Package-private visibility is an adequate guard here — it's not reachable from outside bz.stub.parallelconsumer.offsets, and any production caller within the package would be conspicuous in review. Flagging it in the javadoc (as done) is sufficient; I wouldn't ask for more (e.g. a runtime assertion) given the blast radius is already limited to same-package code.

Package-rename merge: nothing found missing

Read OffsetSimultaneousEncoder.java, OffsetEncoder.java, RunLengthEncoder.java and the new test in full — javadoc, imports, and logic all read coherently with no dangling references or truncated blocks. RunLengthEncoderTest.java's diff is genuinely javadoc-only as claimed: its two tests construct RunLengthEncoder directly and call encodeIncompleteOffset/encodeCompletedOffset by hand, bypassing OffsetSimultaneousEncoder.invoke() entirely, so they're unaffected by (and don't guard against) either sparse-iteration bug.

Summary

The algorithmic idea is correct and the differential-test scaffolding is the right way to guard it. The two Codex findings are real, both are silent-correctness bugs (not crashes) reachable in production for finding #1, and I found no third instance of the same arithmetic-boundary shape. My own addition: the proposed fix for finding #2 (drop the early exit) trades a large unboundedness for a smaller but real one against the incomplete-offsets backlog size — worth a second look before landing, since a bound-preserving alternative exists. I'd also add a Long.MAX_VALUE-adjacent scenario to the differential test once the fix lands, since the current suite would not have caught finding #1 on its own.
· branch perf/sparse-offset-encoding

@astubbs

astubbs commented Sep 7, 2026

Copy link
Copy Markdown
Owner Author

Thanks - this is a substantive pass, and the reconstruction of the boundary proof is the part that
matters most. Confirming the premise explicitly (the proof holds only if the visit set contains
every in-range incomplete) states the defect class more precisely than "boundary arithmetic" did,
and both findings are failures of exactly that premise.

Taking the points in turn.

Where I am overriding you: dropping the early exit

You argue that removing the break reintroduces an unbounded scan over the incomplete-offsets
backlog, and propose keeping it while asserting or normalising natural ordering in the constructor.

I checked the production call site, and the cost claim does not hold there. The break cannot fire.

OffsetMapCodecManager#encodeOffsetsCompressed samples the high-water mark once and feeds that
single value to both sides:

long highestSucceeded = partitionState.getOffsetHighestSucceeded();
var incompleteOffsets = partitionState.getIncompleteOffsetsBelow(highestSucceeded);
...
simultaneousEncoder = new OffsetSimultaneousEncoder(baseOffsetForPartition, highestSucceeded, incompleteOffsets);
  • PartitionState#getIncompleteOffsetsBelow filters x < highestSucceededBound, so the set's
    maximum element is at most highestSucceeded - 1.
  • getEndOffsetExclusive() is lowWaterMark + lengthBetweenBaseAndHighOffset, which is
    highestSucceeded + 1.

So the break condition incompleteOffset >= endOffsetExclusive is
incompleteOffset > highestSucceeded, against a set whose maximum is highestSucceeded - 1. The two
ranges cannot overlap. The early exit is dead code on the production path, and the single-sample
comment directly above that call is what guarantees the two bounds cannot drift apart - it was added
to close a different race, and it happens to pin this too.

The backlog scan you describe is real, but it is attached to the wrong branch. It comes from the
continue for entries below lowWaterMark, which is identical before and after this change -
removing the break does not create it, and keeping the break does not prevent it. Both versions
are O(number of incompletes); neither is O(range), so the docstring claim on that method survives
either way.

That makes the trade backwards: keeping the early exit would preserve an optimisation that provably
does nothing, and pay for it with a new precondition on a public constructor that the class's own
field javadoc explicitly disclaims - "only used to test with Set#contains (no order requirement, but SortedSet just in case)". That disclaimer is precisely what makes finding #2 a bug rather than a
caller error, so hardening the caller contract to keep a no-op would be solving it the wrong way
round.

The fix will carry a short comment at the loop saying this, so the next reader does not re-add the
break on the same reasoning you did. It is a genuinely reasonable thing to assume from the code
alone; it is only wrong once you have read the call site.

Worth noting on the same axis: SortedSet#subSet would have honoured the set's own comparator, so
the hand-written loop was strictly worse there. The original reason for avoiding subSet still
stands on its own merits (it throws IllegalArgumentException when handed an already-restricted
view, which would surface as a failure to encode a commit) - but the replacement should not have
inherited an ordering assumption subSet did not have.

One correction

Finding #1 is latent, not reachable in production. The trigger needs highestSucceededOffset == Long.MAX_VALUE, i.e. a partition at roughly 9.2 quintillion offsets. It is a real silent-correctness
defect and it is being fixed, but calling it "reachable in production" overstates it, and the
distinction matters for how it gets prioritised. Finding #2 is likewise latent: the only production
supplier collects into a natural-order TreeSet via toTreeSet().

The third-defect sweep

I ran the same sweep independently before this review posted, and reached the same negative. Stating
the ground covered, since a bare "none found" is not worth much:

  • All new arithmetic is confined to buildSparseRelativeOffsetsToVisit. The invoke() changes
    introduce none (a strategy branch and a field assignment), and the OffsetEncoder /
    RunLengthEncoder diffs are a default method plus one override, both with no arithmetic.
  • lastRelativeOffset = lengthBetweenBaseAndHighOffset - 1 cannot wrap: the constructor's existing
    negativity guard bounds length at or below Long.MAX_VALUE, and the length == 0 case returns
    early.
  • relativeOffset + 1 cannot overflow, because relativeOffset <= lastRelativeOffset == length - 1,
    so the sum is at most Long.MAX_VALUE. relativeOffset - 1 is bounded below by -1 and clamped.
  • The clamps touch only the two neighbours. The incomplete's own relative offset is always added
    unclamped, and a neighbour clamped onto a value already in the set is harmless under the
    telescoping property.
  • relativeOffset = incompleteOffset - lowWaterMark is the one remaining subtraction, and the
    inclusive-bound fix is what makes it provably safe: it is reached only when
    lowWaterMark <= incompleteOffset <= lowWaterMark + lastRelativeOffset.

Two independent passes agreeing on "none, and here is the ground covered" is a real result, though
not a proof.

Tests

Both regression scenarios are going in regardless of the convergence between your suggestion,
Codex's and the plan that already existed - a Long.MAX_VALUE-adjacent range with a mid-range
incomplete, and a reverse-comparator SortedSet. You are right that the current fixed-seed suite is
structurally incapable of reaching either, which is why finding #1 survived the differential test:
its trusted-reference design compares sparse against full scan, and no generated scenario goes near
the wraparound.

Agreed too that dropEncodersRequiringEveryOffset() needs no guard beyond package-private visibility
plus the javadoc flag, and that the requiresEveryOffset() decision timing is safe - activeEncoders
is fully populated in the constructor, can only shrink during the walk, and the decision is taken
inside invoke(), so neither test seam can invalidate it.

The fix is not applied yet: a wall-clock measurement is currently using this worktree, so the tree
cannot change until it completes. It will land as one commit with both regression tests.

@astubbs
astubbs marked this pull request as ready for review September 7, 2026 02:21
astubbs and others added 2 commits September 7, 2026 14:26
…ng the incompletes iterate ascending

The in-range filter added by the sparse-iteration change carried two defects, both found by
cross-model review (Codex, then confirmed independently by a Claude pass). Both break the same
premise, which is what makes them correctness bugs rather than edge cases: the boundary proof
behind sparse iteration holds only if the visit set contains EVERY in-range incomplete. Miss one
and the run boundary beside it is never visited, so the run is absorbed into its neighbour and the
encoding silently diverges from the full scan - no exception, a bad commit.

FIRST, THE EXCLUSIVE BOUND WRAPPED. getEndOffsetExclusive() is lowWaterMark + length, i.e.
highestSucceededOffset + 1, which is Long.MIN_VALUE when the highest succeeded offset is
Long.MAX_VALUE. That is reachable without tripping the constructor's length-negativity guard: a base
of Long.MAX_VALUE - Integer.MAX_VALUE gives a positive length one wider than the bitset limit, which
is itself what forces the sparse path. Every incomplete then compared as out of range, the loop
exited on its first entry, and the whole span encoded as one completed run - incomplete offsets
encoded as complete. That run also overflows the v2 int run length, so the symptom was an empty
encoding map: a commit with no encoding at all. The bound is now the INCLUSIVE last offset, which
reconstructs highestSucceededOffset - a long that already existed - and so cannot wrap.

SECOND, THE EARLY EXIT ASSUMED ASCENDING ITERATION. incompleteOffsets is caller-supplied on a public
constructor, and the field's own javadoc promises "no order requirement, but SortedSet just in
case". A reverse-ordered set presenting an above-range offset first exited the loop before reaching
a valid in-range incomplete. Note SortedSet#subSet, which this hand-written loop replaced, would
have honoured the set's comparator - avoiding subSet for its own good reason must not import an
ordering assumption it never had.

THE EARLY EXIT IS REMOVED RATHER THAN REPAIRED, AND THE REVIEW ARGUED OTHERWISE. The Claude pass
proposed keeping the break and asserting natural ordering in the constructor, on the grounds that a
full scan reintroduces an unbounded walk of the incompletes backlog. Checked at the call site, that
cost does not exist: OffsetMapCodecManager#encodeOffsetsCompressed samples highestSucceeded ONCE and
derives both the set (getIncompleteOffsetsBelow, keeping x < that sample) and this encoder's range
top from it, so the set's maximum is highestSucceeded - 1 while the break needs > highestSucceeded.
It cannot fire in production. The backlog scan is the `continue` for entries below lowWaterMark,
identical before and after. Both shapes are O(number of incompletes), neither is O(range), so the
method's docstring claim survives. Keeping the break would preserve a no-op and pay for it with a
precondition the class explicitly disclaims. The loop now carries that reasoning so it is not
re-added.

TESTS THAT FAIL WITHOUT THE FIX. Two regression guards, both verified by sabotage: with the old loop
restored, each fails with the predicted symptom - an empty encoding map for the Long.MAX_VALUE
range, and a byte mismatch against the full scan for the reverse-ordered set - while all 130
pre-existing scenarios still pass, which is the direct evidence that the fixed-seed differential
test could never have caught either. It generates neither shape: every scenario is a small range at
a modest base offset, naturally ordered.

Also fixes two SpotBugs findings on lines this change wrote (an unpresized collection, and a helper
folded into its only caller). The third, DMI_RANDOM_USED_ONLY_ONCE, is a false positive on a
deliberately seeded generator - four formulations were tried and it fires on all of them; the
javadoc records which, so the next person does not repeat them.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Xx8GAnzc8F7ksrvpYj8hC
@astubbs

astubbs commented Sep 7, 2026

Copy link
Copy Markdown
Owner Author

Outcome of your review, now landed in 0583b385a.

The early-exit disagreement: it went the other way, and here is the check

You argued for keeping the break and asserting or normalising natural ordering, on the grounds
that a full scan reintroduces an unbounded walk of the incompletes backlog. The cost objection did
not survive the call site.

OffsetMapCodecManager#encodeOffsetsCompressed samples the high-water mark once and derives both
sides from it: getIncompleteOffsetsBelow(highestSucceeded) keeps x < highestSucceeded, so the
set's maximum is highestSucceeded - 1, while getEndOffsetExclusive() is highestSucceeded + 1.
The break condition is therefore incompleteOffset > highestSucceeded against a set that cannot
contain such an element. It could never fire in production - the single-sample comment above
that call, added for an unrelated race, is what pins the two bounds together.

The backlog scan you described is real, but it belongs to the continue for entries below
lowWaterMark, which is identical before and after. Removing the break does not create it and
keeping it does not prevent it. Both shapes are O(number of incompletes); neither is O(range).

So keeping the early exit would have preserved an optimisation that provably does nothing, and paid
for it with a new precondition on a public constructor that the class's own field javadoc explicitly
disclaims - and that disclaimer is what makes finding #2 a bug rather than a caller error. The loop
now carries this reasoning inline, precisely because your reading was a reasonable one to reach from
the code alone.

Your test-coverage point was right, and is now settled by evidence rather than argument

You said the differential test is structurally incapable of catching finding #1. Rather than
assert that, I sabotaged it: restored the old loop and ran the suite.

  • anInclusiveLongMaxValueRangeTopDoesNotDropEveryIncomplete fails on the empty encoding map.
  • aNonNaturalComparatorDoesNotHideInRangeIncompletes fails on a byte mismatch against the full scan.
  • All 130 pre-existing scenarios still pass.

That last line is the proof - not that the suite happens not to generate these shapes, but that it
could not have caught either defect. Both regression tests are in.

Accepted without change

Your reading of the boundary proof's unstated premise - that it holds only if the visit set contains
every in-range incomplete - is the clearest statement of the defect class anyone reached, and it is
now the framing in the commit message. Your verdicts on requiresEveryOffset() decision timing and
on dropEncodersRequiringEveryOffset() needing no guard beyond package-private visibility are
accepted as-is. Your independent third-instance sweep matched mine, run separately beforehand: no
third instance, with the ground covered stated in my earlier comment.

One correction

You described finding #1 as "reachable in production". It is latent - the trigger needs
highestSucceededOffset == Long.MAX_VALUE, a partition at roughly 9.2 quintillion offsets. Finding
#2 is latent too: the only production supplier collects into a natural-order TreeSet. Both are
real and both are fixed; neither was reachable by a running deployment, and the severity record
should not read stronger than the truth.

Thanks - the review moved the change, including on the point where I ended up disagreeing with it.

astubbs and others added 2 commits September 7, 2026 16:22
… success

Merging master across the package rename produced rename/rename conflicts on the
near-identical per-module TestConventionsArchTest files. Resolving them with
`git checkout --theirs` staged files that still contained conflict markers: the
checkout said nothing, `git add` said nothing, and the marker sweep that followed
said nothing either. javac caught it.

Two things make that worth a document rather than a commit message.

The sweep missed it because the markers are not the shape everyone greps for. On a
rename/rename conflict git writes eight angle brackets and a <ref>:<path> label; a
directory-rename conflict writes seven, also with the label. Both were reproduced
with `git merge-tree --write-tree --messages` for this write-up. So neither the
bracket count nor the label is a safe discriminator, and `grep '<<<<<<< HEAD'`
matches neither. Only a prefix-anchored `^<<<<<<<` is stable - which is also what
the still-unwritten gate proposed in docs/inflight/ci-conflict-marker-gate.md will
have to match, since that note describes only the seven-character form.

And it was the second occurrence, not the first. A session on 2026-09-02 hit the
same flag on add/add conflicts from a squash-merged parent, diagnosed that the index
was still unmerged, and worked around it. Nothing was written down, so it had to be
rediscovered. The mechanism is now recorded: in a rename/rename conflict stages 2
and 3 are held at DIFFERENT paths, so the path named in --theirs has no stage 3 to
write.

The guidance that generalises is resolve by explicit ref, not by side. The repo
already used that technique - `git checkout origin/master -- <path>` appears in
bin/rename-packages.sh, in the red-proof solution doc and in the package-rename
sweep note - but always as a way to fetch a file, never written down as the way to
resolve a conflict.

This sharpens rather than repeats the existing --theirs write-up. That one is the
flag taking too much; this one is the flag taking nothing and reporting success. It
also contradicts AGENTS.md's PR Discipline bullet, which says both flags take the
whole file - true for the ordinary case, and exactly the wrong preparation for this
one, because a reader primed for over-application checks what was lost, finds
nothing missing, and moves on.

Rides with this PR rather than opening its own: the learning came out of this
branch's merge, and a separate PR would cost a review cycle to land one document.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Xx8GAnzc8F7ksrvpYj8hC
…y, the git add after it does not

The grounding validator reproduced the incident on git 2.51.2 and falsified the
headline of the document committed a few minutes ago. Corrected here rather than
left standing, because a solutions doc is read by agents who will not re-derive it.

WHAT WAS WRONG. The doc said `git checkout --theirs` resolves nothing and reports
success. It does not report success - on a rename/rename conflict it exits 1 with
`error: path '<p>' does not have their version`, because stages 2 and 3 are held at
different paths and the path you named has no stage 3. The silent step is the `git
add` that follows: it exits 0, stages whatever the merge left in the worktree, and
resolves the index around markers. `git ls-files -u` is then clean.

Also wrong, and repeated in three places: that `grep '<<<<<<< HEAD'` matches neither
marker form. It matches both whenever the ours side is labelled HEAD, which is what
an ordinary merge writes - seven angle brackets plus a space is a substring of eight
plus a space. That claim was asserted and never measured. What actually defeats the
prior sessions' sweeps is pinning the bracket count, not the trailing space they
happened to carry.

WHAT THE REPRODUCTION ADDED. A batched `git checkout --theirs -- <many paths>`
validates the whole pathspec first and aborts on the first path lacking a stage 3, so
ordinary content conflicts sharing that command line are left unresolved too, and the
following blind `git add` stages markers into files that had nothing wrong with them.
That is a larger blast radius than the doc described and the strongest argument in it
for resolving per path and checking every exit status.

Three smaller corrections: the nine arch-test copies are not uniform - eight match,
core differs by an import and a javadoc word; the pairing with the existing --theirs
write-up is a trio once the add/add abstraction doc is counted; and the claim that a
history-rewrite hook prevented reproducing the exit code was untrue, which is what let
the wrong headline through in the first place.

The guidance is unchanged and now rests on the real mechanism: resolve by explicit
ref, and check the status of the command rather than the look of the tree.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Xx8GAnzc8F7ksrvpYj8hC
@astubbs
astubbs merged commit a75400f into master Sep 7, 2026
30 checks passed
@astubbs
astubbs deleted the perf/sparse-offset-encoding branch September 7, 2026 05:03
astubbs added a commit that referenced this pull request Sep 7, 2026
#106 has landed, which is the event this branch was waiting
for. It collapses the runtime of RunLengthEncoderTest - the class this branch's
checked-in .surefire-pc-unit-times ordering is built around - so the statistics here
now rank the suite by a cost that no longer exists. Regenerating them is the next
commit; without it the packing decays toward the unordered scan with no red build to
say so.

ONE CONFLICT, RESOLVED BY KEEPING BOTH SIDES. docs/inflight/ci-codecov-flags-not-like-for-like.md
gained a different 2026-09-07 sighting on each side. Ours records that a PR and its
base disagree on the unit flag's file set even though the base is a git ancestor of
the head. Master's records that master's own unit history oscillates between two
stable bands across consecutive commits, independent of diff content.

They are not the same finding and neither subsumes the other - master's text says so
itself, naming this branch's sighting and explaining why it is a different shape.
Both are kept, ours first and master's as the follow-on it is written as. Resolved by
editing the hunk rather than taking a side, which is the rule the write-up that
merged with #106 exists to state.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Xx8GAnzc8F7ksrvpYj8hC
astubbs added a commit that referenced this pull request Sep 7, 2026
…ed base

#106 landed, and the obligation it recorded comes due here.
These files rank test classes by recorded runtime so surefire can schedule the slowest
first; core's ranking was built around RunLengthEncoderTest, whose cost that PR
removed. Left alone they would sort the suite by a cost that no longer exists, and the
packing would decay toward the unordered scan it replaced - with nothing going red,
because ordering is not something an assertion can be wrong about.

Regenerated by a full bin/ci-unit-test.sh run on this tree, so the data describes
exactly the workload the gate executes. Reproduce the ranking with:

  awk -F, '{t[$3]+=$2} END {for (c in t) printf "%9.0f  %s\n", t[c], c}' \
    parallel-consumer-core/.surefire-pc-unit-times | sort -rn | head

Two things the new ranking settles. RunLengthEncoderTest drops by roughly two orders
of magnitude, which is the first measurement of #106's effect taken on the merged
tree rather than quoted from a gate that no longer exists. And the class that now
sets the tail, ParallelEoSStreamProcessorTest, is only slightly cheaper than the one
it replaces - so the tail this branch packs around did not collapse with the class.
A review of #105 had estimated it would fall to about a third, by comparing
per-METHOD lines when runOrder=balanced sorts per CLASS; that estimate was wrong in
the direction that would have argued against this branch.

Whether the packing is worth its keep is still open and still a measurement, not an
argument. The comparison that settles it - this tree against master, interleaved,
repeated - is what these statistics now make possible for the first time.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Xx8GAnzc8F7ksrvpYj8hC
astubbs added a commit that referenced this pull request Sep 7, 2026
Master moved 21 commits under this branch in two days. Three touch the rider's own files and none
argues with it: #450 registers a record's offset before publishing it to
its shard (PartitionState, adjacent to but not inside the commit path this branch changed);
#452 makes the codec's encodingCounters a ConcurrentHashMap (the
encode-path static this branch's tryToEncodeOffsets calls through); #106
walks only the offsets where completion state changes when no encoder needs every offset (the
overhead table's domain is unchanged by it, and its tests pass on the merge).

Two text conflicts, both in append-only records, both resolved in master's favour plus this
branch's additions: config/infer-known-findings.txt keeps master's retirement of every
THREAD_SAFETY_VIOLATION identity (#433) and this branch's three
BUFFER_OVERRUN_L1 identities; docs/refactoring.md keeps master's rewritten thread-safety entry for
the codec (#452 replaced the "not thread-safe" heading and body) and this
branch's two entries above it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KkRtYPnDuAPLEmHFYSnAiJ
astubbs added a commit that referenced this pull request Sep 7, 2026
…rop it, keep the findings

The comparison this branch was waiting for became possible when
#106 merged, and it went against the change. Two arms sharing
that base, statistics regenerated on the very tree under test, interleaved, three
repetitions each: the packing arm was slower in every paired repetition. A small,
consistent loss rather than no measurable effect.

So the mechanism goes and the knowledge stays. Removed: the ci-profile runOrder
properties, the nine checked-in statistics files, and the copyright-scanner exemption
that existed only to classify them. What is left is documentation.

WHY IT COULD NOT HAVE BEEN MEASURED BEFORE, which is the part worth keeping. Packing
was built around RunLengthEncoderTest, an un-splittable class that dominated both the
wall time and its variance. Judged with that class intact, the ordering was being
measured in the arrangement that repo's own integration-lane write-up says buys
nothing for any arrangement. #106 collapsed the class; only then could the ordering be
re-derived and the two compared. Shrink first, re-derive, then measure - the same
result from the other direction.

AND #106 DID NOT ONLY MAKE THE GATE FASTER, IT MADE IT MEASURABLE. Repeat runs of
identical code used to differ by up to a minute and a half; across all six runs here
the spread was seconds. The variance was that one class landing in different fork
slots. That is why a difference of a few seconds resolves now when ninety could not
before, and it is worth more than the verdict.

The write-up keeps its two original findings - Maven -T module parallelism loses on a
2-core gate and manufactures flakes, and a harness must not mutate its own input - and
now carries the null result. Its pre-measurement prediction, that packing would keep
most of its value once the dominant class shrank, is left visible and marked wrong: the
per-class arithmetic behind it was right and the conclusion still did not follow. A
mechanism that is real is not the same as a mechanism that pays.

The reproduce recipe is written out rather than cited, because the harness lives under
the ignored .context/ directory and a pointer there resolves for nobody.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Xx8GAnzc8F7ksrvpYj8hC
astubbs added a commit that referenced this pull request Sep 7, 2026
…only became measurable after #106 (#105)

test(ci): fork-tail packing measured and rejected - and why the gate only became measurable after #106

This branch set out to cut wall time off the required Unit Tests gate by packing the
surefire fork tail: run the slowest test classes first so no fork idles at the end.
The mechanism was built, the plumbing that makes it work on CI was found, and it was
then measured properly and REJECTED. What lands is documentation - a null result and
the findings around it. No Java, no pom.xml change, no checked-in data.

WHY IT LOOKED RIGHT. Surefire's forks pull classes from one shared queue and the run
ends when the last fork finishes, so scheduling the longest job first is textbook
longest-processing-time packing. Surefire 3.5.5's runOrderStatisticsFileChecksum made
it usable on CI for the first time by pinning the statistics filename, so the recorded
runtimes could be committed and survive a cold checkout.

WHY IT COULD NOT BE JUDGED UNTIL NOW, which is the part worth keeping. The packing was
built around one un-splittable class that dominated both the gate's wall time and its
variance. Measured with that class intact, the ordering was being judged in exactly the
arrangement this repo's integration-lane write-up says buys nothing for ANY arrangement
- the dominant class still setting the floor. #106 collapsed
that class; only then could the ordering be regenerated on the merged tree and the two
compared. Shrink the dominant class first, re-derive, then measure.

THE RESULT. Two arms sharing that base, statistics regenerated on the very tree under
test, interleaved, three repetitions each, in a container capped to the runner's core
count: the packing arm was slower in every paired repetition, by a few seconds at the
median. A small consistent loss rather than no measurable effect. The write-up states
the shape and the reproduce recipe rather than the numbers, which go stale on the next
run.

THE FINDING THAT OUTLIVES IT. #106 did not only make the gate
faster, it made the gate MEASURABLE. Repeat runs of identical code used to differ by up
to a minute and a half; across these runs the spread was seconds. The variance everyone
had been fighting was that one class landing in different fork slots. That is why a
difference of a few seconds resolves now where ninety could not before, and it changes
what any future measurement on this gate is worth.

ALSO HERE. Maven -T module parallelism loses on a 2-core gate, measured, and starves
wait-heavy tests into awaitility timeouts - pick one parallelism axis per core budget.
A benchmark harness must not mutate its own input, since surefire rewrites the ordering
statistics in place and a run then inherits the previous run's fork placement. A codecov
sighting where a PR containing no Java, compared against a base that is a proven git
ancestor of its head, was still reported as carrying more files and more lines than that
base - recorded with its evidence and explicit about which half of the existing note it
does not test. And an AGENTS.md worktree rule: name the tree on every commit, because a
bare git commit resolves against the session root, which is some other worktree.

The write-up keeps its own pre-measurement prediction, marked WRONG and left visible:
it argued packing would keep most of its value once the dominant class shrank. The
per-class arithmetic behind that was right and the conclusion still did not follow. A
mechanism that is real is not the same as a mechanism that pays, and only a measurement
tells the two apart.

The wall-clock figures this work originally quoted are withdrawn rather than corrected:
they predate #265 closing a leak that made dependent modules
run thread-parallel regardless of their own setting, so they describe a gate that no
longer exists.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant