Skip to content

Update TinkerPop to 3.8.2, drop Java 8 and add Java 17/21/25 support [tp-tests][cql-tests] - #4948

Merged
porunov merged 1 commit into
JanusGraph:masterfrom
porunov:tinkerpop-3.8.2
Sep 16, 2026
Merged

porunov merged 1 commit into
JanusGraph:masterfrom
porunov:tinkerpop-3.8.2

Conversation

@porunov

@porunov porunov commented Sep 14, 2026

Copy link
Copy Markdown
Member

Updates Apache TinkerPop from 3.7.3 to 3.8.2 and aligns the transitive dependencies that TinkerPop 3.8.2 raised.

TinkerPop 3.8 requires Java 11 (TINKERPOP-3172; the 3.8.x parent POM enforces [11,26) and compiles with --release 11), so this upgrade also drops Java 8 support in JanusGraph and makes Java 11 the minimum. Closes #3547.

TinkerPop upgrade

  • tinkerpop.version 3.7.3 → 3.8.2, mkdocs.yml tinkerpop_version updated.
  • Code adapted to the 3.8 API changes: NoneStepDiscardStep (none() is now the none(P) collection filter), AggregateGlobalStep/AggregateLocalStepAggregateStep, P.originalValue removed (getValue()), HasContainerHolder is now generic (HasContainerHolder<S, E> extends GValueHolder<S, E>), PropertyMapStep carries a single valueTraversal instead of a TraversalRing, RangeGlobalStep#getLowRange()/getHighRange() return boxed Long, __.none()__.discard() in the shared test suite.
  • P.not(p) / p.negate() now produce a NotP wrapper instead of the complementary bi-predicate. JanusGraphPredicateUtils unwraps NotP.NotPBiPredicate and negates the JanusGraph predicate, so negated predicates keep being folded into JanusGraphStep / index queries (new JanusGraphPredicateUtilsTest).
  • GraphSON 1.0 with embedded types only deserializes explicitly allowed @class type ids since 3.8.2 (TINKERPOP-3279); without an allow-list the TinkerPop IoVertexTest[graphson-v1-embedded] cases fail on RelationIdentifier edge ids. JanusGraph.io() now allows JanusGraphIoRegistryV1d0.GRAPHSON_ALLOWED_TYPE_ID_NAMES (RelationIdentifier, Geoshape, JanusGraphP; an unmodifiable list, with JanusGraphIoRegistryV1d0.allowGraphSONTypeIds(builder) as the helper for hand-built mappers) on GraphSON 1.0 mappers, the shared JanusGraphIoTest does the same, and the commented GraphSONMessageSerializerV1 examples in conf/gremlin-server/*.yaml carry the matching allowedTypeIdNames.
  • TinkerPop 3.8's AddPropertyStep always resolves the cardinality of property(key, value) through Graph.Features.VertexFeatures.getCardinality(key) (3.7 only did so for meta-properties). JanusGraph's implementation looked the key up in a fresh read-only transaction, so a key auto-created in the still-open calling transaction resolved to single and g.V(v).property("k", v) wiped LIST/SET values (testAutoSchemaMakerAllowsToSetCardinality* failed). JanusGraphFeatures is now bound to the calling transaction (JanusGraphBlueprintsTransaction.features()), which also avoids opening a transaction per property() call.
  • TinkerPop 3.8's RepeatStep adds all start traversers to the repeat traversal at once whenever the repeat traversal contains a Barrier (TINKERPOP-3200). JanusGraph's limited-batch multi-query inserts JanusGraphNoOpBarrierVertexOnlySteps into repeat traversals, which would switch every repeat() into that mode (all starts held in memory, barrier(n).repeat(...) no longer bounding batches: the has()-in-repeat prefetch became a single query for all 100 vertices instead of 27-vertex batches). TinkerPop 3.8.2 un-finalized RepeatStep for providers, so JanusGraphMultiQueryStrategy now replaces RepeatStep with JanusGraphRepeatStep, which ignores JanusGraph's own barriers when choosing between TinkerPop's per-start and global algorithms and otherwise behaves exactly like RepeatStep. The three testLimitBatchSizeForMultiQueryRepeatStep cases with a user barrier() inside repeat() that used to be "batched per iteration" are now batched per loop under TinkerPop's global semantics; their assertions were updated accordingly.
  • All 13 @Graph.OptOut entries on JanusGraph were verified against the gremlin-test 3.8.2 sources (the suite fails hard on entries naming removed tests); all still resolve.
  • Every TinkerPop class referenced by the bundled Gremlin Server YAML configs still exists in 3.8.2.

Dependencies aligned with TinkerPop 3.8.2 (enforcer requireUpperBoundDeps)

Dependency Before After
Netty 4.1.118.Final 4.1.138.Final (latest 4.1.x; TinkerPop 3.8.2 and the Cassandra driver 4.19.3 are built against 4.1, so the 4.2 line is left for a separate change)
commons-configuration2 2.10.1 2.15.1
commons-lang3 3.18.0 3.20.0
commons-text 1.12.0 1.15.0
commons-beanutils 1.9.4 1.11.0
commons-logging 1.3.4 1.4.0
Hadoop 3.4.1 3.4.3
Avro (via Hadoop 3.4.3) 1.11.3 1.11.4
Jetty (via Hadoop 3.4.3) 9.4.56.v20240826 9.4.57.v20241219
Mockito (test) 4.11.0 5.23.0 (mockito-inline dropped — the inline mock maker is the default in Mockito 5)
byte-buddy (test) 1.15.1 1.17.7
JUnit / Platform (test) 5.11.0 / 1.11.0 5.14.4 / 1.14.4 (JUnit 6 requires Java 17, so 5.14 is the ceiling for a Java 11 baseline)

JUnit 5.13 removed the old ArgumentsProvider.provideArguments(ExtensionContext) path, which breaks rerunner-jupiter's @ParameterizedRepeatedIfExceptionsTest (last released in 2020): the four simpleLogTest*(boolean) retries in CQLGraphTest/CQLGraphCacheTest failed in CI with "Please implement provideArguments(ParameterDeclarations, ExtensionContext) instead". Those tests are now expanded into one @RepeatedIfExceptionsTest per parameter value (...WithLongId / ...WithStringId); the non-parameterized rerunner annotation used by the other 29 tests is unaffected.

gremlin-server 3.8.2 adds one new compile-scope dependency, io.github.hakky54:ayza-for-netty (Apache-2.0), which therefore ends up in janusgraph-server / the distribution.

Java 11 minimum, Java 17 / 21 / 25 supported

  • Compilation uses --release 11 (compiler.release) instead of source/target 1.8, so builds on newer JDKs cannot pick up post-11 APIs. The java-11 Maven profile (root and janusgraph-dist) is removed since it is now the default; with it go the janusgraph-java-11-* distribution archives and the -java-11 Docker tag suffix.
  • janusgraph-driver moves to Java 11 as well: its TinkerPop dependencies (gremlin-driver, gremlin-core, gremlin-groovy 3.8.2) are compiled for Java 11 (class-file major version 55), so a Java 8 target for the driver could not run on Java 8 anyway.
  • New jdk17-plus-tests profile (auto-activated on JDK 17+) passes TinkerPop's JDK 17 --add-opens/--add-exports set to the test JVMs (also wired into the CQL/Scylla module test.jvm.opts). JaCoCo 0.8.12 → 0.8.15 for Java 25 class files.
  • Tests adapted for JDK 25: java.net.InetAddress is sealed since JDK 25 and can no longer be mocked (two server tests now use InetAddress.getLoopbackAddress()).
  • Two CQL tests used the Field.class.getDeclaredField("modifiers") hack to rewrite static final fields, which JDK 12+ rejects (NoSuchFieldException: modifiers, visible in the cassandra5-*-diskstorage-java25 lanes): CQLStoreTest.testGetKeysWithout{Ordered,Unordered}Scan now build the modified StandardStoreFeatures via the builder's copy constructor and open a dedicated store from a Mockito spy of the manager that reports them, and TestLoggerUtils (used by CQLMultiWriteStoreTest's session-leak tests) now captures the driver's log events through Log4j 2 (the CQL test classpath binds SLF4J to log4j-slf4j-impl): it temporarily adds a LoggerConfig with an in-memory appender for the class under test instead of swapping the driver's private static final logger field.
  • HBase on Java 25: hbase-shaded-client resolves the current user through Hadoop's UserGroupInformation, and with janusgraph-hadoop on the classpath that class came from Spark's transitive hadoop-client-api 3.3.2, which still calls Subject.getSubject() and therefore throws UnsupportedOperationException: getSubject is not supported on JDK 24+. hadoop-client-api/hadoop-client-runtime are now managed to ${hadoop.version} (3.4.3, which dropped that call, like the rest of the Hadoop artifacts), verified with a small probe (HBaseConfiguration.create(), UserGroupInformation.getCurrentUser(), User.getCurrent()) on JDK 17, 21 and 25 against the module's runtime classpath.
  • CI matrix: the core suites (core, driver, server, test, inmemory incl. TinkerPop suites, berkeleyje, lucene) run on Java 11, 17, 21 and 25; the Docker-backed backend/index suites (CQL on Cassandra 5, Scylla, HBase, Elasticsearch, Solr) run on Java 11 and 25; CDC runs unit tests on 11/25 and the Debezium end-to-end pipeline on 17/21; the TinkerPop suites of ci-release run on 11/17/21/25 for inmemory/berkeleyje and additionally on 25 for CQL. OLAP lanes (**/hadoop/*) run on Java 11 and 17 only because Spark 3.3.x does not run on Java 21+ (see TinkerPop's spark-gremlin note); build-all, publish, release/dist, docs and benchmark jobs stay on Java 11 (the janusgraph-full distribution embeds Cassandra 4.0.6, which only runs on Java 8/11). Every Java 8 lane is removed and -Pjava-11 is stripped (the *-dummy workflows mirror the lane sets).
  • Distribution: conf/jvm-8.options removed, bin/janusgraph-server.sh always reads conf/jvm-11.options unless JAVA_OPTIONS_FILE is set; Dockerfile default BUILD_PATH follows the new archive name.
  • Docs: installation/BUILDING/examples README mention Java 11; the changelog's 1.2.0 section documents the Java 11 requirement and the notable TinkerPop 3.8 breaking changes with links to the TinkerPop upgrade guides; compatibility matrix row for 1.2.z lists TinkerPop 3.8.z.

Follow-ups that are now unblocked but intentionally left out of this PR: bundling Cassandra 5.0 in the distribution, Caffeine 3 / checkstyle 10 / audience-annotations 0.15 (listed in #3547), and adding Java 17/21 CI lanes.

Verification (local, Java 11.0.31, Maven 3.9.16)

  • mvn -B -fae validate (enforcer requireUpperBoundDeps + DependencyConvergence over all 32 modules): passes.
  • mvn -B install -DskipTests (main + test sources of all 32 modules, checkstyle on): passes.
  • TinkerPop suites, mvn verify --projects janusgraph-inmemory -Dtest.skip.tp=false -DskipTests=true (InMemoryJanusGraphProcessTest, InMemoryMultiQueryJanusGraphProcessTest, InMemoryJanusGraphComputerTest, InMemoryJanusGraphStructureTest): 3431 tests, 0 failures, 0 errors, 294 skipped.
  • Module suites (mvn verify --projects <module>): janusgraph-driver 127 tests, janusgraph-server 175 tests, janusgraph-core 82, janusgraph-test 998, janusgraph-inmemory 572, janusgraph-berkeleyje 331, janusgraph-lucene 355, janusgraph-mixed-index-utils 16, janusgraph-cdc 49–51, the Mockito-based janusgraph-es unit tests 39 — all green.
  • The same set was run on Java 17, 21 and 25 (clean install with each JDK's javac + --release 11, then the suites above plus the TinkerPop process/structure suites, 2741 tests per JDK; -Pcoverage with JaCoCo 0.8.15 on core) — all green.
  • Docker-backed smoke tests on Java 25: CQL on Cassandra 5.0 (CQLKeyColumnValueStoreTest plus the rewritten simpleLogTest* retries of CQLGraphTest/CQLGraphCacheTest), Elasticsearch 9 (ElasticsearchIndexTest, 266 tests), Solr 8 (SolrIndexWithoutKerberosTest, 256 tests) — green. The HBase Docker image cannot be built on this machine (its apt-get step fails locally), so HBase on 25 was verified with the UserGroupInformation/User.getCurrent() probe described above and is otherwise left to the new hbase2-*-java25 CI lanes.
  • OLAP module (janusgraph-hadoop, Spark 3.3.2 with the aligned Hadoop 3.4.3 client artifacts) passes on Java 11 and 17.
  • Copilot review follow-ups: changelog edits limited to the 1.2.0 section, recursive RepeatStep replacement with an exact-class filter (strategy and test helper), per-transaction caching of the features view, immutable GraphSON allow-list plus helper, type-checked Log4j context in the CQL log-capture helper, mkdocs.yml hadoop_version 3.3.6 → 3.4.3 (it only feeds the Hadoop docs link), and the ci-release tp-tests job now installs ${{ matrix.java }} instead of the hard-coded Zulu 11.0.20+1, so its Java 17/21/25 TinkerPop lanes really run on those JDKs (build-all/dist-tests keep the pinned Java 11 build used for the release artifacts).
  • Remaining Docker-backed matrices (CQL/Scylla/HBase full lanes, CDC end-to-end) are left to CI; the PR title carries [tp-tests][cql-tests] so the TinkerPop suites also run against BerkeleyJE/CQL/HBase and the full CQL matrix runs.

Thank you for contributing to JanusGraph!

In order to streamline the review of the contribution we ask you
to ensure the following steps have been taken:

For all changes:

  • Is there an issue associated with this PR? Is it referenced in the commit message?
  • Does your PR body contain #xyz where xyz is the issue number you are trying to resolve?
  • Has your PR been rebased against the latest commit within the target branch (typically master)?
  • Is your initial contribution a single, squashed commit?

For code changes:

  • Have you written and/or updated unit tests to verify your changes?
  • If adding new dependencies to the code, are these dependencies licensed in a way that is compatible for inclusion under ASF 2.0?
  • If applicable, have you updated the LICENSE.txt file, including the main LICENSE.txt file in the root of this repository?
  • If applicable, have you updated the NOTICE.txt file, including the main NOTICE.txt file found in the root of this repository?

For documentation related changes:

  • Have you ensured that format looks appropriate for the output in which it is rendered?

🤖 Generated with Claude Code

@porunov porunov changed the title Update TinkerPop to 3.8.2 and drop Java 8 support [tp-tests][cql-tests] Update TinkerPop to 3.8.2, drop Java 8 and add Java 17/21/25 support [tp-tests][cql-tests] Sep 14, 2026
@porunov
porunov force-pushed the tinkerpop-3.8.2 branch 2 times, most recently from 7ca4c52 to e3d3703 Compare September 14, 2026 20:19
@porunov porunov added this to the 1.2.0 milestone Sep 14, 2026
@porunov porunov added area/tinkerpop java Pull requests that update Java code labels Sep 14, 2026
@porunov
porunov requested a balanced review from Copilot September 14, 2026 21:29

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Warning

Copilot couldn't run its full agentic review because it didn't start before the timeout. Make sure your repository has a runner available, or add a copilot-code-review.yml file specifying one with the runs-on attribute. See the docs for more details.

Pull request overview

Upgrades Apache TinkerPop to 3.8.2 and aligns JanusGraph’s build/test/runtime ecosystem with a Java 11 minimum (plus tests/CI for newer JDKs), including code/test adaptations for TinkerPop 3.8 API/semantic changes and updated transitive dependency versions.

Changes:

  • Bump TinkerPop and related dependency versions; switch compilation to --release 11 and introduce JDK17+ test JVM options.
  • Adapt core code and tests to TinkerPop 3.8 changes (e.g., DiscardStep, AggregateStep, GraphSON v1 allow-list, NotP handling, repeat/barrier semantics).
  • Update CI workflows, distribution scripts/configs, and documentation for the Java 11+ baseline and new test matrix.

Reviewed changes

Copilot reviewed 69 out of 70 changed files in this pull request and generated no comments.

Show a summary per file
File Description
pom.xml Updates core dependency versions, Java compilation to --release 11, and adds JDK17+ test JVM opts/profile.
mkdocs.yml Updates documented TinkerPop version to 3.8.2.
janusgraph-test/src/test/java/org/janusgraph/graphdb/tinkerpop/optimize/JanusGraphStepStrategyTest.java Adjusts tests for RepeatStep replacement and boxed range API.
janusgraph-test/src/test/java/org/janusgraph/graphdb/tinkerpop/optimize/JanusGraphMultiQueryStrategyTest.java Updates assertions to expect JanusGraphRepeatStep.
janusgraph-test/src/test/java/org/janusgraph/graphdb/tinkerpop/optimize/AdjacentVertexHasUniquePropertyOptimizerStrategyTest.java Updates tests from NoneStep to DiscardStep.
janusgraph-test/src/test/java/org/janusgraph/graphdb/query/JanusGraphPredicateUtilsTest.java Adds coverage for NotP-wrapped predicate conversion/support checks.
janusgraph-server/src/test/java/org/janusgraph/graphdb/tinkerpop/gremlin/server/handler/SaslAndHMACAuthenticationHandlerTest.java Updates handler construction to use Settings.
janusgraph-server/src/test/java/org/janusgraph/graphdb/tinkerpop/gremlin/server/auth/SaslAndHMACAuthenticatorTest.java Avoids mocking sealed InetAddress by using loopback.
janusgraph-server/src/test/java/org/janusgraph/graphdb/tinkerpop/gremlin/server/auth/HMACAuthenticatorTest.java Avoids mocking sealed InetAddress by using loopback.
janusgraph-scylla/pom.xml Propagates JDK-dependent test JVM opts into module test opts.
janusgraph-examples/README.md Updates prerequisites to Java 11+.
janusgraph-es/pom.xml Switches test dependency usage away from mockito-inline.
janusgraph-driver/src/main/java/org/janusgraph/graphdb/tinkerpop/JanusGraphIoRegistryV1d0.java Adds GraphSON v1 allowed type-id names constant for embedded types.
janusgraph-dist/src/assembly/static/conf/jvm-8.options Removes Java 8 JVM options file from the distribution.
janusgraph-dist/src/assembly/static/conf/gremlin-server/gremlin-server.yaml Updates GraphSON v1 serializer example with allowedTypeIdNames.
janusgraph-dist/src/assembly/static/conf/gremlin-server/gremlin-server-hbase.yaml Updates GraphSON v1 serializer example with allowedTypeIdNames.
janusgraph-dist/src/assembly/static/conf/gremlin-server/gremlin-server-hbase-es.yaml Updates GraphSON v1 serializer example with allowedTypeIdNames.
janusgraph-dist/src/assembly/static/conf/gremlin-server/gremlin-server-cql.yaml Updates GraphSON v1 serializer example with allowedTypeIdNames.
janusgraph-dist/src/assembly/static/conf/gremlin-server/gremlin-server-cql-es.yaml Updates GraphSON v1 serializer example with allowedTypeIdNames.
janusgraph-dist/src/assembly/static/conf/gremlin-server/gremlin-server-configuration.yaml Updates GraphSON v1 serializer example with allowedTypeIdNames.
janusgraph-dist/src/assembly/static/conf/gremlin-server/gremlin-server-berkeleyje.yaml Updates GraphSON v1 serializer example with allowedTypeIdNames.
janusgraph-dist/src/assembly/static/conf/gremlin-server/gremlin-server-berkeleyje-es.yaml Updates GraphSON v1 serializer example with allowedTypeIdNames.
janusgraph-dist/src/assembly/static/bin/janusgraph-server.sh Defaults JVM options to jvm-11.options (no Java 8 branching).
janusgraph-dist/pom.xml Removes Java-11-specific dist profile naming/tagging.
janusgraph-dist/docker/Dockerfile Updates build artifact path naming for new distribution archives.
janusgraph-dist/README.md Removes -Pjava-11 from build instructions.
janusgraph-cql/src/test/java/org/janusgraph/testutil/TestLoggerUtils.java Replaces reflection-based logger swapping with Log4j2 capture appender approach.
janusgraph-cql/src/test/java/org/janusgraph/graphdb/cql/CQLGraphTest.java Reworks flaky parameterized retry tests to non-parameterized retries for JUnit 5.13+.
janusgraph-cql/src/test/java/org/janusgraph/graphdb/cql/CQLGraphCacheTest.java Same rerunner-jupiter workaround expansion as CQLGraphTest.
janusgraph-cql/src/test/java/org/janusgraph/diskstorage/cql/CQLStoreTest.java Removes static-final reflection hacks; uses feature builder + manager spy.
janusgraph-cql/src/test/java/org/janusgraph/diskstorage/cql/CQLMultiWriteStoreTest.java Adapts session leak logging assertions to new log capture mechanism.
janusgraph-cql/pom.xml Propagates JDK-dependent test JVM opts into module test opts.
janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/optimize/strategy/JanusGraphMultiQueryStrategy.java Introduces RepeatStep replacement for limited-batch semantics under TinkerPop 3.8.
janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/optimize/strategy/AdjacentVertexHasUniquePropertyOptimizerStrategy.java Updates NoneStep usage to DiscardStep.
janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/optimize/step/JanusGraphStep.java Updates HasContainerHolder implementation to new generic signature.
janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/optimize/step/JanusGraphRepeatStep.java Adds custom RepeatStep to ignore JanusGraph-inserted barriers for global-repeat switching.
janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/optimize/step/JanusGraphPropertyMapStep.java Adapts to PropertyMapStep API change (single valueTraversal).
janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/optimize/step/HasStepFolder.java Updates HasContainerHolder typing/casts for generic signature.
janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/optimize/JanusGraphTraversalUtil.java Replaces Aggregate* steps with unified AggregateStep.
janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/JanusGraphFeatures.java Binds schema-dependent features to calling transaction where possible.
janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/JanusGraphBlueprintsTransaction.java Returns transaction-bound features view.
janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/JanusGraphBlueprintsGraph.java Adds GraphSON v1 allowed-type-id names automatically for embedded types.
janusgraph-core/src/main/java/org/janusgraph/graphdb/query/JanusGraphPredicateUtils.java Unwraps NotP for negated predicate pushdown.
janusgraph-core/src/main/java/org/janusgraph/graphdb/predicate/ConnectiveJanusGraphP.java Updates P.originalValue usage to getValue().
janusgraph-backend-testutils/src/main/java/org/janusgraph/graphdb/JanusGraphTest.java Updates multi-query repeat batching assertions and discard() usage.
janusgraph-backend-testutils/src/main/java/org/janusgraph/graphdb/JanusGraphIoTest.java Adds allowed GraphSON v1 embedded type ids to mapper used in tests.
janusgraph-backend-testutils/src/main/java/org/janusgraph/graphdb/JanusGraphIndexTest.java Adjusts sum() assertions to account for TinkerPop 3.8 numeric retention.
docs/getting-started/installation.md Updates runtime requirements to Java 11+ and documents tested JDKs.
docs/changelog.md Updates compatibility matrix and adds detailed upgrade notes for Java 11+ and TinkerPop 3.8.
BUILDING.md Updates build prerequisites to Java 11+.
.github/workflows/ci-release.yml Drops Java 8 lanes; runs build/tests on supported JDKs.
.github/workflows/ci-release-dummy.yml Mirrors CI lane changes (no Java 8 / no -Pjava-11).
.github/workflows/ci-publish-official.yml Updates publish job Java version to 11.
.github/workflows/ci-publish-commit.yml Updates publish job Java version to 11.
.github/workflows/ci-index-solr.yml Moves index suite baseline to Java 11 and adds Java 25 lane.
.github/workflows/ci-index-solr-dummy.yml Mirrors Solr index CI lane changes.
.github/workflows/ci-index-es.yml Moves index suite baseline to Java 11 and adds Java 25 lanes.
.github/workflows/ci-index-es-dummy.yml Mirrors ES index CI lane changes.
.github/workflows/ci-docs.yml Moves docs build baseline to Java 11 and removes -Pjava-11.
.github/workflows/ci-core.yml Drops Java 8 lanes and expands core test matrix to 11/17/21/25.
.github/workflows/ci-core-dummy.yml Mirrors core CI lane changes.
.github/workflows/ci-cdc.yml Shifts CDC baseline to 11/25 and e2e lanes to 17/21.
.github/workflows/ci-cdc-dummy.yml Mirrors CDC CI lane changes.
.github/workflows/ci-benchmark.yml Moves benchmark workflow baseline to Java 11.
.github/workflows/ci-backend-scylla.yml Drops Java 8 lanes; adds Java 25 (and Java 17 for Hadoop lanes).
.github/workflows/ci-backend-scylla-dummy.yml Mirrors Scylla backend CI lane changes.
.github/workflows/ci-backend-hbase.yml Drops Java 8 lanes; adds Java 25 (and Java 17 for Hadoop lanes).
.github/workflows/ci-backend-hbase-dummy.yml Mirrors HBase backend CI lane changes.
.github/workflows/ci-backend-cql.yml Drops Java 8 lanes; adds Java 25 (and Java 17 for Hadoop lanes).
.github/workflows/ci-backend-cql-dummy.yml Mirrors CQL backend CI lane changes.
Suppressed comments (3)

pom.xml:1

  • This execution overrides the default Surefire configuration, but the new argLine only includes ${test.jdk.jvm.opts}. That likely drops the rest of the repo’s standard test JVM flags (heap sizing, -ea, javaagent/JaCoCo instrumentation, etc.), which can change test behavior and coverage output. Consider composing argLine to include the existing/default test argLine plus ${test.jdk.jvm.opts} (rather than replacing it), so this execution stays consistent with the normal test JVM setup.
    janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/optimize/strategy/JanusGraphMultiQueryStrategy.java:1
  • TraversalHelper.getStepsOfClass(RepeatStep.class, traversal) only finds RepeatSteps at the current traversal level (non-recursive). Since multi-query barriers can be inserted into repeat traversals that are nested under other steps, leaving nested RepeatSteps unwrapped can still trigger TinkerPop’s global repeat/barrier behavior and negate limited-batch semantics. Use the recursive step lookup (as done in JanusGraphStepStrategyTest) and pass the actual owning traversal (e.g., repeatStep.getTraversal()) to ensure all repeat steps in the traversal tree are replaced correctly.
    docs/changelog.md:1
  • This change appears under the JanusGraph 1.1.0 section (and similarly later for 1.0.1), but it updates the listed TinkerPop/Java versions to 3.8.2 and Java 11/17/21/25. Those versions are not historically accurate for already-released 1.1.0/1.0.1 and will mislead readers. Recommendation: limit these version updates to the 1.2.0 section and the compatibility matrix row for 1.2.z, and keep older release sections unchanged (or explicitly annotate them if the intent is different).
# Changelog

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Warning

Copilot couldn't run its full agentic review because it didn't start before the timeout. Make sure your repository has a runner available, or add a copilot-code-review.yml file specifying one with the runs-on attribute. See the docs for more details.

Pull request overview

Copilot reviewed 69 out of 70 changed files in this pull request and generated no new comments.

Suppressed comments (5)

mkdocs.yml:1

  • hadoop_version in mkdocs.yml remains 3.3.6 while this PR upgrades/manages Hadoop to 3.4.3 in pom.xml. Update the docs metadata to reflect the new Hadoop version (or clarify why the docs still reference 3.3.6) to avoid confusing readers.
    janusgraph-driver/src/main/java/org/janusgraph/graphdb/tinkerpop/JanusGraphIoRegistryV1d0.java:1
  • This is a public allow-list used for deserialization control, but it’s exposed as a mutable array. Any caller can modify its contents at runtime, potentially widening the GraphSON type allow-list unexpectedly. Prefer an immutable type (e.g., List<String>) or keep the array private and expose a defensive copy.
    janusgraph-test/src/test/java/org/janusgraph/graphdb/tinkerpop/optimize/JanusGraphStepStrategyTest.java:1
  • getStepsOfAssignableClassRecursively(RepeatStep.class, ...) will also return subclasses (including JanusGraphRepeatStep). Unlike the production strategy (which filters on repeatStep.getClass() == RepeatStep.class), this helper will re-wrap already replaced steps, making the helper diverge from real behavior and potentially masking regressions. Consider filtering to only replace exact RepeatStep instances (or explicitly skipping JanusGraphRepeatStep).
    janusgraph-core/src/main/java/org/janusgraph/graphdb/tinkerpop/JanusGraphFeatures.java:1
  • forTransaction(..) allocates a new JanusGraphFeatures instance each time it’s called. Since JanusGraphBlueprintsTransaction.features() may be invoked frequently by TinkerPop during mutations, consider caching the transaction-bound Features view per transaction to reduce allocations (optional optimization).
    janusgraph-cql/src/test/java/org/janusgraph/testutil/TestLoggerUtils.java:1
  • LogManager.getContext(false) returns the Log4j SPI LoggerContext, which is not guaranteed to be org.apache.logging.log4j.core.LoggerContext in all setups (e.g., when using alternative context factories/bridges). To make this test utility more robust, avoid an unconditional cast (e.g., verify the type and fail with a clear message or skip capture if Log4j-core isn’t active).

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 Changes recommended

The release TinkerPop matrix declares Java 17/21/25 lanes but installs Java 11 for every lane.

Get a fresh assessment by requesting another Copilot review.

Review details
  • Files reviewed: 69/70 changed files
  • Comments generated: 1
  • Review effort level: Balanced

Comment thread .github/workflows/ci-release.yml
TinkerPop 3.8 requires Java 11, so JanusGraph now compiles for (with
`--release 11`) and requires Java 11 (closes JanusGraph#3547). The `java-11` Maven
profile, the `janusgraph-java-11-*` distribution flavour, the `-java-11`
Docker tag suffix and `conf/jvm-8.options` are removed. janusgraph-driver
moves to Java 11 too since its TinkerPop dependencies are Java 11 bytecode.

JanusGraph is now built and tested on Java 11, 17, 21 and 25: the core
suites run on all four in CI, the Docker-backed backend/index suites on
11 and 25, CDC end-to-end on 17/21, while OLAP lanes stay on 11/17
because Spark 3.3.x does not run on Java 21+. A `jdk17-plus-tests`
profile passes TinkerPop's JDK 17 `--add-opens` set to the test JVMs,
JaCoCo is bumped to 0.8.15 for Java 25 class files, two server tests
stop mocking the (since JDK 25 sealed) java.net.InetAddress, and
hadoop-client-api/runtime are managed to 3.4.3 so the HBase client no
longer hits the removed Subject.getSubject() on Java 24+. Two CQL tests
no longer rewrite static final fields through the JDK 12+ incompatible
Field "modifiers" hack (features spy / Log4j 2 log capture instead).

Dependencies aligned with TinkerPop 3.8.2 (enforcer requireUpperBoundDeps):
netty 4.1.138.Final, commons-configuration2 2.15.1, commons-lang3 3.20.0,
commons-text 1.15.0, commons-beanutils 1.11.0, commons-logging 1.4.0,
hadoop 3.4.3 (avro 1.11.4, jetty 9.4.57.v20241219), mockito 5.23.0
(mockito-inline dropped, inline mock maker is the default), byte-buddy
1.17.7, junit 5.14.4 / junit-platform 1.14.4. JUnit 5.13 breaks
rerunner-jupiter's @ParameterizedRepeatedIfExceptionsTest, so the four
CQL simpleLogTest retries are expanded into per-parameter
@RepeatedIfExceptionsTest methods.

Code adapted to the TinkerPop 3.8 API: NoneStep -> DiscardStep,
AggregateGlobalStep/AggregateLocalStep -> AggregateStep, P.originalValue
-> P.getValue(), generic HasContainerHolder<S, E>, PropertyMapStep's
single value traversal instead of a TraversalRing, boxed RangeGlobalStep
bounds, `__.none()` -> `__.discard()` in tests, and NotP unwrapping in
JanusGraphPredicateUtils so `P.not()`/`negate()` predicates keep being
pushed down to the backend.

GraphSON 1.0 embedded types only deserialize explicitly allowed `@class`
type ids since 3.8.2 (TINKERPOP-3279), so JanusGraph.io() now registers
RelationIdentifier, Geoshape and JanusGraphP as allowed type ids for
GraphSON 1.0 mappers (JanusGraphIoRegistryV1d0.GRAPHSON_ALLOWED_TYPE_ID_NAMES)
and the sample GraphSONMessageSerializerV1 configs carry the matching
`allowedTypeIdNames`.

Docs: changelog (Java 11 requirement, TinkerPop 3.8 breaking changes,
compatibility matrix), installation/BUILDING/examples Java version,
mkdocs tinkerpop_version.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: Oleksandr Porunov <alexandr.porunov@gmail.com>

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔵 Needs a closer look

The cross-cutting dependency, runtime-semantics, serialization, distribution, and CI changes warrant final human validation.

Review details
  • Files reviewed: 69/70 changed files
  • Comments generated: 0 new
  • Review effort level: Balanced

@porunov
porunov merged commit 5e444c4 into JanusGraph:master Sep 16, 2026
260 of 262 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/tinkerpop java Pull requests that update Java code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Drop support for Java 8

2 participants