build: consolidate arcadedb-test-utils into server test-jar + fix HA bootstrap-fingerprint replay race - #4259
Conversation
There was a problem hiding this comment.
Code Review
This pull request consolidates test scaffolding by moving common test utilities from the arcadedb-test-utils module into the arcadedb-server test-jar and deleting the test-utils module. Key changes include updating Maven dependencies across multiple modules to use the test-jar type, migrating Java imports, and enhancing test helpers with improved resource management and logging. Feedback identifies that the arcadedb-server dependency in the grpc-client module was added with provided scope instead of test scope, which could lead to dependency leakage.
| <dependency> | ||
| <groupId>com.arcadedb</groupId> | ||
| <artifactId>arcadedb-test-utils</artifactId> | ||
| <artifactId>arcadedb-server</artifactId> | ||
| <version>${project.parent.version}</version> | ||
| <scope>provided</scope> | ||
| </dependency> |
There was a problem hiding this comment.
The dependency on arcadedb-server is added with provided scope, which deviates from the implementation plan (Task 4, Step 1) and potentially exposes server-side classes to the client module's main source code at compile time. Since this dependency is required for integration tests (supporting BaseGraphServerTest), it should be restricted to test scope to maintain proper modularity and avoid dependency leakage.
| <dependency> | |
| <groupId>com.arcadedb</groupId> | |
| <artifactId>arcadedb-test-utils</artifactId> | |
| <artifactId>arcadedb-server</artifactId> | |
| <version>${project.parent.version}</version> | |
| <scope>provided</scope> | |
| </dependency> | |
| <dependency> | |
| <groupId>com.arcadedb</groupId> | |
| <artifactId>arcadedb-server</artifactId> | |
| <version>${project.parent.version}</version> | |
| <scope>test</scope> | |
| </dependency> |
There was a problem hiding this comment.
Fixed in commit 0107cb3. Changed <scope>provided</scope> to <scope>test</scope>. Verified RemoteGrpcServerIT still passes — grpc-client main code only imports the protobuf-generated com.arcadedb.server.grpc.* classes (which ship in the arcadedb-grpc module, not arcadedb-server), so test scope is the right fit.
Up to standards ✅🟢 Issues
|
| Metric | Results |
|---|---|
| Complexity | 0 |
NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.
Code ReviewOverviewThis PR consolidates the duplicate test scaffolding ( Positives
Issues and Concerns1.
|
📜 License Compliance Check✅ License check passed. See artifacts for full report. License Summary (first 50 lines) |
|
Walking the 5 items from the review. 1. 2. 3. AI planning documents. Pushing back. The repo already collects design specs and implementation plans under 4. PR description. Filled in — summary, approach, verification (17 sentinel tests pass), net diff, rollback. Both checklist items remain unchecked because the project's PR template predates this kind of refactor; they don't apply cleanly. 5.
Items 1, 2, 4 are concrete fixes; 3 and 5 addressed with reasoning above. |
📜 License Compliance Check✅ License check passed. See artifacts for full report. License Summary (first 50 lines) |
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #4259 +/- ##
==========================================
+ Coverage 64.63% 64.65% +0.02%
==========================================
Files 1644 1644
Lines 127254 127277 +23
Branches 27264 27267 +3
==========================================
+ Hits 82255 82297 +42
+ Misses 33509 33479 -30
- Partials 11490 11501 +11 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
Code ReviewOverviewThis PR consolidates duplicate test scaffolding ( Positives
Issues to Address1. Docs files should not be checked in
Recommendation: delete both files before merging. 2. The diff adds two separate <!-- plain server jar - no <type> -->
<dependency>
<artifactId>arcadedb-server</artifactId>
<scope>test</scope>
</dependency>
<!-- test-jar -->
<dependency>
<artifactId>arcadedb-server</artifactId>
<scope>test</scope>
<type>test-jar</type>
</dependency>The PR description explains this is intentional ("the test classpath needs 3. This PR bundles a meaningful HA/Raft behavior change alongside the test scaffolding consolidation. The guard added to Two questions:
Minor / Nits
SummaryThe consolidation itself is well-executed and the 403 bug fix is correct. Two action items before merge:
The |
📜 License Compliance Check✅ License check passed. See artifacts for full report. License Summary (first 50 lines) |
|
Pushing back on all three items - mostly verification, not implementation. 1. This is established repo convention, not a one-off. Keeping them. 2. The plain test-scope entry is required, not redundant. Reasoning:
Concretely, grpc-client tests import This mirrors 3.
Yes.
Yes -
This is exactly the path the new guard short-circuits. Without the guard, the re-applied entry hits the install path on the StateMachineUpdater thread, which blocks Ratis leader-info notifications and burns the snapshot-retry budget on null leader URLs (and ultimately halts via the critical-error path). The IT was failing for that reason before the guard. Agreed the PR title undersells the production fix - I'll update it to reflect the HA change alongside the test-utils consolidation. |
📜 License Compliance Check✅ License check passed. See artifacts for full report. License Summary (first 50 lines) |
Code ReviewOverall this is a solid refactor that pays down real technical debt. The core consolidation is well-executed and the HA race fix addresses a genuine production issue. Some notes below. What works well
Concerns1. <dependency>
<artifactId>arcadedb-server</artifactId>
<scope>test</scope>
<!-- no type - pulls in production jar -->
</dependency>
<dependency>
<artifactId>arcadedb-server</artifactId>
<scope>test</scope>
<type>test-jar</type>
</dependency>The first entry (no 2. A backup statement writes data to disk (the backup archive) and may overwrite or create new files depending on the URL. In the general case, running it twice produces a different side-effect each time (two backups, or an overwrite). Without context on where If The test added covers parsing and the return value, but does not document the intended semantics of the flag. 3. Two files are added:
These look like AI agent working documents used during development - they contain task checklists, step-by-step implementation notes, and internal planning context. They add no value to contributors reading the repository and will confuse future readers. Recommend removing them before merge. 4. PR scope mixes several independent concerns The title covers two topics (test-utils consolidation + HA race fix), but the diff also includes:
Each of these is fine on its own, but bundling them makes the PR harder to review and bisect if a regression appears. Not a blocker, but worth noting for future PRs. Minor notes
|
📜 License Compliance Check✅ License check passed. See artifacts for full report. License Summary (first 50 lines) |
Up to standards ✅🟢 Issues
|
| Metric | Results |
|---|---|
| Complexity | 0 |
🟢 Coverage 70.27% diff coverage · -7.45% coverage variation
Metric Results Coverage variation ✅ -7.45% coverage variation Diff coverage ✅ 70.27% diff coverage Coverage variation details
Coverable lines Covered lines Coverage Common ancestor commit (3591e93) 127254 93773 73.69% Head commit (713e0d7) 158955 (+31701) 105289 (+11516) 66.24% (-7.45%) Coverage variation is the difference between the coverage for the head and common ancestor commits of the pull request branch:
<coverage of head commit> - <coverage of common ancestor commit>Diff coverage details
Coverable lines Covered lines Diff coverage Pull request (#4259) 37 26 70.27% Diff coverage is the percentage of lines that are covered by tests out of the coverable lines that the pull request added or modified:
<covered lines added or modified>/<coverable lines added or modified> * 100%
NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.
Code ReviewOverviewThis PR consolidates the duplicated test scaffolding (TestServerHelper, StaticBaseServerTest, BaseGraphServerTest, WebSocketClientHelper) from the arcadedb-test-utils module into server's test-jar, then deletes the now-redundant module. It also bundles several unrelated but valuable fixes: an HA bootstrap-fingerprint replay race, gRPC LocalDate serialization, static HttpClient thread-leak prevention in AI handlers, and a BackupDatabaseStatement.isIdempotent() change. What works well
Issues and suggestions1. grpc-client/pom.xml ends up with two arcadedb-server test entries<!-- entry 1: main jar in test scope -->
<dependency>
<groupId>com.arcadedb</groupId>
<artifactId>arcadedb-server</artifactId>
<version>${project.parent.version}</version>
<scope>test</scope>
</dependency>
<!-- entry 2: test-jar in test scope -->
<dependency>
<groupId>com.arcadedb</groupId>
<artifactId>arcadedb-server</artifactId>
<version>${project.parent.version}</version>
<scope>test</scope>
<type>test-jar</type>
</dependency>The PR description explains the reason (test classpath needs ArcadeDBServer at class-load time), but a short XML comment would help future readers. Also worth confirming: other modules like bolt have arcadedb-server in provided scope (which is visible on the test classpath), so they get the main jar without an extra test-scope entry. If grpc-client genuinely has no transitive path to the main server jar at test time, both entries are necessary - confirming that closes this question. 2. BackupDatabaseStatement.isIdempotent() returning true - semantics look wrong@Override
public boolean isIdempotent() {
return true;
}In ArcadeDB's SQL layer, isIdempotent() returning true typically means the statement is safe for GET/HEAD HTTP dispatch and may be treated as read-only for replication decisions. A backup writes data to storage or the network - it is not read-only. Returning true could allow the statement through GET endpoints meant only for reads, or affect HA routing. The added test verifies the return value but does not explain why it should be true. Please clarify: if backup is intentionally considered idempotent here (e.g. re-running it safely overwrites the same target and callers should be free to retry), the reasoning belongs in a comment. If it is a mistake, false is the correct value, or the override can be dropped to inherit the base-class default. 3. Three separate static HttpClient instances in AI handlersAiActivateHandler, AiAnalyzeProfilerHandler, and AiChatHandler each declare their own static HttpClient with identical configuration. A single shared constant in a utility class or AiConfiguration would be cleaner and marginally cheaper to initialize. Not a blocker, worth a follow-up. 4. Hardcoded local path in plan docdocs/superpowers/plans/2026-05-18-test-utils-consolidation.md contains a reference to /Users/frank/projects/arcade/arcadedb/pom.xml - a local filesystem path from the authoring machine. A repo-relative path or just "the root pom.xml" is enough. Test coverage
SummaryThe test-utils consolidation is clean, well-motivated, and follows project conventions. The HA race fix is solid. The main items worth addressing before merge are: clarifying the isIdempotent() semantics on BackupDatabaseStatement (issue 2) and adding a comment to the dual grpc-client dep (issue 1). |
Captures the design for collapsing the duplicate test scaffolding (TestServerHelper, StaticBaseServerTest, BaseGraphServerTest, WebSocketClientHelper) into a single canonical location at server/src/test/java/com/arcadedb/server/. Downstream modules switch to depend on arcadedb-server:test-jar:test and arcadedb-test-utils is deleted.
Seven tasks producing six commits: three reconciliation commits (one per helper pair that drifted), two migration commits (downstream pom swap, then import rename), and one cleanup commit (delete test-utils module + remove misleading server/pom test-jar override).
…Folders RaftHTTP2ServersCreateReplicatedDatabaseIT and other Raft ITs were failing with HTTP 403 on basic-auth login because stale target/config/server-users.jsonl from a previous test run held a password hash created with a different SERVER_ROOT_PASSWORD. The matching cleanup was already in test-utils/src/main/java/com/arcadedb/test/TestServerHelper - this brings the server-module copy in line. The duplicate helpers will be consolidated in a follow-up branch.
Adopt try-with-resources for PrintWriter, structured async-callback logging, and refreshed Javadoc from the test-utils copy. Server-copy error-body capture in initialConnection retained.
The InterruptedException catch was swallowing the interrupt status, which can cause downstream blocking calls to hang. Mirror the test-utils copy by re-asserting the interrupt flag.
- TestServerHelper: informative fail() message and utility-class form (final + private ctor) - StaticBaseServerTest: explicit Level import instead of wildcard
Step 1 of 2 for the test-utils consolidation. Tests in these modules will still fail to compile until imports are migrated in the next commit.
Step 2 of 2 for the test-utils consolidation. All test classes now import the canonical helpers from server's test-jar.
The four helpers (TestServerHelper, StaticBaseServerTest, BaseGraphServerTest, WebSocketClientHelper) now live solely in server's test-jar. Removes the structural duplication that caused the recent 403 test failures (test-utils' deleteDatabaseFolders had target/config cleanup; server's did not). Also drops the misleading maven-jar-plugin phase=none override in server/pom.xml -- it did not actually disable test-jar emission and would break the test-jar consumers if it ever started working.
- grpc-client/pom.xml: arcadedb-server scope provided -> test. The grpc-client main code only references com.arcadedb.server.grpc.* classes that ship in the arcadedb-grpc protobuf module, not the arcadedb-server module. Test-scope is sufficient for the tests (RemoteGrpcServerIT etc.) that need ArcadeDBServer at class load. - graphql/pom.xml: drop arcadedb-server:test-jar:test. The graphql test sources do not reference any com.arcadedb.server.* helper, so the dependency was dead weight. Aligns the pom with the spec's original intent to drop (not swap) graphql's test-utils dep.
RaftHAComprehensiveIT.test14_writesDuringSlowFollower failed because the
restarted follower's StateMachine replayed the BOOTSTRAP_FINGERPRINT_ENTRY
at index 1 and detected a mismatch (the local database had been
forward-replicated past the original baseline). The mismatch path triggered
installFromLeaderForBootstrap inside applyTransaction. Because that runs
on the StateMachineUpdater thread - the same thread that would service
Ratis leader-info notifications - the snapshot install's 4 retries all
saw a null leader HTTP address, exhausted the budget, and tripped the
critical-error halt. After the halt, every subsequent entry was refused
("State machine halted after critical error at earlier index") and the
follower could never catch up.
Fix: short-circuit applyBootstrapFingerprintEntry when the persisted
applied index is at or beyond this entry's index. In that case the
verification ran in a prior session and the local database has been
replicated forward by Ratis AppendEntries; re-running install is both
unnecessary and dangerous. Recording the baseline in bootstrapBaselines
is preserved so status export and tests still see the correct value.
The genuine initial-bootstrap path is untouched: a brand-new follower
has no persisted applied index file, readPersistedAppliedIndex() returns
-1, and the check fails so the full verification + install runs.
Verified:
- RaftHAComprehensiveIT#test14_writesDuringSlowFollower: was failing,
now passes
- RaftHAComprehensiveIT full suite: 13/13 pass
- SnapshotInstallerRetryTest + SnapshotInstallerIntegrationIT: 6/6 pass
(confirms genuine bootstrap-install path still works)
- PromQLHttpHandlerIT.series: percent-encode the match[] query parameter so Undertow accepts the request (literal [] is rejected per RFC 3986 and the handler was never reached). - RemoteDateIT.dateTimeMicros1: connect to the actual bound HTTP port via arcadeDBServer.getHttpServer().getPort() instead of hard-coding 2480, so the test still authenticates against its own server when another process holds 2480.
…snapshot installation logic
AiActivateHandler, AiChatHandler, and AiAnalyzeProfilerHandler each held the HttpClient as a per-instance final field built in the constructor. The JDK HttpClient spawns a SelectorManager NIO daemon thread that lives until the client is garbage-collected, so every ArcadeDBServer start leaked one SelectorManager per handler (3 per server). Under the ha-raft IT suite (reuseForks=true, 2-5 servers per test, dozens of ITs), a thread dump showed hundreds of leaked SelectorManager threads partway through the run, which slowed leader election enough on later tests to exceed their 30s budget. Make the HttpClient private static final, matching the existing pattern in PostServerCommandHandler and PostBatchHandler. All three handlers used identical configuration (10s connect timeout), so a single shared client is correct.
cbefa76 to
6a357fd
Compare
Code ReviewOverviewThis PR consolidates duplicate test scaffolding ( Positive aspects
Issues and suggestions1. Planning/spec documents checked into source (medium)
2.
|
…adInsideTransactionIT
📜 License Compliance Check✅ License check passed. See artifacts for full report. License Summary (first 50 lines) |
Code ReviewOverviewThis PR does two things: (1) consolidates duplicate test scaffolding into a single canonical home by deleting The motivation is solid. The duplication was structural (Maven reactor cycle), and the 403 failures were a direct consequence of the helpers diverging between copies. Good approach. Issues1. After the migration, 2.
3. The PR adds two large markdown files:
These are AI agent workflow documents with step-by-step task checklists, commit-message templates, and implementation instructions. They are not user-facing documentation and do not belong in the project's git history. They should be excluded from this PR. If there is a desire to keep design rationale, a brief comment in the deleted module's commit message or a short ADR is enough. 4. AI handlers - three separate static Each of Positives
SummaryThe consolidation approach is correct and the immediate bug fixes are well-executed. Three actionable items before merging: add a POM comment in |
….15.5 to 1.16.0 [skip ci] Bumps [io.micrometer:micrometer-registry-prometheus](https://github.com/micrometer-metrics/micrometer) from 1.15.5 to 1.16.0. Release notes *Sourced from [io.micrometer:micrometer-registry-prometheus's releases](https://github.com/micrometer-metrics/micrometer/releases).* > 1.16.0 > ------ > > We upgraded the Prometheus Java Client to `1.4.x` ([#6830](https://redirect.github.com/micrometer-metrics/micrometer/pull/6830)) which brings support for Unicode which includes some behavioral change in naming conventions, see the [1.16 Migration-Guide](https://github.com/micrometer-metrics/micrometer/wiki/1.16-Migration-Guide). > >⚠️ Noteworthy > -------------------- > > * Deprecate the Wavefront module [#6328](https://redirect.github.com/micrometer-metrics/micrometer/issues/6328) > * Remove deprecated io.micrometer.core.lang annotations [#6407](https://redirect.github.com/micrometer-metrics/micrometer/issues/6407) > * Register JCache `cache.removals` as a FunctionCounter by default [ArcadeData#2754](https://redirect.github.com/micrometer-metrics/micrometer/issues/2754) > * Improve no-op behavior of the Observation API [#6700](https://redirect.github.com/micrometer-metrics/micrometer/pull/6700) > > ⭐ New Features > ------------------- > > * Support KeyValues with annotations when using `ObservedAspect`/`@Observed` [ArcadeData#4030](https://redirect.github.com/micrometer-metrics/micrometer/issues/4030) > * Validate low cardinality keys [#6713](https://redirect.github.com/micrometer-metrics/micrometer/pull/6713) > * Add counter for total loaded classes [ArcadeData#3561](https://redirect.github.com/micrometer-metrics/micrometer/issues/3561) > * Add eventexecutor.workers metrics for Netty [#6375](https://redirect.github.com/micrometer-metrics/micrometer/issues/6375) > * Avoid DistributionStatisticsConfig creation when retrieving timers [#6661](https://redirect.github.com/micrometer-metrics/micrometer/pull/6661) > * Avoid capturing lambda allocation when retrieving existing meters [#6670](https://redirect.github.com/micrometer-metrics/micrometer/pull/6670) > * Introduce MeterConvention [#6710](https://redirect.github.com/micrometer-metrics/micrometer/issues/6710) > * OpenTelemetry Semantic Conventions for JVM metrics [ArcadeData#5286](https://redirect.github.com/micrometer-metrics/micrometer/issues/5286) > * Add MeterFilter.forMeters utility method [#6594](https://redirect.github.com/micrometer-metrics/micrometer/pull/6594) > * Apache HC 5 OTel semantic convention [#6591](https://redirect.github.com/micrometer-metrics/micrometer/pull/6591) > * Improve nullability for gauges [#6546](https://redirect.github.com/micrometer-metrics/micrometer/pull/6546) > * Metrics for Generational Shenandoah GC [ArcadeData#4259](https://redirect.github.com/micrometer-metrics/micrometer/issues/4259) > * Support custom tags in NettyEventExecutorMetrics [#6592](https://redirect.github.com/micrometer-metrics/micrometer/issues/6592) > * Support newsgroups KeyValue for Jakarta Mail instrumentation [#6558](https://redirect.github.com/micrometer-metrics/micrometer/pull/6558) > * Add KeyName.withNoneValue() [#6125](https://redirect.github.com/micrometer-metrics/micrometer/pull/6125) > * Add getAll to Getter for repeated metadata [#6312](https://redirect.github.com/micrometer-metrics/micrometer/pull/6312) > * Enhance logging of negative amount in AbstractTimer.record() by printing stack trace [#6530](https://redirect.github.com/micrometer-metrics/micrometer/pull/6530) > * Flag to register JCache cache.removals as FunctionCounter [#6471](https://redirect.github.com/micrometer-metrics/micrometer/pull/6471) > * Improved Meter.Id#getTags() performance [#6182](https://redirect.github.com/micrometer-metrics/micrometer/pull/6182) > * Jakarta Mail instrumentation [#5985](https://redirect.github.com/micrometer-metrics/micrometer/issues/5985) > * Log requests as trace level for OtlpMeterRegistry [#6514](https://redirect.github.com/micrometer-metrics/micrometer/pull/6514) > * Make KafkaMetrics refresh interval configurable [#6319](https://redirect.github.com/micrometer-metrics/micrometer/pull/6319) > * Migrate to JSpecify annotations for nullability constraints [ArcadeData#5547](https://redirect.github.com/micrometer-metrics/micrometer/issues/5547) > * Provide meter count in HighCardinalityTagsDetector [#6510](https://redirect.github.com/micrometer-metrics/micrometer/pull/6510) > * StackdriverConfig option to not create metric descriptors [#6281](https://redirect.github.com/micrometer-metrics/micrometer/issues/6281) > * Use String.replace() where possible [#6449](https://redirect.github.com/micrometer-metrics/micrometer/pull/6449) > > :lady\_beetle: Bug Fixes > ------------------------ > > * Exclude java.\* from OSGI Import-Package [#6810](https://redirect.github.com/micrometer-metrics/micrometer/issues/6810) > * Distribution without percentiles always has value 0 in Stackdriver [#6401](https://redirect.github.com/micrometer-metrics/micrometer/issues/6401) > * Incompatible with slf4j 2 in OSGi [#6406](https://redirect.github.com/micrometer-metrics/micrometer/issues/6406) > * LongTaskTimer#measure does not return max duration [#6421](https://redirect.github.com/micrometer-metrics/micrometer/issues/6421) > * Return NaN for null KafkaMetrics values [#6324](https://redirect.github.com/micrometer-metrics/micrometer/issues/6324) > * Scrape failure when conflicting meter types are registered [#6434](https://redirect.github.com/micrometer-metrics/micrometer/issues/6434) > * ValueResolver and ValueExpressionResolver nullability is inconsistent [#6280](https://redirect.github.com/micrometer-metrics/micrometer/issues/6280) ... (truncated) Commits * [`3360d05`](micrometer-metrics/micrometer@3360d05) Upgrade Micrometer Context Propagation to 1.2.0 * [`8ae2387`](micrometer-metrics/micrometer@8ae2387) Merge branch '1.15.x' * [`521f151`](micrometer-metrics/micrometer@521f151) Merge branch '1.14.x' into 1.15.x * [`1628762`](micrometer-metrics/micrometer@1628762) Setup continuous builds for Antora ([#6858](https://redirect.github.com/micrometer-metrics/micrometer/issues/6858)) * [`65031ea`](micrometer-metrics/micrometer@65031ea) Bump software.amazon.awssdk:cloudwatch from 2.37.4 to 2.37.5 ([#6859](https://redirect.github.com/micrometer-metrics/micrometer/issues/6859)) * [`df18b91`](micrometer-metrics/micrometer@df18b91) Bump software.amazon.awssdk:cloudwatch from 2.37.3 to 2.37.4 ([#6856](https://redirect.github.com/micrometer-metrics/micrometer/issues/6856)) * [`4cb7563`](micrometer-metrics/micrometer@4cb7563) Bump com.uber.nullaway:nullaway from 0.12.11 to 0.12.12 ([#6854](https://redirect.github.com/micrometer-metrics/micrometer/issues/6854)) * [`064d159`](micrometer-metrics/micrometer@064d159) Bump activemq-artemis from 2.42.0 to 2.44.0 ([#6850](https://redirect.github.com/micrometer-metrics/micrometer/issues/6850)) * [`4d9ec6e`](micrometer-metrics/micrometer@4d9ec6e) Bump software.amazon.awssdk:cloudwatch from 2.37.2 to 2.37.3 ([#6849](https://redirect.github.com/micrometer-metrics/micrometer/issues/6849)) * [`698d394`](micrometer-metrics/micrometer@698d394) Bump spring-io/spring-github-workflows ([#6848](https://redirect.github.com/micrometer-metrics/micrometer/issues/6848)) * Additional commits viewable in [compare view](micrometer-metrics/micrometer@v1.15.5...v1.16.0) [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- Dependabot commands and options You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
…16.0 [skip ci] Bumps [io.micrometer:micrometer-core](https://github.com/micrometer-metrics/micrometer) from 1.15.5 to 1.16.0. Release notes *Sourced from [io.micrometer:micrometer-core's releases](https://github.com/micrometer-metrics/micrometer/releases).* > 1.16.0 > ------ > > We upgraded the Prometheus Java Client to `1.4.x` ([#6830](https://redirect.github.com/micrometer-metrics/micrometer/pull/6830)) which brings support for Unicode which includes some behavioral change in naming conventions, see the [1.16 Migration-Guide](https://github.com/micrometer-metrics/micrometer/wiki/1.16-Migration-Guide). > >⚠️ Noteworthy > -------------------- > > * Deprecate the Wavefront module [#6328](https://redirect.github.com/micrometer-metrics/micrometer/issues/6328) > * Remove deprecated io.micrometer.core.lang annotations [#6407](https://redirect.github.com/micrometer-metrics/micrometer/issues/6407) > * Register JCache `cache.removals` as a FunctionCounter by default [ArcadeData#2754](https://redirect.github.com/micrometer-metrics/micrometer/issues/2754) > * Improve no-op behavior of the Observation API [#6700](https://redirect.github.com/micrometer-metrics/micrometer/pull/6700) > > ⭐ New Features > ------------------- > > * Support KeyValues with annotations when using `ObservedAspect`/`@Observed` [ArcadeData#4030](https://redirect.github.com/micrometer-metrics/micrometer/issues/4030) > * Validate low cardinality keys [#6713](https://redirect.github.com/micrometer-metrics/micrometer/pull/6713) > * Add counter for total loaded classes [ArcadeData#3561](https://redirect.github.com/micrometer-metrics/micrometer/issues/3561) > * Add eventexecutor.workers metrics for Netty [#6375](https://redirect.github.com/micrometer-metrics/micrometer/issues/6375) > * Avoid DistributionStatisticsConfig creation when retrieving timers [#6661](https://redirect.github.com/micrometer-metrics/micrometer/pull/6661) > * Avoid capturing lambda allocation when retrieving existing meters [#6670](https://redirect.github.com/micrometer-metrics/micrometer/pull/6670) > * Introduce MeterConvention [#6710](https://redirect.github.com/micrometer-metrics/micrometer/issues/6710) > * OpenTelemetry Semantic Conventions for JVM metrics [ArcadeData#5286](https://redirect.github.com/micrometer-metrics/micrometer/issues/5286) > * Add MeterFilter.forMeters utility method [#6594](https://redirect.github.com/micrometer-metrics/micrometer/pull/6594) > * Apache HC 5 OTel semantic convention [#6591](https://redirect.github.com/micrometer-metrics/micrometer/pull/6591) > * Improve nullability for gauges [#6546](https://redirect.github.com/micrometer-metrics/micrometer/pull/6546) > * Metrics for Generational Shenandoah GC [ArcadeData#4259](https://redirect.github.com/micrometer-metrics/micrometer/issues/4259) > * Support custom tags in NettyEventExecutorMetrics [#6592](https://redirect.github.com/micrometer-metrics/micrometer/issues/6592) > * Support newsgroups KeyValue for Jakarta Mail instrumentation [#6558](https://redirect.github.com/micrometer-metrics/micrometer/pull/6558) > * Add KeyName.withNoneValue() [#6125](https://redirect.github.com/micrometer-metrics/micrometer/pull/6125) > * Add getAll to Getter for repeated metadata [#6312](https://redirect.github.com/micrometer-metrics/micrometer/pull/6312) > * Enhance logging of negative amount in AbstractTimer.record() by printing stack trace [#6530](https://redirect.github.com/micrometer-metrics/micrometer/pull/6530) > * Flag to register JCache cache.removals as FunctionCounter [#6471](https://redirect.github.com/micrometer-metrics/micrometer/pull/6471) > * Improved Meter.Id#getTags() performance [#6182](https://redirect.github.com/micrometer-metrics/micrometer/pull/6182) > * Jakarta Mail instrumentation [#5985](https://redirect.github.com/micrometer-metrics/micrometer/issues/5985) > * Log requests as trace level for OtlpMeterRegistry [#6514](https://redirect.github.com/micrometer-metrics/micrometer/pull/6514) > * Make KafkaMetrics refresh interval configurable [#6319](https://redirect.github.com/micrometer-metrics/micrometer/pull/6319) > * Migrate to JSpecify annotations for nullability constraints [ArcadeData#5547](https://redirect.github.com/micrometer-metrics/micrometer/issues/5547) > * Provide meter count in HighCardinalityTagsDetector [#6510](https://redirect.github.com/micrometer-metrics/micrometer/pull/6510) > * StackdriverConfig option to not create metric descriptors [#6281](https://redirect.github.com/micrometer-metrics/micrometer/issues/6281) > * Use String.replace() where possible [#6449](https://redirect.github.com/micrometer-metrics/micrometer/pull/6449) > > :lady\_beetle: Bug Fixes > ------------------------ > > * Exclude java.\* from OSGI Import-Package [#6810](https://redirect.github.com/micrometer-metrics/micrometer/issues/6810) > * Distribution without percentiles always has value 0 in Stackdriver [#6401](https://redirect.github.com/micrometer-metrics/micrometer/issues/6401) > * Incompatible with slf4j 2 in OSGi [#6406](https://redirect.github.com/micrometer-metrics/micrometer/issues/6406) > * LongTaskTimer#measure does not return max duration [#6421](https://redirect.github.com/micrometer-metrics/micrometer/issues/6421) > * Return NaN for null KafkaMetrics values [#6324](https://redirect.github.com/micrometer-metrics/micrometer/issues/6324) > * Scrape failure when conflicting meter types are registered [#6434](https://redirect.github.com/micrometer-metrics/micrometer/issues/6434) > * ValueResolver and ValueExpressionResolver nullability is inconsistent [#6280](https://redirect.github.com/micrometer-metrics/micrometer/issues/6280) ... (truncated) Commits * [`3360d05`](micrometer-metrics/micrometer@3360d05) Upgrade Micrometer Context Propagation to 1.2.0 * [`8ae2387`](micrometer-metrics/micrometer@8ae2387) Merge branch '1.15.x' * [`521f151`](micrometer-metrics/micrometer@521f151) Merge branch '1.14.x' into 1.15.x * [`1628762`](micrometer-metrics/micrometer@1628762) Setup continuous builds for Antora ([#6858](https://redirect.github.com/micrometer-metrics/micrometer/issues/6858)) * [`65031ea`](micrometer-metrics/micrometer@65031ea) Bump software.amazon.awssdk:cloudwatch from 2.37.4 to 2.37.5 ([#6859](https://redirect.github.com/micrometer-metrics/micrometer/issues/6859)) * [`df18b91`](micrometer-metrics/micrometer@df18b91) Bump software.amazon.awssdk:cloudwatch from 2.37.3 to 2.37.4 ([#6856](https://redirect.github.com/micrometer-metrics/micrometer/issues/6856)) * [`4cb7563`](micrometer-metrics/micrometer@4cb7563) Bump com.uber.nullaway:nullaway from 0.12.11 to 0.12.12 ([#6854](https://redirect.github.com/micrometer-metrics/micrometer/issues/6854)) * [`064d159`](micrometer-metrics/micrometer@064d159) Bump activemq-artemis from 2.42.0 to 2.44.0 ([#6850](https://redirect.github.com/micrometer-metrics/micrometer/issues/6850)) * [`4d9ec6e`](micrometer-metrics/micrometer@4d9ec6e) Bump software.amazon.awssdk:cloudwatch from 2.37.2 to 2.37.3 ([#6849](https://redirect.github.com/micrometer-metrics/micrometer/issues/6849)) * [`698d394`](micrometer-metrics/micrometer@698d394) Bump spring-io/spring-github-workflows ([#6848](https://redirect.github.com/micrometer-metrics/micrometer/issues/6848)) * Additional commits viewable in [compare view](micrometer-metrics/micrometer@v1.15.5...v1.16.0) [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- Dependabot commands and options You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
…bootstrap-fingerprint replay race (ArcadeData#4259)
…skip ci] Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.12 to 42.7.13. Release notes *Sourced from [org.postgresql:postgresql's releases](https://github.com/pgjdbc/pgjdbc/releases).* > v42.7.13 > -------- > > Changes > ------- > > * docs: add 42.7.13 release changelog [`@davecramer`](https://github.com/davecramer) ([#4270](https://redirect.github.com/pgjdbc/pgjdbc/issues/4270)) > * Adjust EditorConfig für Makefile [`@BaumiCoder`](https://github.com/BaumiCoder) ([#4279](https://redirect.github.com/pgjdbc/pgjdbc/issues/4279)) > * fix(scram): fail closed on channel-binding downgrade (no scram bump) [`@vlsi`](https://github.com/vlsi) ([#4272](https://redirect.github.com/pgjdbc/pgjdbc/issues/4272)) > * Bump pgjdbc version from 42.7.12 to 42.7.13 [`@davecramer`](https://github.com/davecramer) ([#4269](https://redirect.github.com/pgjdbc/pgjdbc/issues/4269)) > * chore: remove test-anorm-sbt module and its disabled CI wiring [`@vlsi`](https://github.com/vlsi) ([#4261](https://redirect.github.com/pgjdbc/pgjdbc/issues/4261)) > * refactor(test-gss): convert to Java/JUnit 5 submodule of the main build [`@vlsi`](https://github.com/vlsi) ([#4166](https://redirect.github.com/pgjdbc/pgjdbc/issues/4166)) > * ci: derive PG test versions from a Renovate-managed maxPgVersion [`@vlsi`](https://github.com/vlsi) ([#4218](https://redirect.github.com/pgjdbc/pgjdbc/issues/4218)) > * feat(insert): cap reWriteBatchedInserts by the protocol limit, not 128 [`@vlsi`](https://github.com/vlsi) ([#4207](https://redirect.github.com/pgjdbc/pgjdbc/issues/4207)) > * refactor(metadata): derive getPrimaryKeys from pg\_constraint.conkey [`@vlsi`](https://github.com/vlsi) ([#4202](https://redirect.github.com/pgjdbc/pgjdbc/issues/4202)) > * fix(protocol): defer flushes until response processing [`@vlsi`](https://github.com/vlsi) ([#4196](https://redirect.github.com/pgjdbc/pgjdbc/issues/4196)) > * fix(build): resolve the Temurin 8 test toolchain by vendor [`@vlsi`](https://github.com/vlsi) ([#4257](https://redirect.github.com/pgjdbc/pgjdbc/issues/4257)) > * build: include multi-release source sets in the JaCoCo coverage report [`@vlsi`](https://github.com/vlsi) ([#4256](https://redirect.github.com/pgjdbc/pgjdbc/issues/4256)) > * fix(ci): read java\_vendor before overwriting java\_distribution [`@vlsi`](https://github.com/vlsi) ([#4255](https://redirect.github.com/pgjdbc/pgjdbc/issues/4255)) > * ci: generate the whole matrix in one batch, coverage job included [`@vlsi`](https://github.com/vlsi) ([#4253](https://redirect.github.com/pgjdbc/pgjdbc/issues/4253)) > * ci: pass CODECOV\_TOKEN so protected-branch coverage uploads succeed [`@vlsi`](https://github.com/vlsi) ([#4254](https://redirect.github.com/pgjdbc/pgjdbc/issues/4254)) > * ci: collect coverage on one pinned job [`@vlsi`](https://github.com/vlsi) ([#4245](https://redirect.github.com/pgjdbc/pgjdbc/issues/4245)) > * ci: apply -DqueryTimeout from the matrix query\_timeout axis [`@vlsi`](https://github.com/vlsi) ([#4246](https://redirect.github.com/pgjdbc/pgjdbc/issues/4246)) > * ci: make Codecov project and patch statuses informational [`@vlsi`](https://github.com/vlsi) ([#4244](https://redirect.github.com/pgjdbc/pgjdbc/issues/4244)) > * fix(build): restore JaCoCo XML report so Codecov receives coverage [`@vlsi`](https://github.com/vlsi) ([#4240](https://redirect.github.com/pgjdbc/pgjdbc/issues/4240)) > * test(replication): shrink big-transaction inserts to avoid CI timeouts [`@vlsi`](https://github.com/vlsi) ([#4243](https://redirect.github.com/pgjdbc/pgjdbc/issues/4243)) > * update maintainers [`@davecramer`](https://github.com/davecramer) ([#4222](https://redirect.github.com/pgjdbc/pgjdbc/issues/4222)) > * test: add hermetic test for localSocketAddress [`@vlsi`](https://github.com/vlsi) ([#4224](https://redirect.github.com/pgjdbc/pgjdbc/issues/4224)) > * docs(translation): clean up leftover German header in ja.po [`@vlsi`](https://github.com/vlsi) ([#4206](https://redirect.github.com/pgjdbc/pgjdbc/issues/4206)) > * Update ja.po [`@davecramer`](https://github.com/davecramer) ([#2004](https://redirect.github.com/pgjdbc/pgjdbc/issues/2004)) > * test: add PostgreSQL 18 to the CI test matrix [`@vlsi`](https://github.com/vlsi) ([#4198](https://redirect.github.com/pgjdbc/pgjdbc/issues/4198)) > * test: silence expected SSPI warning stack trace in SSPIClientWaffleTest [`@vlsi`](https://github.com/vlsi) ([#4197](https://redirect.github.com/pgjdbc/pgjdbc/issues/4197)) > * fix(ssl): build PKIX trust anchors without a KeyStore so FIPS-mode JVMs can load sslrootcert [`@vlsi`](https://github.com/vlsi) ([#4193](https://redirect.github.com/pgjdbc/pgjdbc/issues/4193)) > * test: fix flaky sentLocationEqualToLastReceiveLSN replication test [`@vlsi`](https://github.com/vlsi) ([#4175](https://redirect.github.com/pgjdbc/pgjdbc/issues/4175)) > * build: promote MethodCanBeStatic to error level [`@vlsi`](https://github.com/vlsi) ([#4172](https://redirect.github.com/pgjdbc/pgjdbc/issues/4172)) > * Fix PGInterval.setSeconds to reject out of range and NaN values [`@sehrope`](https://github.com/sehrope) ([#4194](https://redirect.github.com/pgjdbc/pgjdbc/issues/4194)) > * Replace connectThreadFactory with connectExecutor [`@sehrope`](https://github.com/sehrope) ([#4165](https://redirect.github.com/pgjdbc/pgjdbc/issues/4165)) > * Fix deleting temp file when spooling large stream to disk in StreamWrapper [`@sehrope`](https://github.com/sehrope) ([#4190](https://redirect.github.com/pgjdbc/pgjdbc/issues/4190)) > * chore: Add top level /scratch to gitignore [`@sehrope`](https://github.com/sehrope) ([#4164](https://redirect.github.com/pgjdbc/pgjdbc/issues/4164)) > * refactor: favour composition over inheritance for Driver.ConnectTask [`@vlsi`](https://github.com/vlsi) ([#4160](https://redirect.github.com/pgjdbc/pgjdbc/issues/4160)) > * Fix NumberParser.getFastLong(...) handling of overlong values [`@sehrope`](https://github.com/sehrope) ([#4163](https://redirect.github.com/pgjdbc/pgjdbc/issues/4163)) > * build: produce a multi-release jar from reduced-pom.xml on Java 11+ [`@vlsi`](https://github.com/vlsi) ([#4157](https://redirect.github.com/pgjdbc/pgjdbc/issues/4157)) > * Add connectThreadFactory and refactor Driver to use FutureTask for loginTimeout connection attempts [`@sehrope`](https://github.com/sehrope) ([#4120](https://redirect.github.com/pgjdbc/pgjdbc/issues/4120)) > * test: verify custom properties reach socket factory [`@vlsi`](https://github.com/vlsi) ([#4125](https://redirect.github.com/pgjdbc/pgjdbc/issues/4125)) > * test: fix LazyCleanerTest timeouts for the lingering Java 8 cleanup thread [`@vlsi`](https://github.com/vlsi) ([#4122](https://redirect.github.com/pgjdbc/pgjdbc/issues/4122)) > * test: stabilise StatementTest.fastCloses on Windows [`@vlsi`](https://github.com/vlsi) ([#4121](https://redirect.github.com/pgjdbc/pgjdbc/issues/4121)) > * fix: append default non-proxy hosts when socksNonProxyHosts is set [`@davecramer`](https://github.com/davecramer) ([#4045](https://redirect.github.com/pgjdbc/pgjdbc/issues/4045)) > * test: budget terminating Sync in BatchDeadlockTest small-RETURNING branch [`@vlsi`](https://github.com/vlsi) ([#4116](https://redirect.github.com/pgjdbc/pgjdbc/issues/4116)) > * test: make message assertions locale-independent [`@vlsi`](https://github.com/vlsi) ([#4113](https://redirect.github.com/pgjdbc/pgjdbc/issues/4113)) > * build: drop xgettext default keywords; regenerate translations [`@vlsi`](https://github.com/vlsi) ([#4100](https://redirect.github.com/pgjdbc/pgjdbc/issues/4100)) > * ci: opt-in scheduled workflows via ENABLE\_SCHEDULED\_JOBS repo variable [`@vlsi`](https://github.com/vlsi) ([#4085](https://redirect.github.com/pgjdbc/pgjdbc/issues/4085)) > * Avoid direct java.lang.management dependency in maxResultBuffer parser [`@mblakley-casana`](https://github.com/mblakley-casana) ([#4069](https://redirect.github.com/pgjdbc/pgjdbc/issues/4069)) > * fix: restore pre-describe for generated-key batches [`@bilalshehata`](https://github.com/bilalshehata) ([#4014](https://redirect.github.com/pgjdbc/pgjdbc/issues/4014)) ... (truncated) Changelog *Sourced from [org.postgresql:postgresql's changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md).* > [42.7.13] (2026-07-06) > ---------------------- > > ### Added > > * feat: invalidate the prepared-statement cache when the server reports a `search_path` change via GUC\_REPORT (PostgreSQL 18+), so cached plans are no longer used against the wrong schema [PR [#4259](https://redirect.github.com/pgjdbc/pgjdbc/issues/4259)]([pgjdbc/pgjdbc#4259](https://redirect.github.com/pgjdbc/pgjdbc/pull/4259)) > * feat: `reWriteBatchedInserts` now merges up to 32768 rows into one multi-values `INSERT` (bounded by the 65535 bind-parameter limit on the extended protocol) instead of capping at 128, which speeds up batches of few-column rows. The new `reWriteBatchedInsertsSize` connection property lowers that cap when set; the default of `0` uses that maximum. [PR [#4207](https://redirect.github.com/pgjdbc/pgjdbc/issues/4207)]([pgjdbc/pgjdbc#4207](https://redirect.github.com/pgjdbc/pgjdbc/pull/4207)) > * feat: invalidate the prepared-statement cache after CREATE/DROP/ALTER so callers no longer trip on "cached plan must not change result type" without opting into `autosave=ALWAYS`. Controlled by the new `flushCacheOnDdl` connection property (default `true`); set to `false` for the prior behaviour. [PR [#4067](https://redirect.github.com/pgjdbc/pgjdbc/issues/4067)]([pgjdbc/pgjdbc#4067](https://redirect.github.com/pgjdbc/pgjdbc/pull/4067)) > * feat: add `connectExecutor` connection property to customize the `Executor` used to run the worker task that performs the connection attempt when `loginTimeout` is in effect. The value is the fully qualified name of a class implementing `java.util.concurrent.Executor`. With a null value, the default, the driver retains the prior behavior of running the connection attempt on a daemon thread named `"PostgreSQL JDBC driver connection thread"`. The executor must run the task on a thread other than the caller's. Running the attempt on a named thread lets applications that monitor driver-created threads identify it. [PR [#4165](https://redirect.github.com/pgjdbc/pgjdbc/issues/4165)]([pgjdbc/pgjdbc#4165](https://redirect.github.com/pgjdbc/pgjdbc/pull/4165)) > * feat: add `classLoaderStrategy` connection property to control which classloaders the driver searches when loading a class named by a connection property, for example `socketFactory`. The default `driver-first` now falls back to the thread context classloader when the driver's classloader cannot resolve the class, which fixes class loading in non-flat class paths such as Quarkus and OSGi. Set `driver` to keep the previous driver-classloader-only behaviour, or `context-first` to prefer the thread context classloader [Issue [#2112](https://redirect.github.com/pgjdbc/pgjdbc/issues/2112)]([pgjdbc/pgjdbc#2112](https://redirect.github.com/pgjdbc/pgjdbc/issues/2112)) [PR [#4167](https://redirect.github.com/pgjdbc/pgjdbc/issues/4167)]([pgjdbc/pgjdbc#4167](https://redirect.github.com/pgjdbc/pgjdbc/pull/4167)) > * feat: add OID constants for geometric arrays, `RECORD`, and `refcursor` [PR [#4220](https://redirect.github.com/pgjdbc/pgjdbc/issues/4220)]([pgjdbc/pgjdbc#4220](https://redirect.github.com/pgjdbc/pgjdbc/pull/4220)) > * feat: `LargeObject` `BlobInputStream` now skips by seeking instead of reading, and the driver exposes the server version so it can select the 64-bit large-object API where available [PR [#4204](https://redirect.github.com/pgjdbc/pgjdbc/issues/4204)]([pgjdbc/pgjdbc#4204](https://redirect.github.com/pgjdbc/pgjdbc/pull/4204)) > > ### Changed > > * refactor: the worker that runs the connection attempt under `loginTimeout` is now a `FutureTask` (`ConnectTask`) instead of the hand-rolled `ConnectThread`. When the caller hits the timeout, the task is now cancelled with `cancel(true)`, which interrupts the worker thread rather than letting it run to completion. This makes the connection attempt interruptible, so `loginTimeout` can stop a slow connection attempt instead of leaking a thread. As before, a connection that the worker still manages to establish after the caller gives up is closed by the worker so that it does not leak. There are no public API changes and this should only lead to faster background resource cleanup for connections that time out. [PR [#4120](https://redirect.github.com/pgjdbc/pgjdbc/issues/4120)]([pgjdbc/pgjdbc#4120](https://redirect.github.com/pgjdbc/pgjdbc/pull/4120)) > * chore: `PGXAConnection.ConnectionHandler` now rejects `setAutoCommit(false)` and `setSavepoint(...)` during an active XA branch, in addition to the long-rejected `setAutoCommit(true)` / `commit()` / `rollback()`. The `setSavepoint` rejection was already meant to be in place but the guard misspelled the method name as `setSavePoint`, so savepoints silently went through. Both changes bring the proxy in line with JTA 1.2 §3.4. [PR [#4114](https://redirect.github.com/pgjdbc/pgjdbc/issues/4114)]([pgjdbc/pgjdbc#4114](https://redirect.github.com/pgjdbc/pgjdbc/pull/4114)) > * chore: `commitPrepared` / `rollback`-of-prepared now return `XAER_RMFAIL` instead of `XAER_RMERR` when the underlying connection is left in a non-idle `TransactionState`. Transaction managers (Geronimo, Narayana, Atomikos) treat `XAER_RMFAIL` as retryable on a fresh `XAResource`; the prepared transaction is no longer abandoned. [PR [#4114](https://redirect.github.com/pgjdbc/pgjdbc/issues/4114)]([pgjdbc/pgjdbc#4114](https://redirect.github.com/pgjdbc/pgjdbc/pull/4114)) > * refactor: derive `getPrimaryKeys` from `pg_constraint.conkey` [PR [#4202](https://redirect.github.com/pgjdbc/pgjdbc/issues/4202)]([pgjdbc/pgjdbc#4202](https://redirect.github.com/pgjdbc/pgjdbc/pull/4202)) > > ### Fixed > > * fix: the published GitHub release now ships the released `postgresql-<version>.jar` and its detached PGP signature, taken from the same signed build that is uploaded to Maven Central, instead of a leftover SNAPSHOT jar [Issue [#3812](https://redirect.github.com/pgjdbc/pgjdbc/issues/3812)]([pgjdbc/pgjdbc#3812](https://redirect.github.com/pgjdbc/pgjdbc/issues/3812)) [PR [#3814](https://redirect.github.com/pgjdbc/pgjdbc/issues/3814)]([pgjdbc/pgjdbc#3814](https://redirect.github.com/pgjdbc/pgjdbc/pull/3814)) > * fix: simplify the `Statement#cancel` state machine by dropping the redundant `CANCELLED` state. `killTimerTask` now waits for the state to return to `IDLE` directly, which removes a spin-forever case when more than one thread observes the cancel completing [PR [#1827](https://redirect.github.com/pgjdbc/pgjdbc/issues/1827)]([pgjdbc/pgjdbc#1827](https://redirect.github.com/pgjdbc/pgjdbc/pull/1827)). > * perf: defer simple-query flushes until the driver reads the response, allowing `BEGIN` and the following query to share a network flush [Issue [#3894](https://redirect.github.com/pgjdbc/pgjdbc/issues/3894)]([pgjdbc/pgjdbc#3894](https://redirect.github.com/pgjdbc/pgjdbc/issues/3894)) [PR [#4196](https://redirect.github.com/pgjdbc/pgjdbc/issues/4196)]([pgjdbc/pgjdbc#4196](https://redirect.github.com/pgjdbc/pgjdbc/pull/4196)) > * fix: `reWriteBatchedInserts` no longer throws `IllegalArgumentException` when batching a parameterless `INSERT` (for example `INSERT INTO t VALUES (1, 2)`) of 256 rows or more [PR [#4207](https://redirect.github.com/pgjdbc/pgjdbc/issues/4207)]([pgjdbc/pgjdbc#4207](https://redirect.github.com/pgjdbc/pgjdbc/pull/4207)) > * fix: a comment before `CALL` in a `CallableStatement` no longer hides the native call, so OUT parameter registration works for `/* comment */ call proc(?, ?)` and similar. `Parser.modifyJdbcCall` now skips leading whitespace and SQL comments (both `--` and `/* */`) before the call, tolerates a trailing comment after a `{ ... }` escape, and no longer adds a spurious comma when moving an OUT parameter into a call whose arguments are only a comment [Issue [#2538](https://redirect.github.com/pgjdbc/pgjdbc/issues/2538)]([pgjdbc/pgjdbc#2538](https://redirect.github.com/pgjdbc/pgjdbc/issues/2538)) [PR [#4209](https://redirect.github.com/pgjdbc/pgjdbc/issues/4209)]([pgjdbc/pgjdbc#4209](https://redirect.github.com/pgjdbc/pgjdbc/pull/4209)) > * fix: `PreparedStatement.toString()` no longer throws for a `bytea` value supplied as text via `PGobject`. Hex-format values (`\x...`) are validated and rendered as a `bytea` literal, and escape-format values are quoted and cast like any other literal [Issue [#3757](https://redirect.github.com/pgjdbc/pgjdbc/issues/3757)]([pgjdbc/pgjdbc#3757](https://redirect.github.com/pgjdbc/pgjdbc/issues/3757)) [PR [#4201](https://redirect.github.com/pgjdbc/pgjdbc/issues/4201)]([pgjdbc/pgjdbc#4201](https://redirect.github.com/pgjdbc/pgjdbc/pull/4201)) > * fix: the driver no longer nulls the `contextClassLoader` of shared `ForkJoinPool.commonPool()` worker threads, which previously left unrelated tasks on those threads running with a `null` classloader [Issue [#4155](https://redirect.github.com/pgjdbc/pgjdbc/issues/4155)]([pgjdbc/pgjdbc#4155](https://redirect.github.com/pgjdbc/pgjdbc/issues/4155)) [PR [#4156](https://redirect.github.com/pgjdbc/pgjdbc/issues/4156)]([pgjdbc/pgjdbc#4156](https://redirect.github.com/pgjdbc/pgjdbc/pull/4156)) > * fix: `PgResultSet#getCharacterStream` wraps `String` in a `StringReader` [PR [#4063](https://redirect.github.com/pgjdbc/pgjdbc/issues/4063)]([pgjdbc/pgjdbc#4063](https://redirect.github.com/pgjdbc/pgjdbc/pull/4063)) > * fix: `PGXAConnection` no longer saves and restores the underlying connection's JDBC `autoCommit` flag. All XA-protocol SQL (`BEGIN`, `PREPARE TRANSACTION`, `COMMIT`, `ROLLBACK`, `COMMIT PREPARED`, `ROLLBACK PREPARED`, the `recover()` SELECT) is sent through `QUERY_SUPPRESS_BEGIN`, so the caller's `autoCommit` value is invariant across every `XAResource` call. Fixes the "2nd phase commit must be issued using an idle connection" failure during recovery on managed datasources that pool connections with `autoCommit=false` (TomEE, WildFly, WebSphere Liberty) [PR [#4114](https://redirect.github.com/pgjdbc/pgjdbc/issues/4114)]([pgjdbc/pgjdbc#4114](https://redirect.github.com/pgjdbc/pgjdbc/pull/4114)) > * fix: `PGXAConnection.prepare()` now mutates XA state only after `PREPARE TRANSACTION` succeeds. A failed `PREPARE` previously left the driver thinking the branch was already prepared, so the follow-up `rollback(xid)` tried `ROLLBACK PREPARED` against a non-existent gid and returned `XAER_RMERR`. Transaction managers (Narayana) escalated this to `HeuristicMixedException`. With the fix, `rollback(xid)` takes the active-branch path and issues a plain `ROLLBACK`, which the server accepts cleanly. Fixes [Issue [#3153](https://redirect.github.com/pgjdbc/pgjdbc/issues/3153)]([pgjdbc/pgjdbc#3153](https://redirect.github.com/pgjdbc/pgjdbc/issues/3153)), [Issue [#3123](https://redirect.github.com/pgjdbc/pgjdbc/issues/3123)]([pgjdbc/pgjdbc#3123](https://redirect.github.com/pgjdbc/pgjdbc/issues/3123)). [PR [#4114](https://redirect.github.com/pgjdbc/pgjdbc/issues/4114)]([pgjdbc/pgjdbc#4114](https://redirect.github.com/pgjdbc/pgjdbc/pull/4114)) > * fix: an updatable result set over an unqualified table name is now classified using only the table visible through `search_path`. When two schemas held a table with the same name and the same primary or unique index name but a different set of key columns, the driver took the union of both schemas' columns, so the result set could be wrongly rejected as not updatable [PR [#4214](https://redirect.github.com/pgjdbc/pgjdbc/issues/4214)]([pgjdbc/pgjdbc#4214](https://redirect.github.com/pgjdbc/pgjdbc/pull/4214)). Supersedes [PR [#3400](https://redirect.github.com/pgjdbc/pgjdbc/issues/3400)]([pgjdbc/pgjdbc#3400](https://redirect.github.com/pgjdbc/pgjdbc/pull/3400)). > * fix: `LargeObject.close()` now flushes a buffered output stream before marking the object closed, so closing a large object without an explicit `flush()` no longer drops buffered writes. The flush runs while the object is still open (it calls back into `LargeObject.write()`), and `lo_close` always runs afterward; a failure from `lo_close` no longer masks an earlier flush error, and the transaction is not committed when the flush failed [Issue [#4247](https://redirect.github.com/pgjdbc/pgjdbc/issues/4247)]([pgjdbc/pgjdbc#4247](https://redirect.github.com/pgjdbc/pgjdbc/issues/4247)) [PR [#4248](https://redirect.github.com/pgjdbc/pgjdbc/issues/4248)]([pgjdbc/pgjdbc#4248](https://redirect.github.com/pgjdbc/pgjdbc/pull/4248)). > * fix: reject empty `timestamp`, `timestamptz`, and `date` text with a clear `SQLException` (SQLState `22007`) instead of an `ArrayIndexOutOfBoundsException` [PR [#4278](https://redirect.github.com/pgjdbc/pgjdbc/issues/4278)]([pgjdbc/pgjdbc#4278](https://redirect.github.com/pgjdbc/pgjdbc/pull/4278)) > * fix: return null `CHAR_OCTET_LENGTH` for non-character columns [PR [#4231](https://redirect.github.com/pgjdbc/pgjdbc/issues/4231)]([pgjdbc/pgjdbc#4231](https://redirect.github.com/pgjdbc/pgjdbc/pull/4231)) > * fix: honor scale in `ResultSet.getBigDecimal(int, int)` [PR [#4211](https://redirect.github.com/pgjdbc/pgjdbc/issues/4211)]([pgjdbc/pgjdbc#4211](https://redirect.github.com/pgjdbc/pgjdbc/pull/4211)) > * fix: support `java.time` values in an updatable `ResultSet` `updateRow()` / `insertRow()` [PR [#3848](https://redirect.github.com/pgjdbc/pgjdbc/issues/3848)]([pgjdbc/pgjdbc#3848](https://redirect.github.com/pgjdbc/pgjdbc/pull/3848)) > * fix: improve batching when the `RETURNING` clause contains `varchar` or `numeric` types [PR [#4014](https://redirect.github.com/pgjdbc/pgjdbc/issues/4014)]([pgjdbc/pgjdbc#4014](https://redirect.github.com/pgjdbc/pgjdbc/pull/4014)) > * fix: correct `estimatedReceiveBufferBytes` accounting after a forced `Sync` [PR [#4014](https://redirect.github.com/pgjdbc/pgjdbc/issues/4014)]([pgjdbc/pgjdbc#4014](https://redirect.github.com/pgjdbc/pgjdbc/pull/4014)) > * fix: avoid creating a transient `ResultSet` for describe-statement purposes, and restore the pre-describe path for generated-key batches [PR [#4014](https://redirect.github.com/pgjdbc/pgjdbc/issues/4014)]([pgjdbc/pgjdbc#4014](https://redirect.github.com/pgjdbc/pgjdbc/pull/4014)) > * fix: add an explicit failure message when a multi-statement command executes in a batch [PR [#4014](https://redirect.github.com/pgjdbc/pgjdbc/issues/4014)]([pgjdbc/pgjdbc#4014](https://redirect.github.com/pgjdbc/pgjdbc/pull/4014)) > * fix: detect `search_path` changes case-insensitively [PR [#4216](https://redirect.github.com/pgjdbc/pgjdbc/issues/4216)]([pgjdbc/pgjdbc#4216](https://redirect.github.com/pgjdbc/pgjdbc/pull/4216)) > * fix: auto-detect the SSL key format instead of relying on the `.key` extension [PR [#3946](https://redirect.github.com/pgjdbc/pgjdbc/issues/3946)]([pgjdbc/pgjdbc#3946](https://redirect.github.com/pgjdbc/pgjdbc/pull/3946)) > * fix: build PKIX trust anchors without a `KeyStore` so FIPS JVMs work [PR [#4193](https://redirect.github.com/pgjdbc/pgjdbc/issues/4193)]([pgjdbc/pgjdbc#4193](https://redirect.github.com/pgjdbc/pgjdbc/pull/4193)) > * fix: use `gssResponseTimeout` rather than `sslResponseTimeout` for GSS connections [PR [#4076](https://redirect.github.com/pgjdbc/pgjdbc/issues/4076)]([pgjdbc/pgjdbc#4076](https://redirect.github.com/pgjdbc/pgjdbc/pull/4076)) > * fix: skip the autosave savepoint for `SET LOCAL` / `SET SESSION TRANSACTION` [PR [#4203](https://redirect.github.com/pgjdbc/pgjdbc/issues/4203)]([pgjdbc/pgjdbc#4203](https://redirect.github.com/pgjdbc/pgjdbc/pull/4203)) > * fix: do not throw `AssertionError` from `BatchResultHandler` on a closed connection [PR [#4187](https://redirect.github.com/pgjdbc/pgjdbc/issues/4187)]([pgjdbc/pgjdbc#4187](https://redirect.github.com/pgjdbc/pgjdbc/pull/4187)) > * fix: reject `SQL_TSI_FRAC_SECOND` with an explicit, explained error [PR [#4229](https://redirect.github.com/pgjdbc/pgjdbc/issues/4229)]([pgjdbc/pgjdbc#4229](https://redirect.github.com/pgjdbc/pgjdbc/pull/4229)) > * fix: reject a null URL in `Driver.acceptsURL` with a clear `NullPointerException` [PR [#4205](https://redirect.github.com/pgjdbc/pgjdbc/issues/4205)]([pgjdbc/pgjdbc#4205](https://redirect.github.com/pgjdbc/pgjdbc/pull/4205)) > * fix: reject overlong inputs in `NumberParser.getFastLong` instead of silently wrapping [PR [#4163](https://redirect.github.com/pgjdbc/pgjdbc/issues/4163)]([pgjdbc/pgjdbc#4163](https://redirect.github.com/pgjdbc/pgjdbc/pull/4163)) > * fix: reject out-of-range and NaN values in `PGInterval.setSeconds` [PR [#4194](https://redirect.github.com/pgjdbc/pgjdbc/issues/4194)]([pgjdbc/pgjdbc#4194](https://redirect.github.com/pgjdbc/pgjdbc/pull/4194)) > * fix: close the socket when `PgConnection` setup fails after connect [PR [#4161](https://redirect.github.com/pgjdbc/pgjdbc/issues/4161)]([pgjdbc/pgjdbc#4161](https://redirect.github.com/pgjdbc/pgjdbc/pull/4161)) > * fix: keep the `LazyCleanerImpl` cleanup task alive across a transient empty queue [PR [#4038](https://redirect.github.com/pgjdbc/pgjdbc/issues/4038)]([pgjdbc/pgjdbc#4038](https://redirect.github.com/pgjdbc/pgjdbc/pull/4038)) ... (truncated) Commits * [`3297557`](pgjdbc/pgjdbc@3297557) docs: add 42.7.13 release changelog ([#4270](https://redirect.github.com/pgjdbc/pgjdbc/issues/4270)) * [`d93d370`](pgjdbc/pgjdbc@d93d370) style: apply Autostyle to docs/ and .github/ * [`2e05ff9`](pgjdbc/pgjdbc@2e05ff9) build: check docs/ and .github/ formatting with Autostyle * [`b4a6087`](pgjdbc/pgjdbc@b4a6087) Adjust EditorConfig für Makefiles * [`725cebb`](pgjdbc/pgjdbc@725cebb) fix(jdbc): reject empty timestamp/timestamptz text with a clear error * [`23a1b0d`](pgjdbc/pgjdbc@23a1b0d) fix(scram): fail closed on channel-binding downgrade (no scram bump) * [`0b4077a`](pgjdbc/pgjdbc@0b4077a) Bump pgjdbc version from 42.7.12 to 42.7.13 ([#4269](https://redirect.github.com/pgjdbc/pgjdbc/issues/4269)) * [`394800a`](pgjdbc/pgjdbc@394800a) fix: flush LargeObject output stream before marking closed ([#4248](https://redirect.github.com/pgjdbc/pgjdbc/issues/4248)) * [`83780f1`](pgjdbc/pgjdbc@83780f1) Maintain consistency with the use of the word maintainer vs comitter ([#4234](https://redirect.github.com/pgjdbc/pgjdbc/issues/4234)) * [`d42cad5`](pgjdbc/pgjdbc@d42cad5) fix(jdbc): classify updatable result set by search\_path visibility * Additional commits viewable in [compare view](pgjdbc/pgjdbc@REL42.7.12...REL42.7.13) [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- Dependabot commands and options You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Summary
Consolidates the duplicate test scaffolding (
TestServerHelper,StaticBaseServerTest,BaseGraphServerTest,WebSocketClientHelper) into a single canonical home atserver/src/test/java/com/arcadedb/server/, then deletes thearcadedb-test-utilsmodule entirely.Background: two near-identical copies of these helpers existed (one in
arcadedb-test-utils, one inserver/src/test/java). The duplication was structural (a Maven reactor cycle blocked the server module from depending onarcadedb-test-utils) and caused real test failures — thetarget/config/cleanup was added to one copy but not the other, leading to HTTP 403 failures inRaftHTTP2ServersCreateReplicatedDatabaseITandFollowerSessionTokenQueryITwhen staleserver-users.jsonlcarried a different password hash.Approach
After reconciling the four helper pairs (taking the better-quality version from each, keeping the server-copy's error-body capture in
BaseGraphServerTest), all 10 downstream modules switch fromarcadedb-test-utilstoarcadedb-server:test-jar:test. Thetest-utilsmodule is deleted. ~50 test imports rewritten.Spec:
docs/superpowers/specs/2026-05-18-test-utils-consolidation-design.mdPlan:
docs/superpowers/plans/2026-05-18-test-utils-consolidation.mdVerification
mvn clean install -DskipTestsBUILD SUCCESSRaftHTTP2ServersCreateReplicatedDatabaseIT,FollowerSessionTokenQueryITPASSBoltProtocolIT,ConsoleTest,GremlinServerTest,PostgresProtocolIT,MongoDBServerTest,RedisWTest,GrpcServerIT,RemoteGrpcServerIT,PrometheusMetricsPluginAuthenticatedTest,BoltTlsIT— all PASS (17 tests total, 0 failures)phase=noneoverride inserver/pom.xml(verified by inspecting~/.m2/repository/com/arcadedb/arcadedb-server/26.6.1-SNAPSHOT/arcadedb-server-26.6.1-SNAPSHOT-tests.jartimestamp post-build)Net diff
arcadedb-test-utilsmodule (1158 lines)grpc-client/pom.xml(test-scopearcadedb-serveradded because the test classpath needsArcadeDBServerat class load viaBaseGraphServerTest)Rollback
Single
git revertof the consolidation range restores everything (helpers, module, poms, imports). No data, schema, or config impact.