From 53e2bdac50cc8173651af82aaf3f4957fe2f2b46 Mon Sep 17 00:00:00 2001 From: Ben Manes Date: Sat, 16 Nov 2024 12:35:15 -0800 Subject: [PATCH] optimize the frequency sketch In an earlier analysis the block-based sketch was significantly faster than the flat (uniform) one. This was independently confirmed by a C# and Go port, who also observed a 2x speed up. However, when recently adding this benchmark to the CI it showed it as a regression. Therefore some implicit compiler optimizations are now explicit, which allows the block-based sketch to match or exceed the flat-based performance. - We no longer rely on escape analysis to optimize away the method scoped arrays (count, index). These should have been stack allocated and broken into their components. - The arrays were meant to break a loop data dependency, but it is now faster to keep that. `Math.min` is a single cycle, branch-free instruction that the OOO pipeline seems to prefer. - `increment` is manually loop unrolled like the flat version, which shows a simiar speed up. - Previously, the flat benchmark version implemented the scaffolding interface directly, was pre-allocated, and the init guard was removed. This gave it a large advantage as it improved inlining, branch prediction, etc. The benchmark is now fair. - For jdk11 the black is always faster by at least 10M ops/s. In jdk23 the speedup only occurs as the table size increases, matching the expected gains from better cache effects. It is marginally slower on the small table size due to indexing differences. The net user effect will be noise since this was not a performance bottleneck due to the cache's overall design. --- .github/actions/run-gradle/action.yml | 2 +- .github/workflows/build.yml | 2 +- .github/workflows/codacy.yml | 2 +- .github/workflows/codeql.yml | 6 +-- .github/workflows/dependency-check.yml | 2 +- .../dependency-submission-pr-retreive.yml | 2 +- .../dependency-submission-pr-submit.yml | 2 +- .github/workflows/dependency-submission.yml | 2 +- .github/workflows/devskim.yml | 2 +- .../workflows/gradle-wrapper-validation.yml | 2 +- .github/workflows/qodana.yml | 2 +- .github/workflows/scorecards-analysis.yml | 2 +- .github/workflows/semgrep.yml | 2 +- .github/workflows/snyk.yml | 2 +- .github/workflows/trivy.yml | 2 +- .../benmanes/caffeine/cache/SketchType.java | 14 +++++- .../caffeine/cache/sketch/CountMinSketch.java | 43 ++++++++++++++++--- .../caffeine/cache/FrequencySketch.java | 43 ++++++++++++------- .../gradle/libs.versions.toml | 2 +- .../settings.gradle.kts | 2 +- examples/graal-native/settings.gradle.kts | 2 +- examples/hibernate/gradle/libs.versions.toml | 4 +- examples/hibernate/settings.gradle.kts | 2 +- examples/indexable/settings.gradle.kts | 2 +- .../resilience-failsafe/settings.gradle.kts | 2 +- .../write-behind-rxjava/settings.gradle.kts | 2 +- gradle/config/spotbugs/exclude.xml | 5 +++ gradle/libs.versions.toml | 6 +-- gradle/plugins/settings.gradle.kts | 2 +- settings.gradle.kts | 2 +- 30 files changed, 114 insertions(+), 53 deletions(-) diff --git a/.github/actions/run-gradle/action.yml b/.github/actions/run-gradle/action.yml index e8c88659c4..201428fd02 100644 --- a/.github/actions/run-gradle/action.yml +++ b/.github/actions/run-gradle/action.yml @@ -65,7 +65,7 @@ runs: echo "JDK_CI=$JAVA_HOME" >> $GITHUB_ENV echo "JDK_EA=${{ inputs.early-access == inputs.java }}" >> $GITHUB_ENV - name: Setup Gradle - uses: gradle/actions/setup-gradle@d156388eb19639ec20ade50009f3d199ce1e2808 # v4.1.0 + uses: gradle/actions/setup-gradle@473878a77f1b98e2b5ac4af93489d1656a80a5ed # v4.2.0 env: ORG_GRADLE_PROJECT_org.gradle.java.installations.auto-download: 'false' with: diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e948a3ccea..879ef3b3c3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -250,7 +250,7 @@ jobs: cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }} continue-on-error: true - name: Publish to Codecov - uses: codecov/codecov-action@b9fd7d16f6d7d1b5d2bec1a2887e65ceed900238 # v4.6.0 + uses: codecov/codecov-action@5c47607acb93fed5485fdbf7232e8a31425f672a # v5.0.2 with: token: ${{ secrets.CODECOV_TOKEN }} - name: Publish to Codacy diff --git a/.github/workflows/codacy.yml b/.github/workflows/codacy.yml index 448159605c..3154be6bda 100644 --- a/.github/workflows/codacy.yml +++ b/.github/workflows/codacy.yml @@ -47,7 +47,7 @@ jobs: if: steps.check_files.outputs.files_exists == 'true' run: jq -c '.runs |= unique_by({tool, invocations, results})' < results.sarif > codacy.sarif - name: Upload result to GitHub Code Scanning - uses: github/codeql-action/upload-sarif@4f3212b61783c3c68e8309a0f18a699764811cda # v3.27.1 + uses: github/codeql-action/upload-sarif@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 if: steps.check_files.outputs.files_exists == 'true' continue-on-error: true with: diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index c9849c8bfe..a848d4e9ef 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -57,10 +57,10 @@ jobs: java: ${{ env.JAVA_VERSION }} cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }} - name: Initialize CodeQL - uses: github/codeql-action/init@4f3212b61783c3c68e8309a0f18a699764811cda # v3.27.1 + uses: github/codeql-action/init@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 with: languages: java - name: Autobuild - uses: github/codeql-action/autobuild@4f3212b61783c3c68e8309a0f18a699764811cda # v3.27.1 + uses: github/codeql-action/autobuild@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@4f3212b61783c3c68e8309a0f18a699764811cda # v3.27.1 + uses: github/codeql-action/analyze@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 diff --git a/.github/workflows/dependency-check.yml b/.github/workflows/dependency-check.yml index 007ffaddd8..c2fbfe97e6 100644 --- a/.github/workflows/dependency-check.yml +++ b/.github/workflows/dependency-check.yml @@ -61,7 +61,7 @@ jobs: with: files: build/reports/dependency-check-report.sarif - name: Upload result to GitHub Code Scanning - uses: github/codeql-action/upload-sarif@4f3212b61783c3c68e8309a0f18a699764811cda # v3.27.1 + uses: github/codeql-action/upload-sarif@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 if: steps.check_files.outputs.files_exists == 'true' with: sarif_file: build/reports/dependency-check-report.sarif diff --git a/.github/workflows/dependency-submission-pr-retreive.yml b/.github/workflows/dependency-submission-pr-retreive.yml index e9547f4ba5..59601749f0 100644 --- a/.github/workflows/dependency-submission-pr-retreive.yml +++ b/.github/workflows/dependency-submission-pr-retreive.yml @@ -35,6 +35,6 @@ jobs: repo1.maven.org:443 services.gradle.org:443 - name: Retrieve and submit dependency graph - uses: gradle/actions/dependency-submission@d156388eb19639ec20ade50009f3d199ce1e2808 # v4.1.0 + uses: gradle/actions/dependency-submission@473878a77f1b98e2b5ac4af93489d1656a80a5ed # v4.2.0 with: dependency-graph: download-and-submit diff --git a/.github/workflows/dependency-submission-pr-submit.yml b/.github/workflows/dependency-submission-pr-submit.yml index cedca7fa61..164966368e 100644 --- a/.github/workflows/dependency-submission-pr-submit.yml +++ b/.github/workflows/dependency-submission-pr-submit.yml @@ -38,7 +38,7 @@ jobs: java-version: ${{ env.JAVA_VERSION }} distribution: temurin - name: Submit Dependency Graph - uses: gradle/actions/dependency-submission@d156388eb19639ec20ade50009f3d199ce1e2808 # v4.1.0 + uses: gradle/actions/dependency-submission@473878a77f1b98e2b5ac4af93489d1656a80a5ed # v4.2.0 with: cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }} dependency-graph: generate-and-upload diff --git a/.github/workflows/dependency-submission.yml b/.github/workflows/dependency-submission.yml index d81ce7da8f..a83ec2c614 100644 --- a/.github/workflows/dependency-submission.yml +++ b/.github/workflows/dependency-submission.yml @@ -38,6 +38,6 @@ jobs: java-version: ${{ env.JAVA_VERSION }} distribution: temurin - name: Submit Dependency Graph - uses: gradle/actions/dependency-submission@d156388eb19639ec20ade50009f3d199ce1e2808 # v4.1.0 + uses: gradle/actions/dependency-submission@473878a77f1b98e2b5ac4af93489d1656a80a5ed # v4.2.0 with: cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }} diff --git a/.github/workflows/devskim.yml b/.github/workflows/devskim.yml index bf0eeb55ca..8521d3e4a1 100644 --- a/.github/workflows/devskim.yml +++ b/.github/workflows/devskim.yml @@ -31,6 +31,6 @@ jobs: - name: Run DevSkim scanner uses: microsoft/DevSkim-Action@914fa647b406c387000300b2f09bb28691be2b6d # v1.0.14 - name: Upload DevSkim scan results to GitHub Security tab - uses: github/codeql-action/upload-sarif@4f3212b61783c3c68e8309a0f18a699764811cda # v3.27.1 + uses: github/codeql-action/upload-sarif@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 with: sarif_file: devskim-results.sarif diff --git a/.github/workflows/gradle-wrapper-validation.yml b/.github/workflows/gradle-wrapper-validation.yml index a623a669eb..34e2e491dd 100644 --- a/.github/workflows/gradle-wrapper-validation.yml +++ b/.github/workflows/gradle-wrapper-validation.yml @@ -18,4 +18,4 @@ jobs: github.com:443 services.gradle.org:443 - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - uses: gradle/actions/wrapper-validation@d156388eb19639ec20ade50009f3d199ce1e2808 # v4.1.0 + - uses: gradle/actions/wrapper-validation@473878a77f1b98e2b5ac4af93489d1656a80a5ed # v4.2.0 diff --git a/.github/workflows/qodana.yml b/.github/workflows/qodana.yml index f30e2ca64b..531eacc9da 100644 --- a/.github/workflows/qodana.yml +++ b/.github/workflows/qodana.yml @@ -70,6 +70,6 @@ jobs: upload-result: true github-token: ${{ secrets.GITHUB_TOKEN }} - name: Upload SARIF file for GitHub Advanced Security Dashboard - uses: github/codeql-action/upload-sarif@4f3212b61783c3c68e8309a0f18a699764811cda # v3.27.1 + uses: github/codeql-action/upload-sarif@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 with: sarif_file: ${{ runner.temp }}/qodana/results/qodana.sarif.json diff --git a/.github/workflows/scorecards-analysis.yml b/.github/workflows/scorecards-analysis.yml index 1750affe25..da8acb52af 100644 --- a/.github/workflows/scorecards-analysis.yml +++ b/.github/workflows/scorecards-analysis.yml @@ -58,6 +58,6 @@ jobs: path: results.sarif retention-days: 5 - name: Upload to code-scanning - uses: github/codeql-action/upload-sarif@4f3212b61783c3c68e8309a0f18a699764811cda # v3.27.1 + uses: github/codeql-action/upload-sarif@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 with: sarif_file: results.sarif diff --git a/.github/workflows/semgrep.yml b/.github/workflows/semgrep.yml index ac33cb8e38..30a690bb3f 100644 --- a/.github/workflows/semgrep.yml +++ b/.github/workflows/semgrep.yml @@ -34,7 +34,7 @@ jobs: if: steps.check_files.outputs.files_exists == 'true' run: jq -c '.runs[0].tool.driver.rules |= unique_by(.id)' < results.sarif > semgrep.sarif - name: Upload SARIF file for GitHub Advanced Security Dashboard - uses: github/codeql-action/upload-sarif@4f3212b61783c3c68e8309a0f18a699764811cda # v3.27.1 + uses: github/codeql-action/upload-sarif@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 if: steps.check_files.outputs.files_exists == 'true' continue-on-error: true with: diff --git a/.github/workflows/snyk.yml b/.github/workflows/snyk.yml index ac1490814a..a5d7c4b010 100644 --- a/.github/workflows/snyk.yml +++ b/.github/workflows/snyk.yml @@ -42,7 +42,7 @@ jobs: with: files: snyk.sarif - name: Upload result to GitHub Code Scanning - uses: github/codeql-action/upload-sarif@4f3212b61783c3c68e8309a0f18a699764811cda # v3.27.1 + uses: github/codeql-action/upload-sarif@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 if: steps.check_files.outputs.files_exists == 'true' with: sarif_file: snyk.sarif diff --git a/.github/workflows/trivy.yml b/.github/workflows/trivy.yml index 160045e7d1..5b807100bc 100644 --- a/.github/workflows/trivy.yml +++ b/.github/workflows/trivy.yml @@ -36,7 +36,7 @@ jobs: with: files: results.sarif - name: Upload result to GitHub Code Scanning - uses: github/codeql-action/upload-sarif@4f3212b61783c3c68e8309a0f18a699764811cda # v3.27.1 + uses: github/codeql-action/upload-sarif@ea9e4e37992a54ee68a9622e985e60c8e8f12d9f # v3.27.4 if: steps.check_files.outputs.files_exists == 'true' with: sarif_file: results.sarif diff --git a/caffeine/src/jmh/java/com/github/benmanes/caffeine/cache/SketchType.java b/caffeine/src/jmh/java/com/github/benmanes/caffeine/cache/SketchType.java index 271e1c9f55..f57b17b272 100644 --- a/caffeine/src/jmh/java/com/github/benmanes/caffeine/cache/SketchType.java +++ b/caffeine/src/jmh/java/com/github/benmanes/caffeine/cache/SketchType.java @@ -27,7 +27,19 @@ public enum SketchType { Flat { @Override public TinyLfuSketch create(long estimatedSize) { - return new CountMinSketch<>(estimatedSize); + var frequencySketch = new CountMinSketch(); + frequencySketch.ensureCapacity(estimatedSize); + return new TinyLfuSketch<>() { + @Override public int frequency(E e) { + return frequencySketch.frequency(e); + } + @Override public void increment(E e) { + frequencySketch.increment(e); + } + @Override public void reset() { + frequencySketch.reset(); + } + }; } }, Block { diff --git a/caffeine/src/jmh/java/com/github/benmanes/caffeine/cache/sketch/CountMinSketch.java b/caffeine/src/jmh/java/com/github/benmanes/caffeine/cache/sketch/CountMinSketch.java index b2990fb789..49db9d33c8 100644 --- a/caffeine/src/jmh/java/com/github/benmanes/caffeine/cache/sketch/CountMinSketch.java +++ b/caffeine/src/jmh/java/com/github/benmanes/caffeine/cache/sketch/CountMinSketch.java @@ -28,7 +28,7 @@ * * @author ben.manes@gmail.com (Ben Manes) */ -public final class CountMinSketch implements TinyLfuSketch { +public final class CountMinSketch { /* * This class maintains a 4-bit CountMinSketch [1] with periodic aging to provide the popularity @@ -63,9 +63,27 @@ public final class CountMinSketch implements TinyLfuSketch { long[] table; int size; - public CountMinSketch(@NonNegative long maximumSize) { + /** + * Creates a lazily initialized frequency sketch, requiring {@link #ensureCapacity} be called + * when the maximum size of the cache has been determined. + */ + @SuppressWarnings({"NullAway.Init", "PMD.UnnecessaryConstructor"}) + public CountMinSketch() {} + + /** + * Initializes and increases the capacity of this FrequencySketch instance, if necessary, + * to ensure that it can accurately estimate the popularity of elements given the maximum size of + * the cache. This operation forgets all previous counts when resizing. + * + * @param maximumSize the maximum size of the cache + */ + public void ensureCapacity(@NonNegative long maximumSize) { checkArgument(maximumSize >= 0); int maximum = (int) Math.min(maximumSize, Integer.MAX_VALUE >>> 1); + if ((table != null) && (table.length >= maximum)) { + return; + } + table = new long[(maximum == 0) ? 1 : IntMath.ceilingPowerOfTwo(maximum)]; tableMask = Math.max(0, table.length - 1); sampleSize = (maximumSize == 0) ? 10 : (10 * maximum); @@ -75,14 +93,25 @@ public CountMinSketch(@NonNegative long maximumSize) { size = 0; } + /** + * Returns if the sketch has not yet been initialized, requiring that {@link #ensureCapacity} is + * called before it begins to track frequencies. + */ + public boolean isNotInitialized() { + return (table == null); + } + /** * Returns the estimated number of occurrences of an element, up to the maximum (15). * * @param e the element to count occurrences of * @return the estimated number of occurrences of the element; possibly zero but never negative */ - @Override public @NonNegative int frequency(E e) { + if (isNotInitialized()) { + return 0; + } + int hash = spread(e.hashCode()); int start = (hash & 3) << 2; int frequency = Integer.MAX_VALUE; @@ -101,12 +130,15 @@ public CountMinSketch(@NonNegative long maximumSize) { * * @param e the element to add */ - @Override public void increment(E e) { + if (isNotInitialized()) { + return; + } + int hash = spread(e.hashCode()); int start = (hash & 3) << 2; - // Loop unrolling improves throughput + // Loop unrolling improves throughput by 5m ops/s int index0 = indexOf(hash, 0); int index1 = indexOf(hash, 1); int index2 = indexOf(hash, 2); @@ -140,7 +172,6 @@ boolean incrementAt(int i, int j) { } /** Reduces every counter by half of its original value. */ - @Override public void reset() { int count = 0; for (int i = 0; i < table.length; i++) { diff --git a/caffeine/src/main/java/com/github/benmanes/caffeine/cache/FrequencySketch.java b/caffeine/src/main/java/com/github/benmanes/caffeine/cache/FrequencySketch.java index 39c5e05d54..d3a40e893a 100644 --- a/caffeine/src/main/java/com/github/benmanes/caffeine/cache/FrequencySketch.java +++ b/caffeine/src/main/java/com/github/benmanes/caffeine/cache/FrequencySketch.java @@ -118,12 +118,13 @@ public boolean isNotInitialized() { * @param e the element to count occurrences of * @return the estimated number of occurrences of the element; possibly zero but never negative */ + @SuppressWarnings("Varifier") public @NonNegative int frequency(E e) { if (isNotInitialized()) { return 0; } - int[] count = new int[4]; + @Var int frequency = Integer.MAX_VALUE; int blockHash = spread(e.hashCode()); int counterHash = rehash(blockHash); int block = (blockHash & blockMask) << 3; @@ -131,9 +132,11 @@ public boolean isNotInitialized() { int h = counterHash >>> (i << 3); int index = (h >>> 1) & 15; int offset = h & 1; - count[i] = (int) ((table[block + offset + (i << 1)] >>> (index << 2)) & 0xfL); + int slot = block + offset + (i << 1); + int count = (int) ((table[slot] >>> (index << 2)) & 0xfL); + frequency = Math.min(frequency, count); } - return Math.min(Math.min(count[0], count[1]), Math.min(count[2], count[3])); + return frequency; } /** @@ -143,27 +146,37 @@ public boolean isNotInitialized() { * * @param e the element to add */ - @SuppressWarnings("ShortCircuitBoolean") + @SuppressWarnings({"ShortCircuitBoolean", "UnnecessaryLocalVariable"}) public void increment(E e) { if (isNotInitialized()) { return; } - int[] index = new int[8]; int blockHash = spread(e.hashCode()); int counterHash = rehash(blockHash); int block = (blockHash & blockMask) << 3; - for (int i = 0; i < 4; i++) { - int h = counterHash >>> (i << 3); - index[i] = (h >>> 1) & 15; - int offset = h & 1; - index[i + 4] = block + offset + (i << 1); - } + + // Loop unrolling improves throughput by 10m ops/s + int h0 = counterHash; + int h1 = counterHash >>> 8; + int h2 = counterHash >>> 16; + int h3 = counterHash >>> 24; + + int index0 = (h0 >>> 1) & 15; + int index1 = (h1 >>> 1) & 15; + int index2 = (h2 >>> 1) & 15; + int index3 = (h3 >>> 1) & 15; + + int slot0 = block + (h0 & 1); + int slot1 = block + (h1 & 1) + 2; + int slot2 = block + (h2 & 1) + 4; + int slot3 = block + (h3 & 1) + 6; + boolean added = - incrementAt(index[4], index[0]) - | incrementAt(index[5], index[1]) - | incrementAt(index[6], index[2]) - | incrementAt(index[7], index[3]); + incrementAt(slot0, index0) + | incrementAt(slot1, index1) + | incrementAt(slot2, index2) + | incrementAt(slot3, index3); if (added && (++size == sampleSize)) { reset(); diff --git a/examples/coalescing-bulkloader-reactor/gradle/libs.versions.toml b/examples/coalescing-bulkloader-reactor/gradle/libs.versions.toml index fbb72a7b9e..8ccad706c3 100644 --- a/examples/coalescing-bulkloader-reactor/gradle/libs.versions.toml +++ b/examples/coalescing-bulkloader-reactor/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] caffeine = "3.1.8" junit = "5.11.3" -reactor = "3.6.11" +reactor = "3.7.0" truth = "1.4.4" versions = "0.51.0" diff --git a/examples/coalescing-bulkloader-reactor/settings.gradle.kts b/examples/coalescing-bulkloader-reactor/settings.gradle.kts index a6d7b11339..149babf6c3 100644 --- a/examples/coalescing-bulkloader-reactor/settings.gradle.kts +++ b/examples/coalescing-bulkloader-reactor/settings.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("com.gradle.develocity") version "3.18.1" + id("com.gradle.develocity") version "3.18.2" id("com.gradle.common-custom-user-data-gradle-plugin") version "2.0.2" id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" } diff --git a/examples/graal-native/settings.gradle.kts b/examples/graal-native/settings.gradle.kts index 02882d1f2f..a5e4cd278c 100644 --- a/examples/graal-native/settings.gradle.kts +++ b/examples/graal-native/settings.gradle.kts @@ -5,7 +5,7 @@ pluginManagement { } } plugins { - id("com.gradle.develocity") version "3.18.1" + id("com.gradle.develocity") version "3.18.2" id("com.gradle.common-custom-user-data-gradle-plugin") version "2.0.2" id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" } diff --git a/examples/hibernate/gradle/libs.versions.toml b/examples/hibernate/gradle/libs.versions.toml index 3c59bb80ba..7a55326197 100644 --- a/examples/hibernate/gradle/libs.versions.toml +++ b/examples/hibernate/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] caffeine = "3.1.8" h2 = "2.3.232" -hibernate = "7.0.0.Beta1" +hibernate = "7.0.0.Beta2" junit = "5.11.3" log4j2 = "3.0.0-beta2" truth = "1.4.4" @@ -16,7 +16,7 @@ hibernate-jpamodelgen = { module = "org.hibernate.orm:hibernate-jpamodelgen", ve hibernate-hikaricp = { module = "org.hibernate.orm:hibernate-hikaricp", version.ref = "hibernate" } junit = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit" } log4j2-core = { module = "org.apache.logging.log4j:log4j-core", version.ref = "log4j2" } -log4j2-slf4j = { module = "org.apache.logging.log4j:log4j-slf4j-impl", version.ref = "log4j2" } +log4j2-slf4j = { module = "org.apache.logging.log4j:log4j-slf4j2-impl", version.ref = "log4j2" } truth = { module = "com.google.truth:truth", version.ref = "truth" } [bundles] diff --git a/examples/hibernate/settings.gradle.kts b/examples/hibernate/settings.gradle.kts index 7977731409..8a0dbec0f9 100644 --- a/examples/hibernate/settings.gradle.kts +++ b/examples/hibernate/settings.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("com.gradle.develocity") version "3.18.1" + id("com.gradle.develocity") version "3.18.2" id("com.gradle.common-custom-user-data-gradle-plugin") version "2.0.2" id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" } diff --git a/examples/indexable/settings.gradle.kts b/examples/indexable/settings.gradle.kts index 1f249f3f71..e17d97cef9 100644 --- a/examples/indexable/settings.gradle.kts +++ b/examples/indexable/settings.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("com.gradle.develocity") version "3.18.1" + id("com.gradle.develocity") version "3.18.2" id("com.gradle.common-custom-user-data-gradle-plugin") version "2.0.2" id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" } diff --git a/examples/resilience-failsafe/settings.gradle.kts b/examples/resilience-failsafe/settings.gradle.kts index 713d741f55..0ddb809517 100644 --- a/examples/resilience-failsafe/settings.gradle.kts +++ b/examples/resilience-failsafe/settings.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("com.gradle.develocity") version "3.18.1" + id("com.gradle.develocity") version "3.18.2" id("com.gradle.common-custom-user-data-gradle-plugin") version "2.0.2" id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" } diff --git a/examples/write-behind-rxjava/settings.gradle.kts b/examples/write-behind-rxjava/settings.gradle.kts index 420b8b47eb..d04c4ad195 100644 --- a/examples/write-behind-rxjava/settings.gradle.kts +++ b/examples/write-behind-rxjava/settings.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("com.gradle.develocity") version "3.18.1" + id("com.gradle.develocity") version "3.18.2" id("com.gradle.common-custom-user-data-gradle-plugin") version "2.0.2" id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" } diff --git a/gradle/config/spotbugs/exclude.xml b/gradle/config/spotbugs/exclude.xml index 7b7c99d0b8..45442f1632 100644 --- a/gradle/config/spotbugs/exclude.xml +++ b/gradle/config/spotbugs/exclude.xml @@ -299,6 +299,11 @@ + + + + + diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7bb06e2640..4184e3a7c0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -41,7 +41,7 @@ hamcrest = "3.0" hazelcast = "5.3.7" httpclient = "4.5.14" idea = "1.1.9" -jackrabbit = "1.70.0" +jackrabbit = "1.72.0" jackson = "2.18.1" jacoco = "0.8.12" jakarta-inject = "2.0.1" @@ -85,7 +85,7 @@ slf4j-test = "3.0.1" snakeyaml = "2.3" sonarqube = "5.1.0.4882" spotbugs = "4.8.6" -spotbugs-contrib = "7.6.6" +spotbugs-contrib = "7.6.8" spotbugs-plugin = "6.0.26" stream = "2.9.8" tcache = "2.0.1" @@ -95,7 +95,7 @@ univocity-parsers = "2.9.1" versions = "0.51.0" xz = "1.10" ycsb = "0.17.0" -zero-allocation-hashing = "0.26ea0" +zero-allocation-hashing = "0.27ea0" zstd = "1.5.6-7" [libraries] diff --git a/gradle/plugins/settings.gradle.kts b/gradle/plugins/settings.gradle.kts index d83f2ad927..613c7e28ec 100644 --- a/gradle/plugins/settings.gradle.kts +++ b/gradle/plugins/settings.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("com.gradle.develocity") version "3.18.1" + id("com.gradle.develocity") version "3.18.2" id("com.gradle.common-custom-user-data-gradle-plugin") version "2.0.2" id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" } diff --git a/settings.gradle.kts b/settings.gradle.kts index ceec1445ef..cab1d2d545 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -2,7 +2,7 @@ pluginManagement { includeBuild("gradle/plugins") } plugins { - id("com.gradle.develocity") version "3.18.1" + id("com.gradle.develocity") version "3.18.2" id("com.gradle.common-custom-user-data-gradle-plugin") version "2.0.2" id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" }