Skip to content

Java 17 - #2

Closed
astubbs wants to merge 23 commits into
masterfrom
java-17
Closed

astubbs wants to merge 23 commits into
masterfrom
java-17

Conversation

@astubbs

@astubbs astubbs commented May 5, 2022 •

Copy link
Copy Markdown
Owner

No description provided.

Comment thread pom.xml
</dependency>

<!-- Build dependency -->
<dependency>

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.

possible to use old path version instead?

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

...

@astubbs astubbs closed this May 9, 2022
@astubbs
astubbs deleted the java-17 branch May 9, 2022 14:30
astubbs added a commit that referenced this pull request Apr 16, 2026
Root-causes rather than excludes. Two categories of real test bugs that
PIT's slower instrumented JVM and different test ordering surfaced:

1. Broken teardown override hiding base-class cleanup.
   ParallelEoSSStreamProcessorRebalancedTest overrode @AfterEach close()
   with an empty body. Each parameterised invocation created a new
   ParallelEoSStreamProcessor that was never closed and never triggered
   the base class's Awaitility.reset(). By invocation #2, accumulated
   resource pressure broke timing. Fix: delete the override so the base
   class's close() runs.

2. Standalone tests skipping base-class cleanup + tight margins.
   MockConsumerTestWithSaslAuthenticationException and ProducerManagerTest
   don't extend AbstractParallelEoSStreamProcessorTestBase, so they got
   no Awaitility.reset() or pc cleanup. The SASL test additionally mutated
   the global (shaded) Awaitility default timeout without resetting.
   Fixes:
   - MockConsumerTestWithSaslAuthenticationException: scope timeout
     locally (atMost(90s)) instead of setDefaultTimeout, and add
     @AfterEach closing parallelConsumer.
   - ProducerManagerTest: add @AfterEach with Awaitility.reset();
     bump commitLockAcquisitionTimeout 2s→10s; give the failing test's
     three bare await() calls and BlockedThreadAsserter explicit 20s
     timeouts instead of the 10s default (too tight under PIT).

3. PCMetricsTest.metricsRegisterBinding - two bare await() calls (lines
   94, 180) used Awaitility's 10s default, too tight for 1500 records
   through PC's pipeline under PIT instrumentation. Bumped to 120s to
   match the atMost budgets already used elsewhere in the same method.

Also drops -DexcludedTestClasses from the PIT maven command now that all
four tests pass their baseline. Base-class @AfterEach Awaitility.reset()
stays as a general leakage guard.

Verified all four classes' tests pass locally under Surefire
(10 tests, 0 failures, 1m 19s). PIT baseline will be verified by CI.

Closes #39

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Apr 20, 2026
Root-causes rather than excludes. Two categories of real test bugs that
PIT's slower instrumented JVM and different test ordering surfaced:

1. Broken teardown override hiding base-class cleanup.
   ParallelEoSSStreamProcessorRebalancedTest overrode @AfterEach close()
   with an empty body. Each parameterised invocation created a new
   ParallelEoSStreamProcessor that was never closed and never triggered
   the base class's Awaitility.reset(). By invocation #2, accumulated
   resource pressure broke timing. Fix: delete the override so the base
   class's close() runs.

2. Standalone tests skipping base-class cleanup + tight margins.
   MockConsumerTestWithSaslAuthenticationException and ProducerManagerTest
   don't extend AbstractParallelEoSStreamProcessorTestBase, so they got
   no Awaitility.reset() or pc cleanup. The SASL test additionally mutated
   the global (shaded) Awaitility default timeout without resetting.
   Fixes:
   - MockConsumerTestWithSaslAuthenticationException: scope timeout
     locally (atMost(90s)) instead of setDefaultTimeout, and add
     @AfterEach closing parallelConsumer.
   - ProducerManagerTest: add @AfterEach with Awaitility.reset();
     bump commitLockAcquisitionTimeout 2s→10s; give the failing test's
     three bare await() calls and BlockedThreadAsserter explicit 20s
     timeouts instead of the 10s default (too tight under PIT).

3. PCMetricsTest.metricsRegisterBinding - two bare await() calls (lines
   94, 180) used Awaitility's 10s default, too tight for 1500 records
   through PC's pipeline under PIT instrumentation. Bumped to 120s to
   match the atMost budgets already used elsewhere in the same method.

Also drops -DexcludedTestClasses from the PIT maven command now that all
four tests pass their baseline. Base-class @AfterEach Awaitility.reset()
stays as a general leakage guard.

Verified all four classes' tests pass locally under Surefire
(10 tests, 0 failures, 1m 19s). PIT baseline will be verified by CI.

Closes #39

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@claude claude Bot mentioned this pull request Jul 27, 2026
1 of 2 tasks
astubbs added a commit that referenced this pull request Jul 29, 2026
The docstring claimed the test verified the #57 OffsetMapCodecManager caching as well as the confluentinc#859 Set de-dup, but it only guards the de-dup. Confirmed by experiment: reverting the caching (Set intact) leaves it green, while reverting Set->List makes it fail. The caching effect is masked - the Set already collapses the duplicate registrations, and PartitionState constructs its own per-assignment OffsetMapCodecManager registering the same fixed-id meter regardless. Rewrite the docstring to scope it to the confluentinc#859 de-dup and explain why the caching cannot be asserted here; record in docs/refactoring.md that the caching lacks isolated coverage (no construction seam; redundant for the leak). Doc-only; test still green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
astubbs added a commit that referenced this pull request Aug 7, 2026
The reference gate requires any #NNN below the threshold to name its repo,
because the fork's numbering sits entirely inside upstream's range and a bare
number is a coin flip. It checks added lines only, so it never fired on text
nobody was editing - leaving the convention true of the files the original
work touched and false of the rest of the tree.

Two passes, on the same lines and so landing together:

- 366 bare references gain their repo. All 77 distinct numbers were resolved
  against BOTH repos first: 62 of them exist in each, meaning different
  things, so the classification is per-occurrence rather than per-number.
  #188 and #195 are fork mirror issues in the release notes
  while confluentinc#188 and confluentinc#195 are the upstream bugs cited in
  test comments in the same tree.
- 24 `upstream #NNN` uses become the owner form. That form passed the gate but
  names a relationship rather than a repository, and this fork is itself
  upstream to anyone who forks it.

Three sets are deliberately NOT prefixed, because they are not references:
author ordinals ("run #1", "produce #1/#2", "NUDGE #1/#2") annotating log
excerpts, reworded to plain numbers; the changelog gate's fixture, which
asserts that a *bare* #NN is not a citation and would have been destroyed by
qualifying it, so it moves above the threshold as a fake #999104; and
upstream-pr-analysis.adoc, which is exempt and written entirely in upstream
terms.

README link text keeps its qualifier even though the URL beside it already
names the repo - the gate can see a link target, a reader cannot, and this
fork has its own #12. Quoted upstream titles keep the quotation intact with
the number appended rather than having the owner inserted mid-title. README
is generated: the edit is in src/docs/README_TEMPLATE.adoc.

@tag("#355") becomes @tag("confluentinc#355"). Verified nothing selects on
that tag - no pom, workflow or script filters it - and both classes still
collect and pass.

The 14 upstream-derived Java files gain the "Modifications Copyright" line the
provenance-aware header check requires of any file changed since the fork
point.

docs/inflight/next-qualify-remaining-refs.md is deleted: this is everything it
tracked, and in-flight files do not outlive their work.

No behaviour change.
astubbs added a commit that referenced this pull request Aug 7, 2026
The reference gate requires any #NNN below the threshold to name its repo,
because the fork's numbering sits entirely inside upstream's range and a bare
number is a coin flip. It checks added lines only, so it never fired on text
nobody was editing - leaving the convention true of the files the original
work touched and false of the rest of the tree.

Two passes, on the same lines and so landing together:

- 366 bare references gain their repo. All 77 distinct numbers were resolved
  against BOTH repos first: 62 of them exist in each, meaning different
  things, so the classification is per-occurrence rather than per-number.
  #188 and #195 are fork mirror issues in the release notes
  while confluentinc#188 and confluentinc#195 are the upstream bugs cited in
  test comments in the same tree.
- 24 `upstream #NNN` uses become the owner form. That form passed the gate but
  names a relationship rather than a repository, and this fork is itself
  upstream to anyone who forks it.

Three sets are deliberately NOT prefixed, because they are not references:
author ordinals ("run #1", "produce #1/#2", "NUDGE #1/#2") annotating log
excerpts, reworded to plain numbers; the changelog gate's fixture, which
asserts that a *bare* #NN is not a citation and would have been destroyed by
qualifying it, so it moves above the threshold as a fake #999104; and
upstream-pr-analysis.adoc, which is exempt and written entirely in upstream
terms.

README link text keeps its qualifier even though the URL beside it already
names the repo - the gate can see a link target, a reader cannot, and this
fork has its own #12. Quoted upstream titles keep the quotation intact with
the number appended rather than having the owner inserted mid-title. README
is generated: the edit is in src/docs/README_TEMPLATE.adoc.

@tag("#355") becomes @tag("confluentinc#355"). Verified nothing selects on
that tag - no pom, workflow or script filters it - and both classes still
collect and pass.

The 14 upstream-derived Java files gain the "Modifications Copyright" line the
provenance-aware header check requires of any file changed since the fork
point.

docs/inflight/next-qualify-remaining-refs.md is deleted: this is everything it
tracked, and in-flight files do not outlive their work.

No behaviour change.
astubbs added a commit that referenced this pull request Aug 25, 2026
…ts own seams

The review's remaining two mechanical findings (#2, #11). MockConsumerCommitFailureSeamTest
had grown to 1456 lines and 27 flat test methods, and PMD CPD/jscpd flagged its repeated
setup and Awaitility blocks as this PR's largest new duplication.

Now: MockConsumerCommitFailureSeamTestBase owns the fixture (failing MockConsumer factory,
RecordingHandler, startPc overloads, latching feed, teardown, awaitAsserted and the CONTINUE
opening helpers), and five classes own one seam each - Decision (10), HandlerFreeExits (4),
PauseIntake (5), DeferralEscalation (5), Metrics (3). All 27 tests survive with assertions
byte-for-byte intact; the base keeps the documented decision NOT to extend
MockConsumerTestBase. ParallelConsumerOptionsCommitFailureTest's twin assertThrows blocks
collapse into one assertAsyncRejects helper. The deliberate
ConsumerManagerCommitRetryBudgetTest/ProducerManagerCommitBudgetTest mirror is untouched.

Verified: 27/27 across the five classes plus options/symptom suites, maven exit 0;
copyright, issue-ref and file-ref gates green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016jCtV2yqQvxDR6cLML8J8a
astubbs added a commit that referenced this pull request Sep 2, 2026
…n class, and resolve the transactional id once per instance

The structure findings #18, #14 and #30 of the #410
review; #2 is deferred to docs/refactoring.md with the reason.

- The ledger moves out of PartitionState into a package-private
  UncommittedCompletions: the map, the in-commit snapshot and the monitor,
  with record, snapshotForCommit, onCommitSuccess, snapshotInOffsetOrder
  and forget, and a NONE instance chosen once in the constructor for the
  non-transactional modes - which deletes the per-completion mode branch
  retainsCompletedRecords(). Behaviour is unchanged and
  PartitionStateAbortedTransactionReplayTest is untouched and green. This
  is also the fix for the red `static: infer` CI lane: RacerD analyses a
  class once it contains a synchronized block, PartitionState gained one
  with the ledger, and the lane reported thirty of that class's unrelated
  accessors. The monitor now lives in a class whose every field access is
  under it, so there is nothing for RacerD to report there, and
  config/infer-known-findings.txt is not edited. The thread-safety
  invariant (control thread writes and replays, whichever thread commits
  trims, never held across a lock acquisition, client call or callback)
  is recorded on the new class per the engine's AGENTS.md.

- PCModule resolves the producer configuration once and memoises it; the
  replacement source reads the derived transactional.id from that map
  instead of deriving it a second time, and every build receives a copy of
  the same map. TransactionalIdDerivation.derive() now has one caller in
  main code (resolve), and the WARN a caller-set id earns fires once per
  instance rather than once per rebuild - an operator watching a recovery
  loop sees the recovery lines, not a repeat of a start-up warning.
  PcBuiltProducerTest.aCallerSetIdIsWarnedAboutOnceAcrossAStartAndTwo
  Replacements counts 1; with resolve() back per build it counts 4.

- The two PC-built InvalidPidMapping tests in ParallelEoSStreamProcessorTest
  shared a verbatim body (the one new PMD CPD clone on the PR); they are one
  parameterised test over the two arrival shapes, synchronous throw and
  failed send future, each still visible by name in the report.

- Not done here: extracting the availability state machine from
  ProducerManager (finding #2). After groups 1 and 2 the machine spans the
  write-lock path (beginReplacement sets the replay-owed flag) and the
  produce-lock check (the dispatch-generation refusal), so the seam the
  finding proposed - "holds no lock but its own monitor, makes no client
  call" - is not a clean one-pass move any more. Recorded under
  internal/ProducerManager.java in docs/refactoring.md.

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