Skip to content

feat(core) #197: carry the caller's MDC into the threads that run your function - #205

Merged
astubbs merged 25 commits into
masterfrom
feat/mdc-context-propagation
Aug 27, 2026
Merged

astubbs merged 25 commits into
masterfrom
feat/mdc-context-propagation

Conversation

@astubbs

@astubbs astubbs commented Aug 5, 2026 •

Copy link
Copy Markdown
Owner

Description

Raised as a non-blocking finding on #197 by a user in the confluentinc#907 thread (mirrored on this fork as #195): the
caller's SLF4J MDC is not propagated into the worker pool.

Confirmed on master before writing anything:

  • PC sets exactly two MDC keys of its own - pcId (MDC_INSTANCE_ID, put in addInstanceMDC() and in
    BrokerPollSystem) and offset (MDC_WORK_CONTAINER_DESCRIPTOR).
  • MDC.getCopyOfContextMap() and MDC.setContextMap() appear nowhere in the repository.

So a caller who has established diagnostic context - a trace_id, a request_id, a tenant - loses all of it the
moment a record crosses into the worker pool, and again crossing into vert.x, Reactor or Mutiny. The logs their
function writes cannot be correlated back to the originating request.

Where the capture and the restore live

New MdcPropagation (core internal): capture() on the thread that has the context, and enter(..) returning
an AutoCloseable scope on the thread that runs the work.

Boundary Capture Restore
Worker pool submitWorkToPoolInner, on the controller thread at submit time try-with-resources around the submitted task
vert.x event loop addVertxHooks and the web-request callback, on the worker thread around each handler PC attaches to the vert.x Future
Reactor scheduler react(..)'s wrapper, on the worker thread around Mono.fromCallable and both terminal signals
Mutiny executor onRecord(..)'s wrapper, on the worker thread around Uni.deferred and both terminal signals

The caller's own snapshot is taken in supervisorLoop - i.e. on the thread that calls poll*(). That is the only
moment it is reachable: none of PC's threads exist yet and the SLF4J MDC is not inheritable. The controller and
broker-poller threads then adopt(..) it outright (they serve one PC instance for life, so there is no later task
to leak into), which is also what makes the submit-time capture pick up the caller's context.

Judgement calls

Precedence - PC's keys win. pcId and offset are applied after the caller's map at every call site, so a
caller key of the same name cannot shadow them. PC's own log lines are read by those keys; a caller key shadowing
offset would silently corrupt PC's own diagnostics. Covered by a test that deliberately collides on pcId.

On by default, with ParallelConsumerOptions.propagateMdc as the kill switch, wired through
PCModule.mdcPropagation(). Not propagating fails silently, for everyone, and only ever gets fixed by users who
read a changelog; propagating fails visibly, as one extra key in a log line, and can be switched off. The
asymmetry decides it. Setting it false restores the old behaviour exactly - leak included - so it is a true
revert rather than half of one.

The one genuine risk of a default-on capture is that it is taken once, at poll*(): a request-scoped value in the
MDC at that moment gets pinned to the consumer for its whole life, which is the same "actively misleading logs"
failure this PR exists to prevent. Mitigated rather than ignored - PC logs the captured keys (never the values,
which are the user's data) at INFO on startup, so the mistake is discoverable. It is also called out on the option's
javadoc.

That INFO line is once per consumer instance, not per poll and not per record, and structurally so:
captureCallersDiagnosticContext() is called only from supervisorLoop, which throws IllegalStateException if
poll*() is called more than once. There is no hot path it can reach.

The leak is fixed too, not just the propagation. On master, whatever the user function puts into the MDC stays
on the pooled thread for the next, unrelated, record. The restore scope fixes that as a side effect, and it is the
half of this change that matters most.

Null-safety. getCopyOfContextMap() returns null for an empty context; that is the normal path and is
handled throughout, with a test asserting no NPE and correct behaviour when the caller sets nothing at all.

Hot-path cost: measured, not assumed. getCopyOfContextMap() returns null without allocating when the
context is empty, enter(null) returns a shared singleton scope, and pcId is only ever set when setMyId() has
been used. Rather than leave that as reasoning, it was measured with ThreadMXBean.getThreadAllocatedBytes over a
million capture()/enter()/close() cycles on logback 1.6.1:

Case Bytes allocated per batch
Caller never touches the MDC (the default) 0
Propagation disabled 0
2-key MDC - capture() on the controller thread 240
2-key MDC - enter()+close() on a clean worker thread 184

So the "nil for users who never touch the MDC" claim holds exactly - zero bytes, not merely "small". For a user who
has set MDC it is ~424 bytes per batch, against the groupingBy collector, two ArrayLists, a
PollContextInternal and a FutureTask that runUserFunction already allocates per batch.

One caveat now recorded in the inflight note: the zero is a property of logback's MDCAdapter, which returns
null for an empty context. Some other SLF4J bindings return an empty map instead, which would make capture()
allocate one small map per batch. Behaviour is correct either way; only the zero-allocation figure is
binding-specific.

Modules covered, and what is not

Covered: core (worker pool), vertx (event loop), reactor (scheduler), and mutiny. Mutiny was not in
the brief, but it is a genuine third boundary of exactly the same shape as Reactor's - runSubscriptionOn(executor)
means the user's function does not run on the worker thread either - so leaving it out would have shipped a
documented inconsistency for ~5 lines of saving. It has its own test like the others.

Deliberately not covered: the operator chains of the Publisher/Uni the user returns. We carry the context
into the invocation of their function and into PC's terminal signal handling; following it further, onto whatever
schedulers their own chain hops to, needs Reactor's io.micrometer:context-propagation and is the user's call, not
ours. Recorded in the inflight note so the next person does not treat it as an oversight.

Tests

17 tests: MdcPropagationTest (9, the primitive itself), MdcContextPropagationTest (5, end-to-end through
the real worker pool), and 1 each in vertx / reactor / mutiny. They assert the caller's key is visible inside the
user function, that PC's own keys survive and win a collision, that the context does not leak to a later task on the
same pooled thread, and that an empty/null context does not NPE.

The three engine tests share MdcBoundaryProbe (core test-jar, the same route TestConventionRules and
WireMockUtils already take) by composition - each already extends its own module's unit-test base, so a common
superclass is not available. The probe holds only what is genuinely identical: the caller key/value, the observation
bookkeeping, the MDC teardown, and the "context was visible" assertion. The per-engine assertions stay in the tests,
because they are what stops a test quietly degrading into a re-run of the core worker-pool case, and they really do
differ - Reactor asserts its scheduler thread positively (boundedElastic), while vertx and Mutiny can only
assert "not a pc- thread" since their executor is caller-supplied.

Every one of them is verified to be able to fail. A green test that cannot go red proves nothing, so:

  • The leak test was re-run with propagation disabled: it fails with
    expected to be empty but was: [poison_from_offset_2, poison_from_offset_3, poison_from_offset_0, poison_from_offset_1]
    • four keys carried across five records on one pooled thread. That is the real pre-existing defect on master.
  • The leak test asserts threadsUsed has size 1, so it cannot pass by accidentally getting a fresh thread per
    record. maxConcurrency(1) makes the reuse deterministic rather than lucky.
  • The three engine tests were each re-run with propagateMdc(false) (temporarily overriding
    initAsyncConsumer(..)) and each failed on its own "context must be visible on the <engine>" assertion,
    reporting values seen: [null, ...]. Re-verified again after the shared-probe refactor, so the extraction did not
    quietly defuse them. They also assert which thread observed - Reactor positively (boundedElastic), vertx and
    Mutiny as "not a pc- thread" - so they cannot silently stop covering the second boundary.

No existing assertion was weakened. The one failure I hit while developing (ReactorMdcPropagationTest expecting 4
records) was my own arithmetic - ReactorPCTest primes a 4th record in its own @BeforeEach, ReactorUnitTestBase
primes none - diagnosed from the surefire report (exactly 3 processed, 3 primed) rather than papered over with a
longer timeout.

Full unit suite (bin/ci-unit-test.sh) green across all 11 modules; bin/check-copyright-headers.sh clean;
upstream-map.py validate OK.

Refs #197, #195, confluentinc#907.

Merged up from master

Master moved a long way while this was open, and it was merged in more than once. Only the parts that changed this PR's code or its reasoning are recorded here.

The upstream-map restructure. #114 made the manifest track upstream PRs only, because every upstream issue now has a fork mirror, and deleted ten tracking-only entries — one immediately beside the entry this PR adds. Master's deletions were taken wholesale and this PR's entry refitted to the new shape: block style, fork_issue: 195 cross-linking the mirror of confluentinc#907, and renamed issue-907-mdc-propagation → mdc-context-propagation, since an issue- prefix now reads as one of the entries that commit removed.

That reading is still open to challenge: the manifest says it tracks upstream PRs, and this maps to an issue. fork_issue: 195 satisfies both readings — the upstream issue's diagnosis and closing live on the mirror, this PR's lifecycle lives in the manifest. Happy to drop the entry instead.

The package rename. This branch predated io.confluent.* → bz.stub.* and was brought across with bin/rename-packages.sh following its own BRINGING AN OPEN BRANCH ACROSS procedure — tooling taken from master, legacy-token residue cleared, rename applied, and only then master merged. The order is the whole point: renamed-branch meeting renamed-master gives git a rename to pair on each side, and the TestConventionsArchTest.java files duly surfaced as loud rename/rename conflicts rather than the silent cross-module misapplication the un-renamed order produces.

A real semantic conflict in ReactorProcessor. Master's fix(reactor) astubbs#342 replaced the two-argument Flux.subscribe(onNext, onError) with the three-argument form: the two-argument overload has no completion callback, so onComplete — which retires the record — was wired as the onNext consumer. A Publisher emitting several elements retired its record once per element; one completing empty retired it never, leaking the record's in-flight accounting and, since the dispatch ceiling landed, its dispatch permit for the life of the process.

This PR wraps those same callbacks in an MDC scope. The two compose rather than compete, and both survive: master's three-argument shape, with each terminal callback body inside the scope. The element consumer is deliberately left unwrapped — it is neither the user's function nor terminal handling, which is the boundary this propagation claims, and doOnNext in the same chain is unwrapped for the same reason. Each side keeps its own pin and both pass: ReactorPCTest#anEmptyPublisherStillRetiresTheRecord, which master's commit records as red against the two-argument form, and ReactorMdcPropagationTest.

Checked, not assumed: master's fix(core) astubbs#322 rejects PCModule getters that memoise a collaborator while taking that collaborator's owner as a parameter, and swept the class for the shape. mdcPropagation() was added after that sweep, so it could not have been covered — but it takes no owner parameter and memoises off options(), the same shape as pcMetrics(), so it is outside the defect class rather than an unswept instance of it.

Static analysis on this PR's own lines

The merge brought -Xlint:all and SpotBugs-over-test-code with it, and both then fired on lines this branch wrote. bin/check-pr-analysis-surfaces.sh separates those from inherited findings and reported three; it now reports none.

  • MdcBoundaryProbe.observations() returned java.util.Collection (IMC_IMMATURE_CLASS_COLLECTION_RETURN). The field is a ConcurrentLinkedQueue, so the declared type said strictly less than the thing behind it; it returns Queue now, which is both accurate and what a caller awaiting it wants to know.
  • Two PRMC_POSSIBLY_REDUNDANT_METHOD_CALLS on MDC.get(String) — the detector seeing a key read twice with the same constant argument and taking the second read for a cacheable repeat of the first. It is not: the scope under test is what changes the thread's context between the reads, so caching would delete the assertion. The rule registry keeps PRMC on, so this is not suppressed: all MDC reads now go through one assertMdc(key, expected) helper, and each test calls it with a different expectation. The detector is satisfied because the repeat is gone, not because it was told to look away. It pays for itself independently — the helper names the key in the failure message, which assertThat(MDC.get(k)) never did.

Verified in both directions rather than assumed: SpotBugs run locally over the core module before and after, and the test restructure given a negative control — breaking one expectation on purpose fails, at the right call site, with the key in the message.

Left unfixed, deliberately: the [try] auto-closeable resource scope is never referenced warnings on the try-with-resources blocks. They are real javac output but reach the build log only — not the check-run annotations — so the analysis-surface gate does not report them. The variable is unused because the scope is the subject of the test.

A chaos flake captured on this branch's CI

ChaosChurnStormIT tripped the ZOMBIE_MEMBER/REBALANCE_BLOCKED probe on one run. It is recorded as the seventeenth sighting in docs/inflight/bug-857-family.md, with its seed and replay command, because that ledger's own argument is that these captures are easy to lose — the log expires and the seed goes with it.

It is not this branch's defect, and the ledger already establishes why: the reds are seed-dependent rather than branch-dependent, one earlier capture came from a branch whose entire diff was markdown and a comment, and runner contention was ruled out on timing. The entry adds one new question — every prior capture of this arm predates the dispatch ceiling, which changes what a leaked permit costs — and names the control that would settle it. Chaos Pain Suite is not a required check, so it gated nothing.

Riding along: a chaos capture, and a citation repair

One Chaos Pain Suite red on this branch's CI is recorded in docs/inflight/bug-857-family.md — a ZOMBIE_MEMBER capture, seed 7543483068749855826, which that ledger already explains as seed-dependent rather than branch-dependent. It is not caused by this PR and it gates nothing.

A second red on this branch was the BLOCKED-on-monitor discriminator — the poll thread parked acquiring the commitCommand monitor held by its own control thread, which is the live defect that ledger's capture series is hunting, and whose fix is #29. It is deliberately not in this diff: it was written up here first, then master recorded the same run independently and better, inside a pairing analysis reading two PRs' reds ten minutes apart. The local copy was deleted rather than kept alongside master's, since a fact stated twice drifts apart.

What this PR does still carry from that is a repair to master's paragraph: it cited this work by branch name, which stops resolving the moment this branch is deleted. check-branch-self-reference.sh only inspects the branch it runs on, so it could never have fired for whoever wrote that line, and fired immediately here. It now names the PR, which is permanent.

Worth keeping straight, because conflating them loses the distinction the ledger exists to draw: the ZOMBIE_MEMBER arm has a standing seed-dependent explanation; the discriminator does not. Only the monitor-and-holder match separates them, and reading either as "the chaos flake" merges them.

Riding along: the mutation-lane findings

docs/mutation-lane-findings is folded in here rather than opened as its own PR — two docs/inflight/ notes, no code, cut from master and carrying no dependency on this work.

They record what the PR-scoped mutation lane found once #371 fixed it, and a gap in the lane itself: the survivor table is written only to $GITHUB_STEP_SUMMARY, which the REST API does not expose, so recovering which mutants survived cost a local re-run and a hand-written mutations.xml parser. bin/check-pr-analysis-surfaces.sh already lists that table under surfaces it cannot read, so the gap was documented before the lane produced anything worth reading.

The second note argues the survivor on #344's own new code is an equivalent mutant rather than a missing test — the bound is a sample of offsetHighestSucceeded, and a succeeded offset is by construction absent from incompleteOffsets, so < and <= cannot differ while that invariant holds. Writing a test to kill it would describe the implementation rather than the contract. It names the wider gaps that are real and predate that PR.

This is unrelated to MDC propagation and is here only because it needed a ride. Same for the chaos sighting above. Both are capture-only.

Defect-class sweep

The boundary this PR fixes is "work crosses onto a thread the caller's context never reached". Every ExternalEngine subclass was checked for it: VertxParallelEoSStreamProcessor, ReactorProcessor and MutinyProcessor are the complete set, and all three are covered here alongside the core worker pool. No fifth boundary was found uncovered.

Checklist

  • Docs updated — option javadoc, MdcPropagation class javadoc, docs/inflight/branch-mdc-context-propagation.md, and an upstream-map.yaml entry refitted to the post-mirror schema. CHANGELOG.adoc deliberately untouched, per AGENTS.md (generated at release time, not a per-PR chore)
  • N/A — user-facing feature documentation under docs/features/: this changes what PC's own logging carries, configured by one existing-style option; there is no feature surface to describe beyond the option javadoc
  • Tests added/updated — across core, vertx, reactor and mutiny, each verified to fail without the fix, and re-verified after the shared-probe refactor
  • Title & body reflect the final content of this PR
  • Ran ce-code-review via @claude review this on the PR (three rounds, the last returning no issues) — N/A for a local ce-simplify run on the feature itself; the simplify pass this session was spent on ci(hooks): fetch every remote at session start, and refuse a merge onto a stale branch #372

Not closing an issue

Neither reference is a closing one, and that is deliberate. #197 is the 0.6.0.0 release umbrella and this is one item within it; #195 is the mirror of confluentinc#907, whose subject is whether the project is maintained — this PR fixes a finding raised inside that thread, not the thread. Closing either would take unrelated work with it.

Refs #197, #195, confluentinc#907.

…r function

A caller who had established diagnostic context - a trace_id, a request_id, a
tenant - lost all of it the moment a record crossed into the worker pool, and
again crossing into vert.x, Reactor or Mutiny. The logs their user function
wrote could not be correlated back to the originating request. PC set only its
own two keys (pcId, offset) and called neither MDC.getCopyOfContextMap() nor
MDC.setContextMap() anywhere in the tree.

The context is snapshotted on the thread that calls poll*() - the only moment
it is reachable, since none of PC's threads exist yet and the SLF4J MDC is not
inheritable - and re-established around the user function on the thread that
actually runs it, then torn down again.

The teardown is the half that matters. Worker threads are pooled: one that
keeps the previous task's trace_id produces logs that are actively misleading,
which is worse than no context at all. That leak already existed on master for
the user function's own MDC.put calls - five records on one pooled thread carry
four poisoned keys - and is fixed by the same scope.

Precedence: PC's own pcId/offset are applied AFTER the caller's map at every
call site, so a caller key of the same name cannot shadow them. PC's own log
lines are read by those keys.

On by default, with ParallelConsumerOptions.propagateMdc as the kill switch.
Not propagating fails silently for everyone; propagating fails visibly, as one
extra key in a log line, and can be switched off. Setting it false restores the
old behaviour exactly, leak included, so it is a true revert rather than half
of one. PC logs the captured keys - never the values - at INFO, so that a
request-scoped value accidentally pinned for the life of the consumer is
discoverable rather than silently wrong.

Cost on the hot path is nil for anyone who never touches the MDC:
getCopyOfContextMap() returns null, allocating nothing, for an empty context,
and pcId is only ever set when setMyId() has been used.

Deliberately not covered: Reactor's and Mutiny's own operator chains. We carry
the context into the user's function and into PC's terminal signal handling;
following it through the Publisher/Uni they return needs Reactor's own
io.micrometer:context-propagation and is the user's call, not ours.

Upstream-Issue: confluentinc#907
Forwarded: not-needed
Applied-Upstream: no

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

github-actions Bot commented Aug 5, 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 5, 2026 •

Copy link
Copy Markdown

Claude is reviewing this PR

Todo list

  • Gather context (read CLAUDE.md, diff, changed files)
  • Understand the request (code review of MDC propagation PR)
  • Review core MdcPropagation primitive and its usage sites
  • Review engine integrations (vertx, reactor, mutiny)
  • Review tests for correctness and that they can actually fail
  • Post final review feedback

View job run

@github-actions

github-actions Bot commented Aug 5, 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 31 32 🙂 -1
Duplicated lines 995 1023 ❤️ -28
Duplication 0.13% 0.13% ➖ 0
Rule Limit Status
Max duplication 0.5% ✅ Pass (0.13%)
Max increase vs base +0.1% ✅ Pass (-0.00%)

No new clones introduced by this PR.

✅ jscpd (language-agnostic)

PR Base Change
Clones 89 88 🫤 +1
Duplicated lines 1275 1268 :face_with_monocle: +7
Duplication 1.06% 1.07% 🙂 -0.01%
Rule Limit Status
Max duplication 2% ✅ Pass (1.06%)
Max increase vs base +0.1% ✅ Pass (-0.01%)
⚠️ 1 new clones introduced
  • 8 lines: parallel-consumer-mutiny/src/main/java/bz/stub/parallelconsumer/mutiny/MutinyProcessor.java:8 <-> parallel-consumer-reactor/src/main/java/bz/stub/parallelconsumer/reactor/ReactorProcessor.java:8

Powered by astubbs/duplicate-code-cross-check

…ntry

Lifecycle transition per AGENTS.md - the manifest is the source of truth for
the fork side, and nothing automated checks it, so an entry saying prs: [] with
an open PR rots silently.

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

claude Bot commented Aug 5, 2026 •

Copy link
Copy Markdown

Claude finished @astubbs's task in 9m 8s —— View job


Claude's review of #205

Tasks

  • Gather context (PR body, changed files, comments)
  • Read AGENTS.md (this fork has no CLAUDE.md; AGENTS.md is the repo-instructions file)
  • Read the full diff (MdcPropagation, all 4 call sites, all new tests)
  • Compile core + vertx + reactor + mutiny modules
  • Run the new tests (MdcPropagationTest, MdcContextPropagationTest, VertxMdcPropagationTest, ReactorMdcPropagationTest, MutinyMdcPropagationTest) — all green
  • Verify the PR's central claim: flipped contextDoesNotLeakToTheNextTaskOnTheSamePooledThread() to propagateMdc(false) and re-ran it
  • Post findings

Summary

No issues found. This is a careful, well-scoped change and the PR body's claims check out under independent verification:

  • MdcPropagation (capture/enter/adopt) is a clean primitive: capture() returns null with no allocation on an empty context, enter(null) still establishes a CLEAR_ON_EXIT scope so a user function's own MDC.put doesn't leak, and enabled=false short-circuits both to true no-ops — a real, exact revert.
  • All four call sites (worker pool submit, vert.x onSuccess/onFailure/onComplete, Reactor Mono.fromCallable + both terminal signals, Mutiny Uni.deferred + both terminal signals) capture on the thread that has context and restore via try-with-resources on the thread that runs it — consistent with the table in the description.
  • Precedence is correct: PC's own MDC.put(MDC_INSTANCE_ID, ...) / MDC_WORK_CONTAINER_DESCRIPTOR calls all happen inside the enter(...) scope, so they apply on top of the caller's map, never before it.
  • Reproduced the pre-existing leak independently. Temporarily changed setupWithSingleWorkerThread(true) → (false) in contextDoesNotLeakToTheNextTaskOnTheSamePooledThread() (then reverted) and got the exact failure the PR body quotes:
    expected to be empty but was: [poison_from_offset_2, poison_from_offset_3, poison_from_offset_0, poison_from_offset_1]
    — confirms the leak test is genuinely load-bearing, not a test that would pass either way.
  • bin/check-copyright-headers.sh is clean (238 files, 0 violations); copyright header/attribution changes on modified upstream files follow the fork's Confluent-notice + modifications-line convention correctly.
  • docs/inflight/branch-mdc-context-propagation.md and the upstream-map.yaml entry (issue-907-mdc-propagation) both follow the documented conventions (naming, status: pr-open, fork.prs: [205], distinct from the existing maintenance-signal entry for the same upstream issue).
  • Ran all engine tests individually (VertxMdcPropagationTest, ReactorMdcPropagationTest, MutinyMdcPropagationTest) — each passes and each asserts the observing thread is not a pc- worker thread, so they can't silently degrade into re-testing the core boundary.

One minor accuracy nit (non-blocking)

The PR checklist says "13 new tests across 4 modules." Actual count is 17: MdcPropagationTest has 9 @Test methods, MdcContextPropagationTest has 5 (not folded into the "9" as the prose might suggest), plus 1 each in the vertx/reactor/mutiny modules. Worth a quick edit to the checklist line so the number matches the diff, per this repo's own PR-discipline guidance on keeping stated counts accurate — not something that needs a new commit on its own.

@github-actions

github-actions Bot commented Aug 5, 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-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyMdcPropagationTest.java parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorMdcPropagationTest.java 47.5
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MdcBoundaryProbe.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MdcContextPropagationTest.java 36.4
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/BatchTestBase.java parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 30.1

🔺 Increased similarities

File A File B Base (%) PR (%) Change
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorBatchTest.java 78.9 80.5 +1.6
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyPCTest.java parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorPCTest.java 67.6 68.9 +1.3
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 84.7 85.6 +0.9
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 85.7 86.4 +0.8
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 85.7 86.4 +0.8
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java 49.8 50.5 +0.7
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 86.0 86.6 +0.6
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 86.0 86.6 +0.6
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorBatchTest.java 51.4 52.0 +0.6
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 48.1 48.7 +0.6
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 86.9 87.4 +0.5
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorBatchTest.java parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 49.6 50.1 +0.5
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 82.3 82.7 +0.3
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.3 82.7 +0.3
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 82.3 82.7 +0.3
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.3 82.7 +0.3
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 82.3 82.7 +0.3
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.3 82.7 +0.3
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 80.9 81.2 +0.3
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 80.9 81.2 +0.3

...and 67 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 41.29
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java 36.91
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.21
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/SeenSucceededOrderingProbes.java 37.1
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.43 ⚠️
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/BootstrapResetTripleWriteProbes.java 41.29
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CalibrationProbes.java 37.21
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.43 ⚠️
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/CalibrationProbes.java 37.1
jcstress-poc/src/main/java/bz/stub/parallelconsumer/jcstress/BootstrapResetTripleWriteProbes.java 36.91
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 53.44 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 37.94
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java 34.73
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 34.12
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 32.76
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 32.65
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 31.74
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 30.96
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 64.38 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 58.53 ⚠️
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 42.82
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 41.32
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 35.93
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 33.32
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 31.62
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/RecordContextInternal.java 30.03
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 64.38 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 54.33 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 40.75
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 35.16
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 34.82
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 32.46
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 30.34
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/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 34.73
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 32.87
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 53.44 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 50.93 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 41.48
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 32.97
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 32.11
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalRuntimeException.java 32.09
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/ProducerManager.java 30.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 58.53 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 54.33 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 49.08
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 36.76
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java 34.67
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 32.68
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 30.52
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 49.08
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 41.32
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 40.75
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 36.22
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContext.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 36.76
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 35.93
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 34.82
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/RecordContextInternal.java 34.07
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContext.java 30.44
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/RecordContextInternal.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContext.java 43.32
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PollContextInternal.java 34.07
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 30.03
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 42.39
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/BrokerPollSystem.java 32.78
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java 32.44
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 31.31
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 30.52
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorConfigurationTest.java 30.5
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 32.78
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerOffsetCommitter.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitResponseTimeoutSymptomTest.java 31.74
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 45.87
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 32.44
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 30.43
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 57.5 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 50.93 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 50.92 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 48.45
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalRuntimeException.java 41.17
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 37.94
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 34.44
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/PCRetriableException.java 32.87
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 31.15
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 30.38
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalRuntimeException.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 41.17
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 32.09
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 31.53
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PCModule.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PCModuleCollaboratorOwnershipTest.java 33.08
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PollThreadStallDiagnosis.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/AmbientProbeExtension.java 32.89
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PollThreadStallDiagnosisTest.java 31.22
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ProducerManager.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerOptions.java 30.1
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/Java8StreamUtils.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/JavaUtils.java 34.41
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/CollectionUtils.java 32.06
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 39.11
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/utils/Java8StreamUtils.java 34.41
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/metrics/PCMetrics.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 49.32
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 35.43
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 34.56
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 34.44
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 32.97
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 32.65
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 31.39
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 57.5 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 49.32
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 47.89
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 46.44
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 45.44
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 45.29
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 41.48
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 34.12
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalRuntimeException.java 31.53
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.45
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 46.39
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 45.44
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 35.74
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV2EncodingNotSupported.java 34.85
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 50.92 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 47.89
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 46.39
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 32.76
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelConsumerException.java 32.11
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 31.39
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/RunLengthV1EncodingNotSupported.java 30.06
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 61.09 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 46.44
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 35.74
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 35.43
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 31.74
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 31.15
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/OffsetDecodingError.java 30.06
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 61.09 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/EncodingNotSupportedException.java 45.29
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/NoEncodingPossibleException.java 34.85
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/offsets/BitSetEncodingNotSupportedException.java 34.56
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ExceptionInUserFunctionException.java 30.96
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/InternalException.java 30.38
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 33.47
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionStateManager.java 32.85
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 44.93
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java 32.85
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 40.2
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 39.08
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardAvailableCountOwnershipTest.java 38.69
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkContainer.java 38.38
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 36.01
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 39.08
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkManager.java 36.51
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 34.28
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 51.54 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 38.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 44.93
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 36.51
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ProcessingShard.java 36.01
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/PartitionState.java 33.47
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 31.31
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/AmbientProbeExtension.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PollThreadStallDiagnosis.java 32.89
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AmbientProbeExtensionTest.java 30.17
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/KafkaSanityTests.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 57.13 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 43.66
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 35.96
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 40.03
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 39.41
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 35.96
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/RebalanceEoSDeadlockTest.java

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java 54.31 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 43.66
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 39.41
parallel-consumer-vertx/src/test-integration/java/bz/stub/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 30.85
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/VeryLargeMessageVolumeTest.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceHighVolumeTest.java 57.13 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/TransactionAndCommitModeTest.java 54.31 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/MultiInstanceRebalanceTest.java 40.03
parallel-consumer-vertx/src/test-integration/java/bz/stub/parallelconsumer/vertx/integrationTests/VertxConcurrencyIT.java 35.63
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkKeyOrderIT.java 39.06
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 38.58
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 38.39
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ProgressProbe.java 34.29
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkIT.java 32.68
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 47.13
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 38.39
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 32.3
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkKeyOrderIT.java 52.75 ⚠️
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 47.13
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 38.58
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosScenarioBase.java 35.06
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ProgressProbe.java 31.12
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 39.04
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 42.31
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 39.04
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 42.31
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 32.68
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosRevokeUnderWorkKeyOrderIT.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 35.06
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosChurnStormIT.java 32.3
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/DiagnosticQuietCap.java

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

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

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

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

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/AbstractRevokeUnderWorkScenario.java 34.29
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/chaostests/ChaosKeyOrderIT.java 31.12
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 39.42
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/AbstractParallelEoSStreamProcessor.java 30.5
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/internal/utils/KafkaTestUtils.java 31.67
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AmbientProbeExtensionTest.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/AmbientProbeExtension.java 30.17
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.1
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CheckQuarantineOwnersScriptTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineLaneReportScriptTest.java 47.69
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineRegistryScriptTest.java 45.33
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 32.06
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 36.93
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CommitRejectionTestBase.java 32.06
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ConsumerOffsetCommitter.java 31.74
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.02 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java 50.52 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 44.51
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/BatchTestBase.java 30.1
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MdcBoundaryProbe.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/MdcBoundaryProbe.java 36.4
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.44
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.44
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 36.93
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 35.2
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 35.2
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineLaneReportScriptTest.java

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CheckQuarantineOwnersScriptTest.java 45.33
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/QuarantineLaneReportScriptTest.java 30.38
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.44 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 86.62 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 86.62 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 83.67 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 83.67 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 83.67 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 82.17 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 82.17 ⚠️
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 45.87
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/MetricsTeardownCannotBreakCloseTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/metrics/PCMetrics859Test.java 37.8
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/metrics/PCMetrics.java 32.14
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 33.08
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/PollThreadStallDiagnosisTest.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/PollThreadStallDiagnosis.java 31.22
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 42.39
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorConfigurationTest.java 39.42
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/TestParallelEoSStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 34.67
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 31.62
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 30.34
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/BlockedThreadAsserter.java

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/AbstractParallelEoSStreamProcessorTestBase.java 31.67
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/utils/LoopingResumingIteratorTest.java

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

File Similarity (%)
parallel-consumer-core/src/test-integration/java/bz/stub/parallelconsumer/integrationTests/KafkaSanityTests.java 32.69
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/metrics/PCMetrics859Test.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/metrics/PCMetrics.java 42.53
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/internal/MetricsTeardownCannotBreakCloseTest.java 37.8
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.39
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.39
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckHarness.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerLincheckTest.java 31.7
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckToolchainProbeTest.java 31.24
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 36.5
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckHarness.java 31.24
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 47.19
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RacingEncodeWindowState.java 38.16
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 47.19
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateCommitShiftCompounding894Test.java 42.71
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java 33.93
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateCommitShiftCompounding894Test.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateCommitEncodeShift894Test.java 42.71
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 34.08
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateCommitEncodeShift894Test.java 33.93
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueLincheckTest.java 32.72
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerLincheckTest.java 31.94
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.64 ⚠️
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.64 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/OffsetEncoderWidenedRangeRaceTest.java 38.16
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 42.11
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java 32.72
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerLincheckTest.java 31.58
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 38.69
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardPopulationRaceTest.java 34.17
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 42.11
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckToolchainProbeTest.java 36.5
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java 34.08
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/LincheckHarness.java 31.7
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerLincheckTest.java 30.53
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerRevokeSweepNpeTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerStaleCheckDoubleLookupTest.java 35.21
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 40.2
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/ShardManager.java 34.28
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardAvailableCountOwnershipTest.java 34.17
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkClaimStateMachineTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerTest.java 55.12 ⚠️
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/state/WorkContainer.java 51.54 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerLincheckTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/PartitionStateLincheckTest.java 31.94
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/RetryQueueLincheckTest.java 31.58
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerLincheckTest.java 30.53
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/WorkManagerStaleCheckDoubleLookupTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/state/ShardManagerRevokeSweepNpeTest.java 35.21
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 55.12 ⚠️
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.23
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.23
parallel-consumer-examples/parallel-consumer-example-core/src/main/java/bz/stub/parallelconsumer/examples/core/CoreApp.java

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

File Similarity (%)
parallel-consumer-examples/parallel-consumer-example-reactor/src/main/java/bz/stub/parallelconsumer/examples/reactor/ReactorApp.java 36.61
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.42
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/integrationTests/CoreAppMetricsIntegrationTest.java 36.27
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/VertxAppTest.java 35.35
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 83.67 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 83.47 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 82.69 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.69 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 79.88 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 79.88 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 78.44 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 78.44 ⚠️
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.17 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 81.97 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 81.21 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 81.21 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 78.44 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 78.44 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 78.44 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 77.04 ⚠️
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.27
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 69.78 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/main/java/bz/stub/parallelconsumer/examples/core/CoreApp.java 36.61
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/ReactorAppTest.java

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

File Similarity (%)
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/VertxAppTest.java 46.42
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/CoreAppTest.java 39.42
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.67 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 83.47 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 82.69 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.69 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 79.88 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 79.88 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 78.44 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 78.44 ⚠️
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.17 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 81.97 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 81.21 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 81.21 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 78.44 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 78.44 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 78.44 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 77.04 ⚠️
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 69.78 ⚠️
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.67 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 83.47 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 82.69 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 82.69 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 79.88 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 79.88 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 78.44 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 78.44 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/VertxAppTest.java

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

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

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

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

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

File Similarity (%)
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorBatchTest.java 80.53 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 50.52 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 48.67
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.51
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 68.86 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyUnitTestBase.java

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

File Similarity (%)
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorUnitTestBase.java 31.27
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.62 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 86.42 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 85.61 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 82.69 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 82.69 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 82.69 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 81.21 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 81.21 ⚠️
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 48.12
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorBatchTest.java

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

File Similarity (%)
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java 80.53 ⚠️
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 52.02 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java 50.1 ⚠️
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.51
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 68.86 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorUnitTestBase.java

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

File Similarity (%)
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyUnitTestBase.java 31.27
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.62 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/TestConventionsArchTest.java 86.42 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 85.61 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 82.69 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 82.69 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 82.69 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 81.21 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 81.21 ⚠️
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java

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

File Similarity (%)
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 42.82
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java 41.26
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelEoSStreamProcessor.java 40.21
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java 37.55
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 35.16
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelEoSStreamProcessor.java 32.68
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelStreamProcessor.java

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

File Similarity (%)
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java 42.09
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 41.26
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/ParallelStreamProcessor.java 36.22
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelEoSStreamProcessor.java 33.32
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/JStreamParallelStreamProcessor.java 32.46
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 42.0
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/JStreamVertxParallelEoSStreamProcessor.java 40.21
parallel-consumer-core/src/main/java/bz/stub/parallelconsumer/internal/ExternalEngine.java 30.43
parallel-consumer-vertx/src/main/java/bz/stub/parallelconsumer/vertx/VertxParallelStreamProcessor.java

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

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

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

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

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

File Similarity (%)
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/TestConventionsArchTest.java 87.44 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/TestConventionsArchTest.java 86.42 ⚠️
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/TestConventionsArchTest.java 86.42 ⚠️
parallel-consumer-examples/parallel-consumer-example-core/src/test/java/bz/stub/parallelconsumer/examples/core/TestConventionsArchTest.java 83.47 ⚠️
parallel-consumer-examples/parallel-consumer-example-reactor/src/test/java/bz/stub/parallelconsumer/examples/reactor/TestConventionsArchTest.java 83.47 ⚠️
parallel-consumer-examples/parallel-consumer-example-vertx/src/test/java/bz/stub/parallelconsumer/examples/vertx/TestConventionsArchTest.java 83.47 ⚠️
parallel-consumer-examples/parallel-consumer-example-metrics/src/test/java/bz/stub/parallelconsumer/examples/metrics/TestConventionsArchTest.java 81.97 ⚠️
parallel-consumer-examples/parallel-consumer-example-streams/src/test/java/bz/stub/parallelconsumer/examples/streams/TestConventionsArchTest.java 81.97 ⚠️
parallel-consumer-vertx/src/test/java/bz/stub/parallelconsumer/vertx/VertxBatchTest.java

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

File Similarity (%)
parallel-consumer-reactor/src/test/java/bz/stub/parallelconsumer/reactor/ReactorBatchTest.java 50.1 ⚠️
parallel-consumer-mutiny/src/test/java/bz/stub/parallelconsumer/mutiny/MutinyBatchTest.java 48.67
parallel-consumer-core/src/test/java/bz/stub/parallelconsumer/CoreBatchTest.java 44.51

@github-actions

github-actions Bot commented Aug 5, 2026 •

Copy link
Copy Markdown

⚠️ SpotBugs Report

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

… tests

The file-similarity report flagged the three new engine tests as newly
introduced duplication (Mutiny<->Reactor 69%, Mutiny<->vertx 55%,
Reactor<->vertx 53%). The identical part - the caller key/value, the two
observation queues, the MDC teardown, and the "context was visible"
assertion - now lives once in MdcBoundaryProbe, in the core test-jar, the
same route TestConventionRules and WireMockUtils already take.

Used by composition, not a shared base class: each engine test already
extends its own module's unit-test base, so inheritance is not available.

The per-engine assertions deliberately stay in the tests, because they are
what stops a test quietly degrading into a re-run of the core worker-pool
case, and they genuinely differ: Reactor asserts its scheduler thread
positively (boundedElastic), while vertx and Mutiny can only assert "not a
pc- thread" since their executor is caller-supplied. Nothing was weakened -
the probe's failure messages now also report the threads and values seen,
which the previous assertions did not.

Re-verified all three can still go red: temporarily overriding
initAsyncConsumer with propagateMdc(false) fails each on its own "context
must be visible on the <engine>" assertion with `values seen: [null, ...]`.

Also:
- the escape-hatch test's javadoc read as though propagation were off by
  default; say plainly that it is on
- record the measured allocation cost in the inflight note: 0 bytes per
  batch when the caller never touches the MDC (measured with
  ThreadMXBean.getThreadAllocatedBytes, not assumed), ~424 bytes when they
  do, with the caveat that the zero is a logback MDCAdapter property
- note that the startup INFO line is structurally once-per-instance, since
  supervisorLoop throws if poll*() is called twice

Refs #197, #195, upstream confluentinc#907.

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

astubbs commented Aug 5, 2026

Copy link
Copy Markdown
Owner Author

Responding to the review in #205 (comment) and to the two automated duplication reports. Fixed in 544347b.

1. "13 new tests" was wrong — you were right, it is 17. Fixed

Counted independently rather than taking the number on faith, and the reviewer's count is exactly right:

File @Test methods
MdcPropagationTest 9
MdcContextPropagationTest 5
VertxMdcPropagationTest 1
ReactorMdcPropagationTest 1
MutinyMdcPropagationTest 1
Total 17

Confirmed by surefire, not just by grep — core reports Tests run: 9 and Tests run: 5, one each in the three engine modules. The prose was the source of the error: it said "MdcPropagationTest (9 unit tests) plus MdcContextPropagationTest", which reads as though the 5 were inside the 9. Checklist line and the Tests section are both corrected.

2. Startup INFO line — checked proactively, it is once per instance

Worth stating explicitly since #203 is specifically about log noise, and an INFO line on a hot path would be a genuine regression. It is not on one, and structurally cannot be: captureCallersDiagnosticContext() is called from exactly one place, supervisorLoop, which opens with

if (state != State.UNUSED) {
    throw new IllegalStateException(msg("Invalid state - you cannot call the poll* or pollAndProduce* methods more than once ..."));
}

so it runs once per consumer, at startup, before any PC thread exists. Not per poll, not per record. Now recorded in the inflight note so it stays that way.

3. Hot-path cost — measured rather than reasoned about

The PR claimed "nil for users who never touch the MDC" on the strength of an argument. Measured it instead, with ThreadMXBean.getThreadAllocatedBytes over 1M capture()/enter()/close() cycles (logback 1.6.1, JDK 17), warmed up:

Case Bytes/batch
Caller never touches the MDC (the default) 0.000
Propagation disabled 0.000
2-key MDC — capture() on the controller thread 240
2-key MDC — enter()+close() on a clean worker thread 184

So the claim holds exactly: zero bytes, not merely "small". getCopyOfContextMap() really does return null without allocating, and enter(null) really does return the shared CLEAR_ON_EXIT singleton.

One honest caveat I have added to the PR body and the inflight note: that zero is a logback MDCAdapter property. Some other SLF4J bindings return an empty map rather than null for an empty context, which would make capture() allocate one small map per batch. Behaviour is correct under either; only the zero-allocation figure is binding-specific. Better to write that down than to let a clean number imply more than it does.

4. File-similarity report — refactored

The similarity check flagged the three new engine tests as newly introduced duplication (Mutiny↔Reactor 69.0%, Mutiny↔vertx 55.2%, Reactor↔vertx 53.1%). That is duplication this PR introduced, so it is in scope and is now removed rather than argued away.

The identical part — caller key/value, the two observation queues, the MDC teardown, and the "context was visible" assertion — now lives once in MdcBoundaryProbe, in the core test-jar, which is the same route TestConventionRules and WireMockUtils already take. Used by composition, not a shared base class: each engine test already extends its own module's unit-test base, so inheritance was not available.

What deliberately did not move: the per-engine assertions. Those are precisely what stops a test quietly degrading into a re-run of the core worker-pool case, and they genuinely differ — Reactor asserts its scheduler thread positively (boundedElastic), while vertx and Mutiny can only assert "not a pc- thread" because their executor is caller-supplied. Folding those into one shared assertion would have meant weakening Reactor's to the weakest common denominator, which is not a trade worth making for a similarity percentage.

Nothing was weakened; the assertions got slightly stronger. The probe's failure messages now report the threads and the values actually seen, which the previous hand-rolled assertions did not. And all three were re-verified to still go red after the extraction — temporarily overriding initAsyncConsumer(..) with propagateMdc(false):

ReactorMdcPropagationTest ... the caller's diagnostic context must be visible on the Reactor scheduler thread - values seen: [null, null, null]
MutinyMdcPropagationTest ... the caller's diagnostic context must be visible on the Mutiny executor thread - values seen: [null, null, null]
VertxMdcPropagationTest  ... the caller's diagnostic context must be visible on the vert.x event loop - values seen: [null]

A refactor that silently defused the tests would have been worse than the duplication.

5. Duplicate-code report, jscpd's "+1 new clone" — pushing back, no change

jscpd flagged an 8-line clone at MutinyProcessor.java:8 ↔ ReactorProcessor.java:8. That location is the import block. Both files gained import io.confluent.parallelconsumer.internal.MdcPropagation;, which extended an already-identical run of io.confluent.parallelconsumer.* imports past jscpd's 8-line minimum. It is not duplicated logic and there is nothing to extract — Java import statements are not refactorable, and the only way to "fix" it would be to make the imports gratuitously different.

Worth noting the cross-check engine disagrees in the right direction: PMD CPD reports −1 clone and −28 duplicated lines for this PR, and overall duplication falls on both engines (CPD 2.51% → 2.43%, jscpd 3.26% → 3.20%). Both checks pass.

6. One thing for the maintainer, not for me — propagateMdc defaults to on

Flagging this explicitly rather than letting it ride on the review's "No issues found". The reasoning in the description still stands (not propagating fails silently for everyone; propagating fails visibly and has a kill switch), but the residual risk is real and is mine to surface, not to decide:

a request-scoped value present in the MDC at poll*() gets pinned to the consumer for its whole life.

That is the same "actively misleading logs" failure this PR exists to prevent, just in a different shape. It is mitigated (the startup INFO line makes it discoverable, and the option javadoc calls it out) but not eliminated. This is a product decision that has not been signed off. If you would rather ship it default-off and let users opt in, say so — it is a one-line change to the @Builder.Default, and the whole test suite already covers both settings. I have recorded it in the inflight note as the one decision here a future session should expect to be overruled on.

Also in this commit

  • The escape-hatch test's javadoc read as though propagation were off by default ("including the leak, which is why it is off by default"). Ambiguous at best and actively misleading at worst, given the previous point. Rewritten to say plainly that propagation is on by default and what the flag reverts.
  • MdcContextPropagationTest now takes CALLER_KEY / CALLER_VALUE from the shared probe instead of redeclaring them.

Verification

MdcPropagationTest 9 ✅ · MdcContextPropagationTest 5 ✅ · vertx/reactor/mutiny 1 each ✅ · all four modules' TestConventionsArchTest ✅ (the new probe holds no @Test methods, so the surefire-naming rule does not apply to it) · bin/check-copyright-headers.sh 238 files, 0 violations.

🤖 Generated with Claude Code

@claude

claude Bot commented Aug 5, 2026 •

Copy link
Copy Markdown

Claude finished @astubbs's task in 8m 37s —— View job


Claude's review of #205 (re-review after commit 544347b)

Tasks

  • Gather context (PR body, diff, prior review + author's response, changed files)
  • Read MdcPropagation primitive and all four call sites (core worker pool, vert.x, Reactor, Mutiny)
  • Read the shared MdcBoundaryProbe and the three engine tests it now backs
  • Read MdcPropagationTest and MdcContextPropagationTest
  • Compile core + vertx + reactor + mutiny and run every new test independently
  • Post final review feedback

Summary

No issues found. This is the follow-up commit (544347b7) after the first review round, and it does what the PR author's response claims: fixes the test-count nit, extracts the duplicated engine-test bookkeeping into MdcBoundaryProbe without weakening any assertion, and adds the measured-allocation and once-per-instance documentation. Independently re-verified rather than taking the response at face value:

  • All 17 tests pass, run individually, not just as a suite total: MdcPropagationTest (9/9), MdcContextPropagationTest (5/5), ReactorMdcPropagationTest (1/1), MutinyMdcPropagationTest (1/1), VertxMdcPropagationTest (1/1). The count matches the corrected checklist exactly.
  • Precedence is correct in code, not just in prose. Traced the call order by hand: in submitWorkToPoolInner (AbstractParallelEoSStreamProcessor.java:1084-1087), mdc.enter(submittersDiagnosticContext) installs the caller's map before addInstanceMDC() and the MDC.put(MDC_WORK_CONTAINER_DESCRIPTOR, ...) inside runUserFunction (line 1380) run — so PC's pcId/offset really do land on top and win a collision, exactly as MdcPropagationTest#keysPutAfterEnterOverrideTheCapturedOnes and MdcContextPropagationTest#pcsOwnKeysSurviveAndWinACollision assert.
  • The startup INFO line is structurally single-shot. captureCallersDiagnosticContext() is only reachable from supervisorLoop, which throws before it if poll*() was already called - confirmed by reading the code, not just the claim.
  • BrokerPollSystem.controlLoop() calls adopt() once, above the while loop (BrokerPollSystem.java:142), not per poll iteration - no hot-path concern there either.
  • No allocation-on-empty-context claim contradicted by the code: capture() returns MDC.getCopyOfContextMap() directly (null on empty for logback), enter(null) still establishes a scope via the shared CLEAR_ON_EXIT/restore-lambda so a user function's own MDC.put doesn't leak onto the next task on a reused thread.
  • bin/check-copyright-headers.sh clean (239 files, 0 violations).
  • docs/inflight/branch-mdc-context-propagation.md and the upstream-map.yaml entry are accurate and consistent with the shipped code (default-on decision, precedence, measured costs, known gap re: reactive-chain operators all match what's actually in MdcPropagation.java and the call sites).

Did not re-run the destructive "flip propagateMdc(false) and confirm the test goes red" experiment myself in this pass (would have required a git stash/checkout of tracked files, which needs interactive approval this run doesn't have) - relying on the first review round's independent reproduction of that exact failure message, which still matches the current code path.

No other findings. The response to the first round (test-count fix, probe extraction, measured-cost table, once-per-instance clarification) addresses everything raised, and nothing new turned up on a fresh pass.
· branch feat/mdc-context-propagation

@astubbs

astubbs commented Aug 5, 2026

Copy link
Copy Markdown
Owner Author

Closing the loop on 544347b — all 25 checks green, and the re-review came back clean ("No issues found", having independently re-run all 17 tests and hand-traced the MDC precedence order).

The probe extraction worked, measurably

The similarity tool re-ran against the new commit. Before → after, on the three files it had flagged as newly introduced duplication:

Pair Before After Change
Mutiny ↔ Reactor 69.0% 47.9% −21.1
Mutiny ↔ vertx 55.2% 30.4% −24.8
Reactor ↔ vertx 53.1% below threshold dropped off entirely

One new entry appears in its place — MdcBoundaryProbe ↔ MdcContextPropagationTest at 31.9%, barely over the 30% reporting floor. That is the shared CALLER_KEY/CALLER_VALUE constants plus the unavoidably common MDC vocabulary between two files that are both about the MDC. Trading three ~55-69% pairs for one 31.9% pair is the right direction, and there is nothing further to extract without merging two tests that legitimately test different things (the core one inspects the whole context map per record; the probe only tracks one key).

PMD CPD remains at −1 clone / −28 duplicated lines vs base. Both engines pass.

Why the claude-review check was red before, for the record

Not a review finding — the review had posted fine. bin/check-review-posted.sh reported "no comment on this PR cites run 30976640557" when comment 5187730433 plainly did cite it.

Root cause is a pipefail interaction on line 94:

set -euo pipefail
...
if printf '%s\n' "$comment_bodies" | grep -qE "actions/runs/${run_id}([^0-9]|$)"; then

When the match is found early in a large body, grep -q exits immediately, printf is still writing, gets SIGPIPE, and exits 141. pipefail makes that 141 the pipeline's status — so the if is false even though grep matched. The failing run's log shows exactly this: line 94: printf: write error: Broken pipe, immediately followed by the "no comment cites run" error.

Deterministic repro:

$ bash -c 'set -euo pipefail
  body="actions/runs/30976640557
  $(head -c 500000 /dev/zero | tr "\0" x)"
  if printf "%s\n" "$body" | grep -qE "actions/runs/30976640557([^0-9]|$)"; then echo PASS; else echo "FAIL rc=$?"; fi'
FAIL rc=141
FAIL rc=141
FAIL rc=141

It is size- and position-dependent, which is why it is intermittent and why this PR tripped it — the review comment is followed by a 134 KB duplicate-code report, so the match sits early in a very large body. It went green on this push only because the timing happened to fall the other way.

I have deliberately not touched it — editing a CI gate to make my own PR go green is exactly the thing not to do, and this is a repo-wide issue affecting every PR rather than anything about this one. Flagging it for a separate PR; the fix is a one-liner (grep -qE ... <<< "$comment_bodies", dropping the pipe entirely).

Still open for the maintainer

propagateMdc defaulting to on (see point 6 above) is unsigned-off and is the one call here I do not think is mine to make. Everything else is settled.

🤖 Generated with Claude Code

astubbs and others added 3 commits August 6, 2026 15:31
…opagation

# Conflicts:
#	src/docs/development/upstream-map.yaml
…ew schema

Master's mirror landed while this branch was open, and it changes two things
under this PR's feet.

Issue references must now name their repo below #1000 (#197 /
confluentinc#907), enforced on added lines by .github/scripts/issue-ref-gate.js.
Three of this branch's added lines were bare - two in the inflight note, one in
MdcContextPropagationTest's javadoc - so the PR Checklist gate would have failed
on merge. Verified by running the gate's own suspectRefs() over this PR's diff:
three hits before, zero after.

Also dropped "upstream confluentinc#907" for "confluentinc#907". The bare form still passes
the gate, but AGENTS.md now asks new writing to name the owner rather than the
role, since this fork is itself upstream to anyone who forks it.

upstream-map.yaml was restructured by the mirror commit: it tracks upstream PRs
only, entries moved to block style, and fork work now cross-links its mirror via
fork_issue. Refitted this entry to match and renamed it issue-907-mdc-propagation
-> mdc-context-propagation, since the "issue-" prefix now reads as one of the
tracking-only entries that commit deleted. Safe to rename: nothing outside this
branch referenced it. fork_issue: 195 is the mirror of confluentinc#907.

Kept the entry rather than deleting it. AGENTS.md is in slight tension here -
the manifest "tracks upstream PRs only" (this maps to an issue, not a PR), but
it also says to record status: pr-open for your own fork work at each lifecycle
transition. fork_issue: 195 satisfies both: the upstream issue's diagnosis and
closing live on the mirror, the fork work's lifecycle lives here.

upstream-map.py validate: OK, 15 entries.

Refs #197, confluentinc#907.

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

Master's 16ac63b fixed MultiInstanceMetricsTest for awaiting a counter that
LEADS the value being asserted, and generalised the rule: await the value you
are about to assert, never a proxy that leads it. MdcBoundaryProbe, added
earlier in this PR, had the same shape.

observeCurrentThread() appended to threadsUsed and then to contextSeen, and
observations() returned contextSeen. So the engine tests awaited contextSeen
reaching 3 and then asserted over threadsUsed - a collection that is always one
step ahead. A fourth invocation arriving concurrently could have contributed its
thread name but not yet its context value, and assertObservedOnlyOn would have
inspected four entries having awaited three.

It could not actually lose today, because each engine test primes exactly three
records, so no fourth invocation exists. That is a property of the fixture, not
of the probe - exactly the "all four sites had the pattern, only one had lost
the race so far" situation 16ac63b describes.

Now one Observation (thread + value seen) is added atomically to one collection,
so awaiting observations() bounds everything the assertions read. This is the
shape MdcContextPropagationTest already used for its own @value Observation; the
probe should not have diverged from it when the engine bookkeeping was extracted.

Nothing loosened - the assertions are unchanged in strength and still name the
threads and values seen on failure. Re-verified both Reactor and Mutiny still go
RED under propagateMdc(false) after the change, with `values seen: [null, null,
null]`; all 17 tests green.

Refs #197.

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

claude Bot commented Aug 6, 2026 •

Copy link
Copy Markdown

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


Claude's review of #205 (re-review after commit 11e18d46, the merge-up-from-master)

Tasks

  • Gather context (diff, prior two review rounds, PR body's "Merged up from master" section)
  • Review the merge commit d4fed639 and the two follow-up commits it enabled (0377b0bd, 11e18d46)
  • Independently verify the MdcBoundaryProbe race fix
  • Independently verify the issue-ref-gate fix (no unqualified refs on added lines)
  • Compile and run all 17 MDC tests fresh (core + vertx + reactor + mutiny)
  • Post final review feedback

Summary

No issues found. This round only needed to cover what changed since the second review (544347b7): the merge-up-from-master (d4fed639) and the two commits it prompted (0377b0bd, 11e18d46). Both check out independently.

11e18d46 — the MdcBoundaryProbe latent-race fix is correct and does what it says. Read MdcBoundaryProbe.java before and after: the old shape appended to threadsUsed and then to contextSeen as two separate ConcurrentLinkedQueue<String>, and observations() (the collection tests await) returned only contextSeen — so an assertion reading threadsUsed was reading a collection that could, in principle, be one entry ahead of what was awaited. The fix collapses both into one @Value Observation(threadName, callerValueSeen) added atomically to a single queue, and observations() now returns that queue directly — so awaiting it bounds everything the assertions read. This is the same fix shape as master's 16ac63b1 for MultiInstanceMetricsTest, applied correctly. Confirmed the assertion strength wasn't weakened: assertObservedOnlyOn and assertCallersContextWasVisible still report the same failure-message content, just reading from Observation fields instead of the old parallel lists.

0377b0bd — the issue-ref-gate fix is complete. Ran the same check the PR body describes: scanned every added line in git diff origin/master...HEAD for a bare #NNN pattern. All six hits are properly qualified (astubbs#197, confluentinc#907, astubbs#195) — zero unqualified refs remain. The upstream-map.yaml entry (mdc-context-propagation, fork_issue: 195) matches the post-mirror block-style schema used by the surrounding entries.

Fresh test run, not trusted from the PR body. Compiled and ran all 17 tests from a clean invocation:

  • MdcPropagationTest: 9/9 ✅
  • MdcContextPropagationTest: 5/5 ✅ (includes the leak test and the collision test)
  • VertxMdcPropagationTest: 1/1 ✅
  • ReactorMdcPropagationTest: 1/1 ✅
  • MutinyMdcPropagationTest: 1/1 ✅

bin/check-copyright-headers.sh: 239 files, 0 violations.

One thing I could not execute in this session: upstream-map.py validate is blocked by this environment's tool-approval policy (no interactive approval available here). Manually inspected the YAML instead — the mdc-context-propagation entry is well-formed, matches the schema of neighboring entries, and its claims (fork_issue: 195, prs: [205], status: pr-open) are consistent with the actual PR/issue state. Not a blocker, just noting the gap in what I was able to independently execute this round.

Still open (carried over, not a new finding)

The author flagged this themselves and it hasn't been resolved: propagateMdc defaults to on, which means a request-scoped MDC value present at poll*() time gets pinned to the consumer for its whole life — mitigated by the once-per-instance INFO log of captured keys, but a genuine product decision the maintainer should confirm rather than something I'm resolving on their behalf.
· branch feat/mdc-context-propagation

…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
astubbs marked this pull request as draft August 19, 2026 03:11
astubbs added a commit that referenced this pull request Aug 24, 2026
…-up is not a new mode

Two corrections from the owner. The missing instance identifier needs no new
mechanism and is not what #205 provides: MDC_INSTANCE_ID, the control
thread's addInstanceMDC, the poller's own put and the logback pattern all
exist already. It renders blank because myId defaults to empty - built as a
manual aid for testing several instances and never defaulted. Defaulting it
to the UUID PCMetrics already generates would make a log line and a metric
name the same instance for free. #205 carries the caller's context
into the worker threads, the opposite direction.

And catch-up does not license saturating the downstream, which collapses it
from a fourth mode into the standing objective with the latency ceiling
suspended - the same equilibrium search, one suspension, no new controller.
The distinction that survives: the knee and the throughput plateau are
different points, normal running probably wants the knee and catch-up the
plateau, and the plateau self-limits because a saturated dependency stops
paying for more admission.
The branch was already renamed to bz.stub.* by the grand sweep, so this merge
takes the order AGENTS.md and bin/rename-packages.sh require - renamed branch
meeting renamed master - and git had a rename to pair against on each side.

54 conflicts, split by whether this PR contributes content to the file.

Five do. Four are the MdcPropagation import landing in a block master also
edited, and keep both sides. The fifth is a real semantic merge in
AbstractParallelEoSStreamProcessor#submitWorkToPoolInner: master wrapped the
pool submit in a RejectedExecutionException catch that drops the batch when the
pool is shut down and rethrows when a live pool rejects, while this branch
wrapped the submitted lambda in an MDC scope. They compose - the capture stays
on the controller thread ahead of the try, the try/catch is master's verbatim,
and the MDC scope stays inside the lambda - so the rejection contract and the
context propagation both survive.

The other 49 are files this branch only renamed, or tooling and test logging
config it took from an older master. Each takes master's version, or accepts
master's deletion. The set was derived by diffing the branch's content commits
against the merge base and mapping through the rename commit's own rename map,
not by eye.

README.adoc and docs/todo-index.md are regenerated rather than merged.
bin/check-copyright-headers.sh reports 0 violations across the result.
check-inflight-tags.sh and check-branch-self-reference.sh both arrived from
master in the merge, and both fail on work this branch owns rather than on
anything master left behind.

The MDC note gains `inflight-type: feature` and `inflight-impact: blind-spot` -
the consequence it addresses is that a caller's trace_id was invisible in the
logs their own function wrote, which is a missing instrument rather than a
lying one. It also gains `post-merge: exempt-file`, the marker the gate
prescribes for a note that IS the note for the PR it names: it discusses its own
branch throughout by design, and it is deleted when that PR lands.

The rename sweep's 38-branch worklist listed this branch as sweep work still to
schedule, which stops being true the moment this merges - the branch was brought
across by hand, ahead of the sweep. Its row is removed and the reason recorded
below the table, inside a checked block, so a later agent reading the worklist
does not go looking for a job that is already done. Recorded rather than silently
deleted, because a row that just vanishes reads as an oversight.
@github-actions

github-actions Bot commented Aug 26, 2026 •

Copy link
Copy Markdown

🧪🔒 Quarantine Lane Report

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

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

…s own lines

The master merge brought `-Xlint:all` and SpotBugs-over-test-code with it, and
both then fired on lines this branch wrote. `bin/check-pr-analysis-surfaces.sh`
separates those from the inherited ones and exited non-zero on exactly three.
AGENTS.md gives two ways out - fix it, or say in the PR why not - and all three
turned out to be fix.

`MdcBoundaryProbe.observations()` returned `java.util.Collection`
(IMC_IMMATURE_CLASS_COLLECTION_RETURN). The field is a `ConcurrentLinkedQueue`,
so the declared type was strictly less informative than the thing behind it. It
now returns `Queue`, which is both what it is and what callers want to know: the
javadoc says a test awaits this to bound what the assertions read, and `Queue`
says the collection is being appended to concurrently in a way `Collection` does
not. Every caller reaches it through Truth's iterable subject, so nothing else
moves.

The other two were PRMC_POSSIBLY_REDUNDANT_METHOD_CALLS on `MDC.get(String)` -
the detector seeing the same key read twice with the same constant argument and
taking the second read for a cacheable repeat of the first. It is not: the scope
under test is precisely what changes the thread's context between the two reads,
so caching would delete the assertion rather than tidy it.

That makes the rule wrong HERE while remaining right in general, and the rule
registry lists PRMC among the ones kept on. So the fix is not a suppression: all
MDC reads in the class now go through one `assertMdc(key, expected)` helper, and
each test method calls it with a different expectation instead of calling
`MDC.get` twice. The detector is satisfied because the repeat is gone, not
because it was told to look away.

It pays for itself independently of the analyser. `assertThat(MDC.get(k))` fails
with "expected abc, but was null" and never says which key it meant; the helper
uses `assertWithMessage("MDC[%s]", key)`, so the failure names it.

Verified rather than assumed, in both directions. SpotBugs run locally over the
core module before and after: the three findings on these files are present
before and absent after. And the restructure was given a negative control -
breaking one expectation on purpose fails the test, at the right call site, with
the key in the message - because a test edit that cannot be shown to still fail
is a weakened test.

Not fixed, and deliberately: the `[try] auto-closeable resource scope is never
referenced` warnings on the try-with-resources blocks in `MdcPropagationTest`.
They are real javac output, but they reach the build log only - they are not in
the check-run annotations, so the analysis-surface gate does not report them and
the fix-or-explain rule does not bite. The variable is unused because the scope
is the subject of the test rather than something it talks to, which is the shape
`-Xlint:try` exists to flag and the one case where it is not telling you
anything.
astubbs added a commit that referenced this pull request Aug 26, 2026
…to a stale branch (#372)

A remote-tracking ref is a cache, and a stale one does not error - it answers.
`origin/master` being fresh says nothing about `origin/<your-branch>`, which in a
repo where several agents run at once moves without you: another session,
another machine, or a sweep that touches every open branch in one pass.

MEASURED, ON 2026-08-26. A session picked up #205,
fetched `origin/master`, and merged it. It never fetched the branch's own ref,
two weeks stale since the package-rename sweep had pushed to it - so it re-did
the rename from scratch, resolved the resulting conflicts on top of the
duplicate, and found out at `git push`, which rejected the non-fast-forward. The
recovery was to discard all of it and rebuild on the published tip. Every command
in between reported success, which is the whole problem: nothing was looking.

`.claude/hooks/check-branch-behind-its-own-remote.sh` has two arms against that
one failure. At `SessionStart` it runs `git fetch --all --prune`, throttled on a
stamp file, so every ref the session goes on to read is real. On `git merge` or
`git rebase` it refuses while `origin/<branch>` holds commits the checkout does
not, and names them. It is the mirror image of `remind-master-drift-on-push.sh`:
that one watches the base moving under you, this one watches your own branch.

WHY IT DENIES WHERE THE PUSH HOOKS ONLY REPORT. `docs/agent-harness.md` already
draws the line - a situation with no wrong answer gets `additionalContext`, a
violation gets a `deny`. Merging onto a ref known to be behind its published tip
is not a judgement call: the result cannot be pushed without discarding somebody
else's commits, so there is no outcome the agent wanted.

WHAT IT MUST NEVER DENY, because a guard that blocks its own remedy gets switched
off. Merging or rebasing onto the branch's own tip - `origin/<branch>`,
`@{upstream}`, `FETCH_HEAD` - is the reconciliation the deny message asks for.
And `--abort`, `--continue`, `--skip`, `--quit` are the way out of a conflicted
tree; trapping an agent between a rebase it cannot finish and one it cannot
abandon is worse than any staleness. Both were denied by the first version, and
the first of them meant that on `master`, where the branch's own counterpart IS
`origin/master`, the commonest command in this repo was refused every time master
advanced.

`BRANCH_FRESHNESS_OVERRIDE=1` is the escape hatch, honoured both as an exported
variable and as a TOKEN of the parsed command - never as a raw-payload substring,
which any prose naming the variable could satisfy, including the agent-written
`description` field, on a guard whose own message teaches that exact string.
`git push` is deliberately not an arm: git refuses that case itself, legibly, and
that refusal is what ended the incident.

Three helpers move into `lib/hook-common.sh` rather than being copied. The
tokeniser now emits each git invocation's ARGUMENTS as well as its subcommand,
because the exemptions above need the flags and refs it was discarding and
re-tokenising in the caller is what that file exists to prevent;
`hook_git_runs_any` answers "merge or rebase" in one interpreter spawn instead of
two; and `hook_throttle_expired` owns the now/mtime/shape-guard/compare triad
this was becoming the third copy of.

FOUR REVIEW PASSES, AND THEY EARNED THEIR KEEP. Between them they found that the
guard denied its own remedy, trapped a conflicted rebase, took a substring for
its override, went silently dead on a broken interpreter, keyed its throttle
stamp so that every clone on the machine shared one - so one clone's session
start suppressed another's fetch, leaving it reading exactly the stale refs this
exists to refresh - cost several times its siblings on a path that runs on every
Bash call, and let a redirect target spoof an exemption because the argument walk
stopped at command separators while shlex also emits `>` as a token. All are
fixed here; `-s ours` defeating the remedy exemption is recorded in the header's
imprecision list instead, since an agent does not reach for it unprompted.

The self-test drives both arms, including the `SessionStart` half that produces
no output and is therefore the part most able to stop working invisibly: it
asserts the tracking ref actually moves, and that a second start inside the
throttle does not fetch. Every ALLOW case is paired with a DENY proving the same
path can still fire, because an allow-only suite is passed perfectly by a hook
that does nothing - which is precisely the shape this one would fail into, since
every guard in it exits silent when it cannot answer. The regression cases were
verified as true negative controls: reverting a fix alone, fixtures left in
place, turns them red.

One fix caught another. The interpreter guard was first written as
`command -v python3`, and the new self-test case defeated it immediately - that
is an existence test, and an interpreter present on PATH but exiting non-zero
passes it while the guard goes quietly dead. It now runs `python3 -c ''`, the
same probe-do-not-assume reasoning `hook-common.sh` already applies to `stat`.
The same existence-not-works form remains in the other hooks and in
`bin/check-pr-analysis-surfaces.sh`, with the identical class already written up
for `node` elsewhere in `bin/`; that sweep is deliberately left as a separate
decision rather than smuggled in here.

`AGENTS.md` gains the rule in one line plus its enforcer's name, because Codex
and anything else that reads it get no hooks at all.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
One conflict, and it is a real one: master and this branch both changed how the
Reactor subscription terminates, for unrelated reasons that have to compose.

Master's `fix(reactor) #342` replaced the two-argument
`Flux.subscribe(onNext, onError)` with the three-argument form. The two-argument
overload has no completion callback, so `onComplete` - the method that retires
the record - was wired as the ON NEXT consumer: a Publisher emitting several
elements retired its record once per element, and one completing empty
(`Mono.empty()`, or a user function returning null) retired it never, leaking the
record's in-flight accounting and, since the dispatch ceiling landed, its
dispatch permit for the life of the process.

This branch wrapped both of those callbacks in an MDC scope, because they run on
the Reactor scheduler rather than the worker thread that captured the caller's
context.

The resolution keeps both: master's three-argument shape, with each TERMINAL
callback body inside the scope. Dropping either side is clearly wrong - master's
half prevents a wedged engine, this branch's half is the feature - so this is a
composition rather than a choice between them.

One judgement call inside it: the element consumer is left unwrapped. It is
neither the user's function nor terminal handling, which is the boundary this
propagation covers and says so on the wrapper above it, and the `doOnNext` trace
in the same chain is unwrapped for the same reason. Recorded in the code next to
the decision rather than only here.

Each side keeps its own pin, and both are green after the merge:
`ReactorPCTest#anEmptyPublisherStillRetiresTheRecord`, which master's commit
message records as red against the two-argument subscribe, and
`ReactorMdcPropagationTest`. A merge that satisfied only one of them would not
have shown up as a conflict.
…efore its log expires

`ChaosChurnStormIT.churnStormMeetsSlosAndBalancesLedger` was killed fail-fast by
the probe on this branch's CI, with the same `ZOMBIE_MEMBER/REBALANCE_BLOCKED`
autopsy as the fourth, fifth and eighth entries in the family ledger - a group
dwelling the full 15s bound in PreparingRebalance with a member not answering the
protocol, and the whole assignment frozen for well over two minutes rather than a
single shard.

Recorded now because the ledger's own closing argument applies exactly: the
sighting is easy to lose. The red belongs to a head that will not be the tip for
long, the log expires, and the seed goes with it - which is how the entry above
this one describes #345 losing its capture entirely.

THE REASON THIS ONE IS NOT JUST ANOTHER TALLY MARK. Every previous capture of
this arm predates the dispatch ceiling, which landed on master hours before this
run. The commit immediately after the ceiling says in its own body that a leaked
dispatch permit now takes the engine to a full stop rather than a stuck record,
and a member that has stopped answering the rebalance protocol is what that would
look like from outside. So the old intermittency and a new cause are both
consistent with this autopsy, and the probe output cannot separate them.

The entry says what would settle it, since nothing here does: replay the recorded
seed at the ceiling commit and at its parent. Same seed, different position, which
is the control this file keeps asking for and rarely gets.

No test is quarantined and no assertion is touched. This commit adds a record and
nothing else - the failing test is left failing, because a flake that fails the
build is the deliberate design and the lever for changing that is quarantine with
evidence, not a retry.
…what this file already settled

The seventeenth sighting was written from the autopsy and a grep for the
signature, without reading the entries it was joining. It therefore offered the
dispatch ceiling as a co-equal explanation - "equally consistent, and the two are
not distinguishable" - against a finding this file has built over several
entries and which is far better evidenced than one capture.

What it walked past: the eleventh sighting concluded the reds are seed-dependent
rather than branch-dependent; the fourteenth caught three of them on a branch
whose whole diff was markdown, a comment and one `iterations` value, with no
`src/main` file anywhere, and pointed at the box or at master; the
runner-contention hypothesis was ruled out there on timing rather than left
unreplayed; and the pair of runs one commit apart at the end of the file states
outright that the trigger is the schedule, not the tree. A capture on a branch
that had just merged master is what all of that predicts.

The ceiling is still worth naming, because a variable genuinely changed
underneath and every previous capture of this arm predates it. But it is a
question to rule out the way contention was ruled out - explicitly, with evidence
- not a rival diagnosis. The entry now says so, and says the control is the same
seed replay every entry here asks for, in the same-seed-different-position form
that separates the two.

Also corrected: the entry implied the red mattered to the PR. It does not.
`Chaos Pain Suite` is not in master's required-checks ruleset, which the
fourteenth sighting already records, so the capture gates nothing. It is written
down because the log expires and the seed is the asset.

The lesson is the one this repo already has a rule for and I did not follow:
prior art is not a grep for the symptom. Grepping the signature found the
matching entries; only reading them found the conclusions those entries had
already reached.

@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

One conflict, in `docs/inflight/bug-857-family.md`, and it is an add/add: master
and this branch each appended a new entry immediately above `## Delete when`.
Both are kept - they are independent captures of different arms.

Order matters more than it looks. The `## 2026-08-26, Nth capture` sections are
one continuous narrative about the BLOCKED-on-monitor discriminator, and this
branch's sighting - a `ZOMBIE_MEMBER` capture - had landed between the third and
fourth of them, splitting the series. Master's fourth capture now follows the
third, and the sighting sits after it, which is also the correct recording order.

One line of the sighting is corrected by what arrived. It cited the fourteenth
sighting's "points at the box or at master" as a live explanation; master's
fourth capture closes the ambient half of that outright - `Chaos Pain Suite` now
runs one job per VM, so co-residency between two chaos runs is structurally
impossible. The sighting now says so and cites the capture above it rather than
resting on a superseded reading.

Also inherited and checked rather than assumed: master's
`fix(core) #322` rejects a `PCModule` getter that memoises a collaborator
while taking that collaborator's owner as a parameter, and says it swept the class
for the same shape. `mdcPropagation()`, added by this branch after that sweep,
takes no owner parameter - it memoises off `options()`, the same shape as
`pcMetrics()` - so it is outside the defect class rather than an instance of it
the sweep could not have seen.

Nothing else conflicted. Compile clean, and the tests that pin both sides of the
earlier Reactor composition still pass: `ReactorPCTest` including
`anEmptyPublisherStillRetiresTheRecord`, and the MDC suites across core, vert.x,
Reactor and Mutiny.
…dings land where nothing can read them

Capture only - no implementation, deliberately.

#371 fixed the PIT lane and #344 was the first PR whose core
changes it could actually score: 34 mutants, 30 killed, 88% test strength,
four survivors. Recovering which four cost a ~25-minute local re-run and a
hand-written mutations.xml parser, because the survivor table is written only
to $GITHUB_STEP_SUMMARY and the REST API does not expose it.

Two notes:

ci-mutation-survivor-list-is-unreadable.md - where the table is lost (the
script builds it complete, then emits it through summary() and nowhere else),
and three fixes cheapest-first: echo to stdout, upload mutations.xml as an
artifact, emit annotations on the diff. Recommends the first two together and
deliberately holds back the third, because annotations change what every
reviewer sees on a lane that is non-gating on purpose. bin/check-pr-analysis-
surfaces.sh already lists this table under "surfaces this script cannot read",
so the gap was documented before the lane produced anything worth reading.

test-partitionstate-mutation-survivors.md - the findings themselves, with the
command to re-derive them rather than a tally to trust. The survivor on
#344's own new code is the conditional boundary in
getIncompleteOffsetsBelow, and the note argues it is an EQUIVALENT mutant
rather than a missing test: the bound is a sample of offsetHighestSucceeded
and a succeeded offset is by construction absent from incompleteOffsets, so
`<` and `<=` cannot differ while that invariant holds. The useful response is
to pin the invariant if anything, not the boundary - writing a test to kill an
equivalent mutant is how a suite acquires assertions describing the
implementation instead of the contract.

The wider sweep's real gaps are elsewhere and predate #344: metrics
teardown is entirely unasserted, the back-pressure ratio arithmetic is
unpinned, and several state predicates survive being replaced with a constant.
That is a coherent piece of work and a better use of the lane than chasing
individual survivors.

Why this matters beyond convenience: a survivor is not self-evidently a test
gap, and telling a real gap from an equivalent mutant is the whole judgement
the lane exists to support. A reader who cannot retrieve the list cannot make
it, so the lane degrades to a percentage that says nothing about what the
missing percentage is.
@astubbs
astubbs marked this pull request as ready for review August 26, 2026 23:54
Master carried three things addressed at exactly this merge, and two of them
overturn edits made on this branch. Taking the inherited decisions, and recording
what is being overridden so the next reader does not take it for an oversight.

THE SWEEP ROSTER IS A RECORD, NOT A WORKLIST. This branch had deleted its own row
from the package-rename roster and written a paragraph explaining the blank,
because the self-reference gate flagged the row. Master's `docs #120`
settles it the other way: the roster is the set of open PRs at the time the plan
was written, so a row whose PR has since merged records what the sweep was scoped
to cover and needs no edit - and it wraps the whole table in the checked markers,
which satisfies the gate for every row at once. Master's version is taken whole;
the deletion and its paragraph are gone.

THE SIGHTING RENUMBERS, THE EXISTING ONES DO NOT. Master added three
`CLASS2_STALL` sightings while this was open, taking the ordinals through
nineteen, and says why they cannot move: their numbers are cited from two other
notes and from inside the ledger. So this branch's `ZOMBIE_MEMBER` capture becomes
the twentieth. Its cross-reference to "the fourth capture immediately above" is
loosened, since a fifth capture has since landed between them, and its claim that
`Chaos Pain Suite` gates nothing is corrected: master's fifth capture records it
as required and gating, which is the opposite of what the fourteenth sighting
said, and master's reading is the current one. Master's standing advice in the
same commit is the reason none of this is load-bearing - cite the seed, never the
ordinal.

THE MANIFEST ENTRY IS SET BEFORE THE MERGE, NOT AFTER.
`tooling(upstream-map) #204` introduces the rule and a guard that insists:
write `merged` in the branch and push it, because branch content is visible to
nobody until it lands and is correct the moment it does, whereas the other order
leaves the manifest lying until somebody remembers. This entry moves to `merged`
accordingly.

Also settled, and recorded where it will be re-read rather than only here: the
`propagateMdc` default. It was the one open decision this work carried, flagged
as the maintainer's to overrule; Antony confirmed default-on at merge prep. The
note now says it is decided rather than proposed, and says the residual pinning
risk was what was put to him and taken - so the risk alone is not grounds to
reopen it.

No code conflicted. Compile clean, and the MDC suites across core, vert.x, Reactor
and Mutiny still pass alongside `ReactorPCTest`, which pins the other half of the
earlier Reactor composition.
… as corroboration not a control

`ChaosRevokeUnderWorkDrainIT` went red on this branch's CI with the
BLOCKED-on-monitor discriminator: the poll thread parked acquiring the
`commitCommand` monitor, held by that instance's own control thread, reached
through `commitOffsetsThatAreReady` from `onPartitionsRevoked`. Same monitor,
same holder, same method pair as the five captures above it.

FILED AS WEAKER EVIDENCE ON PURPOSE. The frames read `:1639` / `:573` rather than
master's `:1585` / `:548`, and this time the shift is the branch's own - this work
edits `AbstractParallelEoSStreamProcessor` to wrap the pool submit in an MDC
scope, which moves everything below it. Resolved against this branch's copy the
pair is identical, matched by method and monitor the way the fifth capture
instructs rather than by line number. But a branch that edits the file cannot
rule itself out the way #346 and #374 could, so this adds another
arm-and-holder match and no independent evidence about cause. The fourth capture
already draws that distinction for #267 and this follows it.

IT IS NOT THE FLAKE, AND THE ENTRY SAYS SO. The same branch produced a
`ZOMBIE_MEMBER` capture on an earlier head, recorded below as a sighting with its
own standing seed-dependent explanation. Different probe, different failure mode.
Reading any red `Chaos Pain Suite` on this branch as "the flake" would merge the
two, and only the monitor-and-holder match separates them - the discriminator is
the live defect.

Seed `818084281700661522`, recorded with its replay command.

RETRIEVAL DECIDED WHAT THIS ENTRY COULD SAY, so it is recorded too. The job log is
large, and `gh-run-view-log-truncation.md` documents three occasions where a
truncated fetch produced a published-and-wrong diagnosis - one of them to a reader
who had that document open. The autopsy here came from the uploaded
`chaos-suite-reports-*` artifact, route 1 in that file, which survives
server-side stream truncation because the autopsy is `system-out` inside the
failsafe XML. Seed and both frames came out intact.

Also repaired: the `ZOMBIE_MEMBER` sighting below lost its opening
`post-merge: checked-begin` when this file was rebuilt from master's copy during
an earlier merge, leaving an unmatched `checked-end` and three self-references
the gate could no longer see as attested. Begin and end markers now balance.
…idence about

A capture that names a defect but not its fix makes the next reader re-derive the
link, and this file has enough entries that re-deriving it is not free. #29
is the open draft that replaces the `synchronized (commitCommand)` acquisition in
the captured frames with `ReentrantLock.tryLock()`, so it targets exactly the pair
the capture records.

Stated as what it makes possible rather than as a cross-reference: the seed joins
the set this file has been accumulating for the verification it declared before
the fact - replay with the tryLock applied and read whether the poll thread is
still BLOCKED on that monitor. Landing the fix then tests the prediction instead
of merely following it.
Master had already recorded this branch's own chaos capture, so the entry written
here is deleted rather than kept alongside it.

THE DUPLICATE. The sixth BLOCKED-on-monitor capture was written up on this branch
from the failsafe artifact; master's `## 2026-08-27` section records the same run,
the same seed `818084281700661522`, the same frames, and reaches the same reading
- corroboration rather than a clean control, because this branch edits
`AbstractParallelEoSStreamProcessor` and so cannot rule itself out. Master's
version is also the better one: it sits inside a pairing analysis that reads two
PRs' reds ten minutes apart, on per-PR VMs where co-residency is impossible, with
master green between them - which is a claim neither capture supports alone.

So this keeps master's and drops the local one whole. AGENTS.md's rule is that a
fact stated twice drifts apart, and the owner is whichever copy the rest of the
file is written around. Nothing is lost: the seed, the frames, the
match-by-method-and-monitor instruction and the not-a-control caveat are all in
master's paragraph already.

The `ZOMBIE_MEMBER` sighting on this branch is NOT a duplicate and stays - a
different run, a different seed, a different arm from the discriminator, which is
the distinction that whole entry exists to draw.

THE GATE CAUGHT A REFERENCE MASTER COULD NOT SEE. Master's paragraph cited this
work by BRANCH NAME, and a branch name stops resolving the moment the branch is
deleted. `check-branch-self-reference.sh` only ever inspects the branch it is run
on, so it never fired for whoever wrote that line and fired immediately here. The
reference now names the PR, which is permanent, and the paragraph is attested.
That is the gate working as designed rather than an inconvenience: the reference
would have rotted on merge, silently, in a file people navigate by citation.
@astubbs
astubbs merged commit 15a23de into master Aug 27, 2026
31 checks passed
@astubbs
astubbs deleted the feat/mdc-context-propagation branch August 27, 2026 02:12
astubbs added a commit that referenced this pull request Sep 1, 2026
…t as open

Both release notes still described MDC context as un-captured at submit time - "no
`copyOfContextMap` anywhere". #205 merged on 2026-08-27 (commit 15a23de) and added
`internal/MdcPropagation.java`, which captures the caller's map on the submitting thread and
restores the worker's own on the way out. So the claim was false on both pages, and this
branch made it worse: 5694c55 rewrote the blockers bullet, re-asserted "two are still
open", and attested the paragraph `post-merge: checked` - the attestation covered the tense,
which was the thing being checked, and carried the stale fact through with it.

That is the failure docs/inflight/AGENTS.md's "track only what is currently OPEN" exists to
stop, arriving in the one file a reader consults to decide whether 0.6.0.0 can be cut. A
release operator reading it would have gone looking for an MDC fix that shipped four days
earlier.

- `release-0600-blockers.md`: the #197 triage bullet now names the one item still
  open (#155, fix on #201) and the landed ones by the PR that closed each -
  #217, #205, #199. The live tally is gone: "two are still open" is a
  count, which that doc forbids precisely because it rots without anything going red, and
  this is the second time this bullet's count has been wrong.
- `release-0.6.0.0.md`: the MDC entry is deleted rather than rewritten as fixed - the
  directory's rule is that making a stale entry accurate is the wrong move. Nothing is lost:
  the blockers file now names #205, and #195, the mirror that raised it,
  already has its own line in the release sweep.

Also names `CHANGELOG.adoc` where docs/releasing.md said "every section of this file". The
bullet sits inside docs/releasing.md, so "this file" read as the wrong one; the renderer
self-test walks the changelog, not this doc.

Verified: bin/check-all.sh 15/15, and check-branch-self-reference still passes over the
rewritten paragraph.
astubbs added a commit that referenced this pull request Sep 1, 2026
docs/inflight/branch-mdc-context-propagation.md carries
`post-merge: exempt-file - ... it is deleted when that PR lands`. Its PR,
#205, merged on 2026-08-27 and did not delete it, so the marker has been
sitting on master reading as live for five days - exactly what
docs/inflight/AGENTS.md predicts:

    Never leave a "delete this when #NN merges" marker on master. The merge is
    exactly when nobody is looking here, so the marker outlives the work and the
    next reader inherits a stale note that reads as live.

WHY THIS RIDES ON #203 rather than becoming its own PR: this PR just
retired its own instance of the same defect (f029828, pr-log-verbosity.md), and
the same-defect sweep the merge checklist requires - "before merging a fix, look
for other instances of the same defect" - is what turned this one up. Landing the
sweep's finding beside the fix is the sweep working, not scope creep. Antony asked
for it here.

The note's own subject has already shipped, so "what landed" is now just a
description of code. Took the directory's four outcomes in order; every symbol it
names was re-grepped and still resolves (MdcPropagation, PCModule.mdcPropagation,
ParallelConsumerOptions.propagateMdc, MdcContextPropagationTest, MdcBoundaryProbe,
captureCallersDiagnosticContext, supervisorLoop), under the bz.stub package.

MIGRATED, because it outlives the note and nothing owned it:

- The default-on DECISION, with its reasoning, onto ParallelConsumerOptions'
  propagateMdc javadoc. The option said "On by default"; it did not say why, nor
  that the choice is settled. Carried forward as settled - not propagating fails
  silently for everyone, propagating fails visibly and has a kill switch, and the
  pinning risk was put to Antony at merge prep with that mitigation and taken.
  Flipping it takes evidence of the pinning biting, not a re-reading of the trade.
- The KNOWN GAP on the reactive engines, same javadoc, because it is the only
  user-facing item in the note and the option is where a user reads about
  propagation. `grep -rni "context-propagation|micrometer"` found it stated nowhere
  outside the note: Reactor/Mutiny propagation covers the user function's
  invocation and PC's terminal signal handling, not the operators of a returned
  Publisher/Uni on further schedulers, which needs io.micrometer:context-propagation
  and is the user's call.
- The ONCE-PER-INSTANCE guarantee for the startup INFO line, onto
  captureCallersDiagnosticContext's javadoc. That javadoc already said where the
  method is called from; it did not say the once-per-instance property is
  STRUCTURAL - supervisorLoop is the only caller and throws IllegalStateException
  on a second poll* - nor that moving the line to a per-batch path would be a
  regression, which is the part a future change needs to meet.
- The MEASUREMENT behind the zero-allocation claim, onto MdcPropagation's class
  javadoc, next to the claim it supports rather than into docs/solutions/. That
  directory is for solved problems; this is evidence for a design claim, and the
  claim is what a reader is standing in front of when they want it. The
  binding-specific caveat came with it - the zero is logback's MDCAdapter returning
  null for an empty context, and a binding returning an empty map would allocate
  one small map per batch, so re-measure before repeating the claim elsewhere.
  The pinned logback version was dropped in the move: the caveat is about the
  binding family, and a version in javadoc goes stale silently.
- The RED-VERIFICATION for the three engine tests, onto MdcBoundaryProbe's javadoc
  - the one place all three already @see. Each was run with its module's
  initAsyncConsumer(..) overridden to propagateMdc(false) and fails on
  assertCallersContextWasVisible. The probe now says to redo that override if the
  propagation or isolation logic changes, and points at the core test's javadoc for
  the worker-pool equivalent.

CONFIRMED ALREADY OWNED, so it dies with the note rather than being restated:

- PC's own keys winning a collision - MdcPropagation's "Precedence" paragraph
  states it and why (PC's log lines are read by those keys), and the option javadoc
  names pcId and offset.
- Capture at poll* time rather than per record, AND the reason - the
  captureCallersDiagnosticContext javadoc gives it verbatim: that is the only
  moment the caller's context is reachable, since PC's threads do not inherit it
  and the SLF4J MDC is not inheritable.
- The pinning consequence - the option javadoc has it, so the note's own claim that
  it is "documented on the option" checks out. Keys-only-at-INFO, and that it is
  logged so an accidental pin is discoverable, is the comment inside
  captureCallersDiagnosticContext.
- propagateMdc=false being an exact revert including the pre-existing pooled-thread
  leak - the option javadoc's last paragraph.
- Which boundaries are covered, and that the controller and broker poller adopt()
  outright - the option javadoc and MdcPropagation#adopt's javadoc respectively.
- The core leak-on-reuse test being known to go red, with the flip instruction -
  MdcContextPropagationTest's class javadoc, verbatim.
- Composition-not-inheritance for the engine tests, and why the per-engine
  assertions stay - MdcBoundaryProbe's class javadoc, verbatim.
- The fork/upstream mapping (#195 mirroring confluentinc#907, raised on
  #197) - the mdc-context-propagation entry in upstream-map.yaml, plus
  MdcContextPropagationTest's javadoc.

Nothing transient survives: "branch feat/mdc-context-propagation exists" is
`git branch`'s answer, not a file's.

ALSO CORRECTED, found by the same read: the upstream-map.yaml entry still said the
default was "NOT yet signed off by the maintainer; see the PR body" - untrue since
merge prep, and it pointed at a merged PR's body for a risk that now lives on the
option's javadoc. The manifest owns the fork side of this mapping, so a wrong claim
there passes every check and rots. Fixed in place, carrying the decision forward as
settled.

No CHANGELOG entry, by policy. Nothing in the tree cited the note:
`grep -rn branch-mdc-context-propagation` over the worktree is empty.

Verified locally: bin/check-all.sh 15 ran / 15 passed / 0 failed (including
check-file-refs, check-inflight-tags, check-issue-refs, check-copyright-headers,
check-upstream-map); bin/todo-index.sh --check up to date; javadoc:javadoc on core
clean for every link added; core unit suite unchanged at 546 run / 0 failures /
0 errors / 8 skipped. No main or test code behaviour changed - javadoc and one
manifest sentence only.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CMeraeBL2ycXVHEaTHM86W
astubbs added a commit that referenced this pull request Sep 2, 2026
…lure log lines (#203)

Two log lines interpolated a whole polled record batch, so each grew with max.poll.records and
with the assigned partition count until log tooling truncated away the part the line existed to
report. Closes #169 (confluentinc#631) and #170 (confluentinc#640).

- RemovedPartitionState.maybeRegisterNewPollBatchAsWork logged the entire RecordsAndEpoch at
  WARN. It now logs the topic-partition, record count, offset range and epoch at poll - what an
  operator needs to tie the drop to a rebalance.
- The user-function failure line logged the whole PollContextInternal, which renders every
  record with its keys and values. It now logs a summary of the same shape.

Nothing is lost: the unabridged object moved one level down to DEBUG, so it has to be asked for
rather than shipped on every occurrence.

HOW. The formatting lives in one place, RecordBatchSummary, rather than two ad-hoc format
strings. It names at most five partitions before collapsing the rest to a count, so the line has
a fixed ceiling regardless of batch size or assignment size - which a plain "log the count too"
would not give on a consumer holding thousands of partitions. The bound is O(1) in the batch
but linear in the topic name; a test replays the batch under Kafka's 249-character maximum
topic name, which the first version of the bound assertion would have failed. Both new
assertions read the emitted line, not the format string, and each was proven to discriminate by
reverting its production line.

The DEBUG dump sits INSIDE ThrowableUtils.logWithoutEscaping, below the error line, and that
placement is load-bearing: rendering PollContextInternal calls toString() on user keys and
values on the failure path, which is the hazard logWithoutEscaping exists to contain, and moved
above the error line a throwing toString() would suppress the report itself. SLF4J's
safeObjectAppend is an independent second layer; both are written down beside the call.

WHAT REVIEW CHANGED. The summary was first built unconditionally inside the lambda and handed
to log.debug on the PCRetriableException arm - PC's designed retry signal, driven at full
processing rate by a downstream outage - and summariseForLog walks the whole batch. Now built
per arm behind isDebugEnabled(). RecordBatchSummary no longer boxes every offset into a List to
take min and max: one primitive pass, 1M records 40 ms to 14 ms, all 26 probe inputs rendering
byte-identically. A dead trailing exception argument that MessageFormatter silently trimmed is
gone. The PCRetriableException arm went from log.debug to log.trace: retries are the normal
path for a retrying consumer, and a DEBUG line per retry at rate was the original complaint in
a slower form.

TEST INFRASTRUCTURE. LogCapture is the shared helper for asserting on a class's emitted log
lines, restoring the level afterwards; its class javadoc owns the two obligations that make
raising a JVM-shared logger safe under thread parallelism. UserFunctionFailureLoggingTest is
@isolated for exactly that reason - its first run flooded the timing-sensitive shutdown tests
with DEBUG. Master's three headroom tests in AmbientProbeExtensionTest, written against raw
logback while this branch was in flight, are ported onto the helper: the merge had taken this
side's imports and master's bodies and compiled to nothing with no conflict reported.

MdcContextPropagationTest.anEmptyCallerContextIsHandledAndNothingLeaks failed 2 of 2 full runs
on this tree and on #201's CI while passing elsewhere. Not a product flake: it asserted,
as a precondition, that the JUnit runner thread arrives with a null MDC, on a thread every class
in the fork shares. Bisected to ProducerManagerTest and TransactionalBulkCommitTest, which drive
processWorkCompleteMailBox on that thread; logback's remove of the last key leaves {} where
clear() gives null, both measured. The test now establishes its precondition with a @beforeeach
clear. Write-up in docs/solutions/test-flakiness/, the inflight note that tracked the sighting
retired, the flake ledger updated. Also retired: the MDC context-propagation note #205
left live on master with a delete-on-merge marker, its content migrated to the javadoc of the
code it described.

The defect class is wider than these two lines. Eight sites render a collection or a state
object into a log line, including PartitionStateManager rendering PartitionState at WARN where
Lombok's @tostring prints every tracked record; they are recorded with greppable anchors in
docs/inflight/bug-unbounded-log-lines.md for their own change.

Upstream-Issue: confluentinc#631
Upstream-Issue: confluentinc#640
Forwarded: not-needed
Applied-Upstream: no

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CMeraeBL2ycXVHEaTHM86W
astubbs added a commit that referenced this pull request Sep 2, 2026
…landed on both sides

#201 squash-merged while this branch carried the same two release notes with a fresher
MDC state. Both hunks were the same fact from two directions: master had dropped the load-factor
bullet as "now #201" but still carried the stale "MDC is not captured" claim this branch
had already corrected (#205 landed it). Resolved to the state that is true now that both
have merged - the triage list is recorded as landed in the blockers note, and the release note's
"bugs found while triaging" section, which had nothing open left in it, is removed along with its
heading, which nothing cites.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CMeraeBL2ycXVHEaTHM86W
astubbs added a commit that referenced this pull request Sep 3, 2026
#329)

The Reactor engine now promises, in its javadoc, that a record succeeds
when its publisher completes and fails when it errors - the items emitted
in between are the user's, and the engine neither counts nor inspects
them. This lands the test suite that pins that promise, and the solutions
write-up that records the defect class it guards against.

The defect: a user function returning a publisher that emits nothing -
Mono.empty(), a Mono<Void> from Mono.fromRunnable(..), a Flux whose filter
removed everything - left its record in flight forever. In-flight filled to
maxConcurrency, back-pressure halted selection, and the consumer stopped
with no exception, no failed record and nothing in the log.
ReactorProcessor#react subscribed with Flux#subscribe(Consumer, Consumer),
which takes onNext and onError, so completion was only ever reached by an
emitted item - and a publisher emitting several items ran the success path
once per item, corrupting the in-flight counter the engine throttles on.

This branch found and fixed that independently; master then landed the
same three-argument subscribe via #342, wrapped in
the MDC propagation from #205, with a single
regression test for the empty Mono. What lands here on top of that:

- ReactorEmptyPublisherTest: empty Mono, Mono<Void> from a runnable, empty
  Flux, a single-item control, the multi-item case, and an erroring
  publisher as a second control. Every case asserts two numbers, because
  the committed offset alone cannot tell a stall from a slow run: the
  user-function invocation count pins at exactly maxConcurrency when
  completed records are not being released. The suite runs with
  maxConcurrency deliberately below the record count; at the module's usual
  cap the defect looks like nothing worse than a missing commit. The
  multi-item case asserts in-flight returns to zero, which is what catches
  over-completion - a commit cannot see it. Both controls were green before
  the fix, so a change that broke completion outright could not pass as
  success.
- ReactorUnitTestBase gains overridable maxConcurrency and commit mode so
  the suite reuses the harness instead of forking it.
- The react(..) javadoc states the completion contract.
- docs/solutions records the defect class - a reactive subscribe whose
  terminal action is wired to the wrong signal - the invocation-count tell,
  and the sweep.

Mutiny was the counterexample that made this a Reactor defect rather than
an ExternalEngine one: MutinyProcessor#onRecord already subscribed with an
explicit completion callback, and the two engines are offered as
interchangeable, so they must agree on whether "produced no value" means
"succeeded". The defect-class sweep over every .subscribe( in the tree
found no other instance: Vert.x uses Future#onSuccess, which fires once
even on a null result, and the remaining hits are topic subscriptions with
no completion signal to mis-wire.

Not settled, and deliberately kept out of the solutions doc: the path by
which pre-fix duplicate completions were only partly absorbed - every
duplicate reaches onComplete, yet in-flight settled at one rather than
being driven negative. The corrupt end state is asserted against; the
absorption path is not.

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

#476 vetted every open note and touched five this branch also
edits. Three conflicted and each is resolved on the side that reflects
the later decision:

- release-0600-blockers.md: deleted here, modified there. Kept deleted;
  the two corrections the sweep made to it are folded into the
  burn-down's tag-day checks. One of them is only half right and is
  recorded as such: release.yml does build a notes file from the
  changelog (#72), but its exact heading match fails on the
  "(unreleased)" suffix and falls back to generated notes, which is what
  #199 fixes. The sweep's "the MDC gap is real" is refuted on the
  tree - MdcPropagation captures and restores the caller's context since
  #205 - so the burn-down keeps that correction.
- release-experimental-module-records.md: the 2026-09-07 deferral wins
  over the sweep's vetted marker, per the per-note contract (a deferred
  note carries the state, not the marker).
- release-when-is-v6-good-enough.md: the sweep's dated "the date passed"
  paragraph and its stale vetted marker ("the question is still
  unanswered") are dropped; the rewritten note records the decisions
  and names the failure mode in its own words.

Also carried from the sweep: the citation to the poisoned-transaction
wedge note is repointed to the sibling #476 merged it into; the
burn-down now points at the sweep's own "what gates v6" list in
process-candidate-ranking.md and records where the two disagree (the
sweep reads the poisoned pair as not gating, and the batchSize
validate() bound as the cheapest real fix, which could ride in tier 1);
and the #44 exception is narrowed - #466 bounded the
revoke wait, so what #408 still owns is declining rather than
waiting.

Claude-Session: 460f7df9-dcc2-4b00-a9f9-62f3a2c6d5e4
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Sep 8, 2026
56 commits of master, none of which touched this PR's mechanism: master
changed neither `.github/workflows/release.yml`, `bin/release-notes.py`,
`bin/test-release-notes.sh` nor `.github/workflows/mutation-full-sweep.yml`
since the branch's last master merge, so the renderer and the workflow step
that calls it merge unchanged. Master's `release.yml` still carries the inline
`awk`/`sed` converter this PR replaces.

Master also changed six of the files this PR touches. Four auto-merged:
`docs/releasing.md` and `bin/AGENTS.md` (#457's job batching, #442's
integration sharding), `.gitignore` (#378, #440), and
`docs/inflight/release-0.6.0.0.md` (#448, #476). Two conflicted.

`docs/inflight/release-0600-blockers.md` - the #197 triage bullet, inside
the `post-merge: checked` markers. This branch (2026-09-01, 2026-09-03) rewrote it
in post-merge terms as "all four landed"; master's grooming sweep (#476,
2026-09-08, correcting on 2026-09-07) rewrote the same bullet to say the
empty-release-body item **was already false when written** - #72 gave the
workflow a `--notes-file` built from the `CHANGELOG.adoc` section on 2026-07-29,
with `--generate-notes` only as a fallback. Master's correction is right and is
the later decision, so it is kept; master's claim that MDC is still open is not -
#205 merged 2026-08-27, which is why this branch corrected it, and that
correction is kept. Resolved as one bullet carrying both later facts, and it now
states what #199 actually does (replace the inline converter, and fail the
release on a missing or unrenderable section) rather than the retired claim that
it restores a body that was never absent.

`docs/refactoring.md` - two unrelated new sections appended at the same point.
Both kept: this branch's "`bin/release-notes.py` is Python in a Node-default
`bin/`" and master's "JUnit tag resolution is implemented twice". No content
from either side dropped.

Neither `--ours` nor `--theirs` was used.

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