Support IPv6 endpoint URLs#18162
Conversation
21dc1a9 to
4f65a99
Compare
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## master #18162 +/- ##
============================================
+ Coverage 41.77% 41.92% +0.15%
Complexity 318 318
============================================
Files 5297 5298 +1
Lines 374235 374564 +329
Branches 48313 48386 +73
============================================
+ Hits 156326 157040 +714
+ Misses 217909 217524 -385 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
4f65a99 to
e8bdb6c
Compare
There was a problem hiding this comment.
Pull request overview
This PR strengthens IPv6 endpoint support across Apache IoTDB by centralizing canonical endpoint formatting/parsing (notably [ipv6]:port) and reusing it consistently throughout server, clients, and tests, including handling wildcard/bind-all addresses correctly.
Changes:
- Centralize endpoint URL formatting/parsing via shared
UrlUtilsand reuse it across node URL utilities, Ratis peer addressing, client redirection/refresh paths, pipe sink displays, and metrics URLs. - Extend Java/JDBC, Python, and C++ clients to support bracketed IPv6 endpoint URLs and to treat IPv4/IPv6 wildcard addresses as non-connectable remote endpoints.
- Add integration and unit tests validating IPv6 loopback connectivity, malformed bracketed forms, and IPv6 cluster behavior.
Reviewed changes
Copilot reviewed 35 out of 35 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| iotdb-core/node-commons/src/test/java/org/apache/iotdb/commons/utils/NodeUrlUtilsTest.java | Adds assertions validating canonical bracketed IPv6 formatting in node URL conversions. |
| iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/NodeUrlUtils.java | Switches endpoint URL conversion/parsing to shared UrlUtils for IPv6-safe formatting. |
| iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template | Updates config comments to document [ipv6]:port examples and hostname support. |
| iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/sys/TestConnectionTask.java | Uses shared endpoint formatter for displaying endpoints in test-connection output. |
| iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/protocol/thrift/async/IoTDBDataRegionAsyncSink.java | Uses shared endpoint formatter to render endpoints (incl. IPv6) safely. |
| iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/client/IoTDBDataNodeAsyncClientManager.java | Uses shared endpoint formatter to generate stable resource keys for endpoints. |
| iotdb-core/consensus/src/test/java/org/apache/iotdb/consensus/ratis/utils/UtilsTest.java | Adds round-trip and malformed-input tests for Ratis peer address parsing/formatting with IPv6. |
| iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/ratis/utils/Utils.java | Replaces split(":") parsing/formatting with shared IPv6-safe endpoint utilities. |
| iotdb-core/ainode/resources/conf/iotdb-ainode.properties | Documents bracketed IPv6 endpoint configuration and hostname support. |
| iotdb-core/ainode/iotdb/ainode/core/ingress/iotdb.py | Adds endpoint formatting helper to produce bracketed IPv6 node URLs for downstream clients. |
| iotdb-core/ainode/iotdb/ainode/core/config.py | Adds bracketed IPv6 parsing support for endpoint URLs in AINode config loading. |
| iotdb-client/session/src/main/java/org/apache/iotdb/session/SessionConnection.java | Uses shared endpoint formatter when building reconnection failure messages. |
| iotdb-client/session/src/main/java/org/apache/iotdb/session/Session.java | Treats wildcard IPv4/IPv6 addresses as non-connectable during redirection handling. |
| iotdb-client/session/src/main/java/org/apache/iotdb/session/pool/SessionPool.java | Formats initial node URLs using IPv6-safe shared formatter. |
| iotdb-client/session/src/main/java/org/apache/iotdb/session/NodesSupplier.java | Skips wildcard IPv4/IPv6 addresses when refreshing available nodes. |
| iotdb-client/service-rpc/src/test/java/org/apache/iotdb/rpc/UrlUtilsTest.java | Adds tests for bracketed IPv6 conversion/parsing and wildcard detection. |
| iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/UrlUtils.java | Introduces canonical [ipv6]:port formatting/parsing and wildcard-address detection. |
| iotdb-client/jdbc/src/test/java/org/apache/iotdb/jdbc/UtilsTest.java | Adds JDBC URL parsing tests for bracketed IPv6 (including SSL query params) and malformed inputs. |
| iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/Utils.java | Updates JDBC URL parsing to correctly handle bracketed IPv6 host/port. |
| iotdb-client/client-py/tests/unit/test_session_node_url.py | Adds Python unit tests for bracketed/legacy IPv6 parsing and wildcard detection. |
| iotdb-client/client-py/iotdb/Session.py | Adds IPv6-aware endpoint parsing and wildcard-address filtering for redirection. |
| iotdb-client/client-cpp/src/session/Session.cpp | Treats wildcard IPv4/IPv6 addresses as non-connectable during redirection handling. |
| iotdb-client/client-cpp/src/rpc/RpcCommon.h | Declares wildcard-address detection utility for C++ client. |
| iotdb-client/client-cpp/src/rpc/RpcCommon.cpp | Implements wildcard-address detection for IPv4/IPv6 (including bracketed form). |
| iotdb-client/client-cpp/src/rpc/NodesSupplier.cpp | Skips wildcard IPv4/IPv6 addresses when refreshing available nodes. |
| integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBIPv6ClientIT.java | Adds runtime IT proving JDBC/Session/TableSession connectivity via [::1]:port. |
| integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/enhanced/IoTDBPipeClusterIT.java | Uses IPv6-safe getIpAndPortString() when building endpoint lists in tests. |
| integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/enhanced/IoTDBPipeClusterIT.java | Uses IPv6-safe getIpAndPortString() when building endpoint lists in tests. |
| integration-test/src/test/java/org/apache/iotdb/it/utils/IPv6TestUtils.java | Adds helper to detect IPv6 loopback availability and configure tests to bind to ::1. |
| integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBIPv6ClusterIT.java | Adds runtime IT proving 1C3D cluster internal/external endpoints work over IPv6 loopback. |
| integration-test/src/test/java/org/apache/iotdb/db/it/iotconsensusv2/IoTDBIoTConsensusV23C3DBasicITBase.java | Updates logs/metrics URLs to use IPv6-safe host formatting. |
| integration-test/src/main/java/org/apache/iotdb/it/env/remote/env/RemoteServerEnv.java | Uses shared endpoint formatter for remote env metrics/JDBC/session URLs. |
| integration-test/src/main/java/org/apache/iotdb/it/env/cluster/node/AbstractNodeWrapper.java | Allows overriding node bind/advertise address via system property and returns IPv6-safe ip:port. |
| integration-test/src/main/java/org/apache/iotdb/it/env/cluster/env/AbstractEnv.java | Uses shared endpoint formatter for metrics URLs and avoids split(":") on IPv6 endpoints. |
| integration-test/src/main/java/org/apache/iotdb/it/env/cluster/ClusterConstant.java | Adds constant for integration-test node-address override property. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
e8bdb6c to
6d78598
Compare
6d78598 to
8f84bea
Compare
|



Description
This PR improves IPv6 endpoint handling across IoTDB by centralizing endpoint formatting/parsing and using bracketed IPv6 URLs where a port is appended.
[ipv6]:portformatting/parsing in sharedUrlUtils, while keeping legacy naked IPv6 endpoint strings such as::1:10710readable.[::1]6667,[::1]:,[::1:6667,[]:123, and stray brackets in non-bracketed endpoints.Coverage
[ipv6]:portformatting and parsing inUrlUtils, while preserving legacy naked IPv6 parsing such as::1:10710.0.0.0.0; IPv6 wildcard addresses such as::or[::]could still be treated as connectable remote endpoints.0.0.0.0,::, bracketed::, and expanded IPv6 zero forms, then reuse it in JavaNodesSupplier, Java Session redirection, Python Session redirection, C++NodesSupplier, and C++ Session redirection.host:portand parsed withsplit(":"), which breaks IPv6 peer addresses.node_urlsused simple colon splitting; AINode config/client paths did not consistently handle bracketed IPv6.[ipv6]:portand legacy IPv6 endpoint strings, plus AINode endpoint formatting for downstream Session/TableSession usage.127.0.0.1, so ITs could not start real ConfigNode/DataNode endpoints on IPv6 loopback.IoTDBTestNodeAddressfor tests to override node bind/advertise addresses, plus an IPv6 loopback availability helper that skips cleanly when::1is unavailable.[::1]:port.IoTDBIPv6ClientIT, which starts 1C1D on::1and verifies JDBC, direct Session node URLs, default env Session, and TableSession write/query paths.showCluster, schema consensus endpoints, data consensus endpoints, and query traffic all work with IPv6.IoTDBIPv6ClusterIT, which starts 1C3D on::1, verifies every advertised ConfigNode/DataNode endpoint uses IPv6, and writes/queries data with SchemaRegion Ratis and DataRegion IoTConsensus.[ipv6]:portexamples.[::1]6667,[::1]:,[::1:6667,[]:123, stray brackets, wildcard address detection in Java/Python parsing paths, and real Java client/cluster IPv6 ITs.Tests
mvn test -pl iotdb-client/service-rpc,iotdb-client/jdbc,iotdb-client/session -am -Dtest=UrlUtilsTest,UtilsTest,SessionUtilsTest -Dsurefire.failIfNoSpecifiedTests=false -DfailIfNoTests=falsemvn test -pl iotdb-client/service-rpc -am -Dtest=UrlUtilsTest -Dsurefire.failIfNoSpecifiedTests=false -DfailIfNoTests=falsemvn test -pl iotdb-core/node-commons -am -Dtest=NodeUrlUtilsTest -Dsurefire.failIfNoSpecifiedTests=false -DfailIfNoTests=falsemvn test -pl iotdb-core/consensus -am -Dtest=UtilsTest -Dsurefire.failIfNoSpecifiedTests=false -DfailIfNoTests=falsemvn spotless:apply -pl iotdb-client/service-rpc -am -DskipTestsmvn spotless:apply -pl integration-test -am -P with-integration-tests -DskipTestsmvn test-compile -pl integration-test -am -P with-integration-tests -DskipTestsmvn verify -DskipUTs -Dit.test=IoTDBIPv6ClientIT -DfailIfNoTests=false -Dfailsafe.failIfNoSpecifiedTests=false -pl integration-test -am -P with-integration-testsmvn verify -DskipUTs -Dit.test=IoTDBIPv6ClusterIT -DfailIfNoTests=false -Dfailsafe.failIfNoSpecifiedTests=false -pl integration-test -am -PClusterIT -P with-integration-testsmvn spotless:apply -pl iotdb-client/client-cpp -am -P with-cpp,spotless-cpp -DskipTestsmvn compile -pl iotdb-client/client-cpp -am -P with-cpp -DskipTestscd iotdb-client/client-py && python3 -m pytest tests/unit/test_session_node_url.pycd iotdb-core/ainode && python3 -m unittest discover -s testspython3 -m black iotdb-core/ainode/iotdb/ainode/core/config.py iotdb-core/ainode/tests/test_config.pyPYTHONPATH=/tmp/codex-isort-6.0.1 python3 -m isort --profile black iotdb-core/ainode/iotdb/ainode/core/config.py iotdb-core/ainode/tests/test_config.pypython3 -m black --check iotdb-client/client-py/iotdb/Session.py iotdb-client/client-py/tests/unit/test_session_node_url.py iotdb-core/ainode/iotdb/ainode/core/config.py iotdb-core/ainode/iotdb/ainode/core/ingress/iotdb.pyPYTHONPATH=/tmp/codex-isort-6.0.1 python3 -m isort --profile black --check-only iotdb-client/client-py/iotdb/Session.py iotdb-client/client-py/tests/unit/test_session_node_url.py iotdb-core/ainode/iotdb/ainode/core/config.py iotdb-core/ainode/iotdb/ainode/core/ingress/iotdb.pypython3 -m py_compile iotdb-core/ainode/iotdb/ainode/core/config.py iotdb-core/ainode/iotdb/ainode/core/ingress/iotdb.pypython3 -m py_compile iotdb-core/ainode/iotdb/ainode/core/config.py iotdb-core/ainode/tests/test_config.pyrg -n --fixed-strings "0.0.0.0" --glob '!**/target/**' --glob '!**/.git/**'git diff --check