This is an automated email from the ASF dual-hosted git repository.
HTHou pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new ed8cb435b94 Fix IPv6 endpoint handling in client and ops tools (#18291)
ed8cb435b94 is described below
commit ed8cb435b9484a62dfbfdd56fd392645aa27f759
Author: Haonan <[email protected]>
AuthorDate: Thu Jul 23 19:56:19 2026 +0800
Fix IPv6 endpoint handling in client and ops tools (#18291)
* Fix CLI IPv6 endpoint formatting
* Fix IPv6 handling in client and ops tools
* Exclude subscription examples from IPv6 tool fix
* Fix Windows backup port detection guards
* Preserve endpoint port validation behavior
---
.../en/org/apache/iotdb/cli/i18n/CliMessages.java | 3 ++
.../zh/org/apache/iotdb/cli/i18n/CliMessages.java | 3 ++
.../src/main/java/org/apache/iotdb/cli/Cli.java | 19 +++++++---
.../apache/iotdb/tool/data/ExportDataTable.java | 3 +-
.../apache/iotdb/tool/data/ImportDataTable.java | 3 +-
.../iotdb/tool/schema/ExportSchemaTable.java | 3 +-
.../iotdb/tool/schema/ImportSchemaTable.java | 3 +-
.../main/java/org/apache/iotdb/rpc/UrlUtils.java | 8 +++++
.../java/org/apache/iotdb/rpc/UrlUtilsTest.java | 3 ++
scripts/tools/ops/health_check.sh | 8 +++--
scripts/tools/windows/ops/backup.bat | 16 ++++++---
scripts/tools/windows/ops/health_check.bat | 41 ++++++++++++++--------
12 files changed, 84 insertions(+), 29 deletions(-)
diff --git
a/iotdb-client/cli/src/main/i18n/en/org/apache/iotdb/cli/i18n/CliMessages.java
b/iotdb-client/cli/src/main/i18n/en/org/apache/iotdb/cli/i18n/CliMessages.java
index 9a877ca9d3c..5c13eb55752 100644
---
a/iotdb-client/cli/src/main/i18n/en/org/apache/iotdb/cli/i18n/CliMessages.java
+++
b/iotdb-client/cli/src/main/i18n/en/org/apache/iotdb/cli/i18n/CliMessages.java
@@ -24,6 +24,9 @@ public final class CliMessages {
// CliContext
public static final String EXITING_WITH_CODE = "Exiting with code %d";
+ // Cli
+ public static final String SUCCESSFULLY_LOGIN_AT = "Successfully login at
%s";
+
// IoTDBDataBackTool
public static final String TARGET_DIR_EMPTY =
" -targetdir cannot be empty, The backup folder must be specified";
diff --git
a/iotdb-client/cli/src/main/i18n/zh/org/apache/iotdb/cli/i18n/CliMessages.java
b/iotdb-client/cli/src/main/i18n/zh/org/apache/iotdb/cli/i18n/CliMessages.java
index 68e5c47e999..0e0f8f45634 100644
---
a/iotdb-client/cli/src/main/i18n/zh/org/apache/iotdb/cli/i18n/CliMessages.java
+++
b/iotdb-client/cli/src/main/i18n/zh/org/apache/iotdb/cli/i18n/CliMessages.java
@@ -24,6 +24,9 @@ public final class CliMessages {
// CliContext
public static final String EXITING_WITH_CODE = "正在退出,退出码 %d";
+ // Cli
+ public static final String SUCCESSFULLY_LOGIN_AT = "成功登录到 %s";
+
// IoTDBDataBackTool
public static final String TARGET_DIR_EMPTY =
" -targetdir 不能为空,必须指定备份目录";
diff --git a/iotdb-client/cli/src/main/java/org/apache/iotdb/cli/Cli.java
b/iotdb-client/cli/src/main/java/org/apache/iotdb/cli/Cli.java
index 63c3c5d1153..a2ab742c881 100644
--- a/iotdb-client/cli/src/main/java/org/apache/iotdb/cli/Cli.java
+++ b/iotdb-client/cli/src/main/java/org/apache/iotdb/cli/Cli.java
@@ -19,6 +19,7 @@
package org.apache.iotdb.cli;
+import org.apache.iotdb.cli.i18n.CliMessages;
import org.apache.iotdb.cli.type.ExitType;
import org.apache.iotdb.cli.utils.CliContext;
import org.apache.iotdb.cli.utils.JlineUtils;
@@ -26,6 +27,7 @@ import org.apache.iotdb.exception.ArgsErrorException;
import org.apache.iotdb.jdbc.Config;
import org.apache.iotdb.jdbc.IoTDBConnection;
import org.apache.iotdb.rpc.RpcUtils;
+import org.apache.iotdb.rpc.UrlUtils;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
@@ -204,8 +206,7 @@ public class Cli extends AbstractCli {
private static void executeSql(CliContext ctx) throws TException {
try (IoTDBConnection connection =
- (IoTDBConnection)
- DriverManager.getConnection(Config.IOTDB_URL_PREFIX + host + ":" +
port + "/", info)) {
+ (IoTDBConnection) DriverManager.getConnection(buildJdbcUrl(host,
port), info)) {
connection.setQueryTimeout(queryTimeout);
properties = connection.getServerProperties();
timestampPrecision = properties.getTimestampPrecision();
@@ -220,15 +221,15 @@ public class Cli extends AbstractCli {
private static void receiveCommands(CliContext ctx) throws TException {
try (IoTDBConnection connection =
- (IoTDBConnection)
- DriverManager.getConnection(Config.IOTDB_URL_PREFIX + host + ":" +
port + "/", info)) {
+ (IoTDBConnection) DriverManager.getConnection(buildJdbcUrl(host,
port), info)) {
connection.setQueryTimeout(queryTimeout);
properties = connection.getServerProperties();
timestampPrecision = properties.getTimestampPrecision();
echoStarting(ctx);
displayLogo(ctx, properties.getLogo(), properties.getVersion(),
properties.getBuildInfo());
- ctx.getPrinter().println(String.format("Successfully login at %s:%s",
host, port));
+ ctx.getPrinter()
+ .println(String.format(CliMessages.SUCCESSFULLY_LOGIN_AT,
formatEndpoint(host, port)));
while (true) {
boolean readLine = readerReadLine(ctx, connection);
if (readLine) {
@@ -241,6 +242,14 @@ public class Cli extends AbstractCli {
}
}
+ private static String formatEndpoint(String host, String port) {
+ return UrlUtils.formatTEndPointIpv4AndIpv6Url(host, port);
+ }
+
+ private static String buildJdbcUrl(String host, String port) {
+ return Config.IOTDB_URL_PREFIX + formatEndpoint(host, port) + "/";
+ }
+
private static boolean readerReadLine(CliContext ctx, IoTDBConnection
connection) {
String s;
try {
diff --git
a/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/data/ExportDataTable.java
b/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/data/ExportDataTable.java
index 458c447ba4f..1694e86c9f0 100644
---
a/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/data/ExportDataTable.java
+++
b/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/data/ExportDataTable.java
@@ -24,6 +24,7 @@ import org.apache.iotdb.isession.ITableSession;
import org.apache.iotdb.isession.SessionDataSet;
import org.apache.iotdb.rpc.IoTDBConnectionException;
import org.apache.iotdb.rpc.StatementExecutionException;
+import org.apache.iotdb.rpc.UrlUtils;
import org.apache.iotdb.session.TableSessionBuilder;
import org.apache.iotdb.tool.common.Constants;
@@ -65,7 +66,7 @@ public class ExportDataTable extends AbstractExportData {
public void init() throws IoTDBConnectionException,
StatementExecutionException {
TableSessionBuilder tableSessionBuilder =
new TableSessionBuilder()
- .nodeUrls(Collections.singletonList(host + ":" + port))
+
.nodeUrls(Collections.singletonList(UrlUtils.formatTEndPointIpv4AndIpv6Url(host,
port)))
.username(username)
.password(password)
.database(database)
diff --git
a/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/data/ImportDataTable.java
b/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/data/ImportDataTable.java
index d103c63555b..d7dc94c4d2a 100644
---
a/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/data/ImportDataTable.java
+++
b/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/data/ImportDataTable.java
@@ -25,6 +25,7 @@ import org.apache.iotdb.isession.SessionDataSet;
import org.apache.iotdb.isession.pool.ITableSessionPool;
import org.apache.iotdb.rpc.IoTDBConnectionException;
import org.apache.iotdb.rpc.StatementExecutionException;
+import org.apache.iotdb.rpc.UrlUtils;
import org.apache.iotdb.session.pool.TableSessionPoolBuilder;
import org.apache.iotdb.tool.common.Constants;
import org.apache.iotdb.tool.tsfile.ImportTsFileScanTool;
@@ -79,7 +80,7 @@ public class ImportDataTable extends AbstractImportData {
public void init() throws InterruptedException {
TableSessionPoolBuilder tableSessionPoolBuilder =
new TableSessionPoolBuilder()
- .nodeUrls(Collections.singletonList(host + ":" + port))
+
.nodeUrls(Collections.singletonList(UrlUtils.formatTEndPointIpv4AndIpv6Url(host,
port)))
.user(username)
.password(password)
.maxSize(threadNum + 1)
diff --git
a/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/schema/ExportSchemaTable.java
b/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/schema/ExportSchemaTable.java
index c9b15870d21..6d5c6a8fca8 100644
---
a/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/schema/ExportSchemaTable.java
+++
b/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/schema/ExportSchemaTable.java
@@ -26,6 +26,7 @@ import org.apache.iotdb.isession.SessionDataSet;
import org.apache.iotdb.isession.pool.ITableSessionPool;
import org.apache.iotdb.rpc.IoTDBConnectionException;
import org.apache.iotdb.rpc.StatementExecutionException;
+import org.apache.iotdb.rpc.UrlUtils;
import org.apache.iotdb.session.pool.TableSessionPoolBuilder;
import org.apache.iotdb.tool.common.Constants;
@@ -55,7 +56,7 @@ public class ExportSchemaTable extends AbstractExportSchema {
public void init() throws InterruptedException {
TableSessionPoolBuilder tableSessionPoolBuilder =
new TableSessionPoolBuilder()
- .nodeUrls(Collections.singletonList(host + ":" + port))
+
.nodeUrls(Collections.singletonList(UrlUtils.formatTEndPointIpv4AndIpv6Url(host,
port)))
.user(username)
.password(password)
.maxSize(threadNum + 1)
diff --git
a/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/schema/ImportSchemaTable.java
b/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/schema/ImportSchemaTable.java
index 004ec8b4152..e42fd8135de 100644
---
a/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/schema/ImportSchemaTable.java
+++
b/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/schema/ImportSchemaTable.java
@@ -26,6 +26,7 @@ import org.apache.iotdb.isession.SessionDataSet;
import org.apache.iotdb.isession.pool.ITableSessionPool;
import org.apache.iotdb.rpc.IoTDBConnectionException;
import org.apache.iotdb.rpc.StatementExecutionException;
+import org.apache.iotdb.rpc.UrlUtils;
import org.apache.iotdb.session.pool.TableSessionPoolBuilder;
import org.apache.iotdb.tool.common.Constants;
import org.apache.iotdb.tool.data.ImportDataScanTool;
@@ -51,7 +52,7 @@ public class ImportSchemaTable extends AbstractImportSchema {
public void init() throws InterruptedException {
TableSessionPoolBuilder tableSessionPoolBuilder =
new TableSessionPoolBuilder()
- .nodeUrls(Collections.singletonList(host + ":" + port))
+
.nodeUrls(Collections.singletonList(UrlUtils.formatTEndPointIpv4AndIpv6Url(host,
port)))
.user(username)
.password(password)
.maxSize(threadNum + 1)
diff --git
a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/UrlUtils.java
b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/UrlUtils.java
index 2a02a365d2a..838de7c5350 100644
--- a/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/UrlUtils.java
+++ b/iotdb-client/service-rpc/src/main/java/org/apache/iotdb/rpc/UrlUtils.java
@@ -76,6 +76,14 @@ public class UrlUtils {
/** Format host and port as host:port or [ipv6]:port. This method expects
host without a port. */
public static String formatTEndPointIpv4AndIpv6Url(String host, int port) {
+ return formatTEndPointIpv4AndIpv6Url(host, String.valueOf(port));
+ }
+
+ /**
+ * Format host and port as host:port or [ipv6]:port. This method expects
host without a port and
+ * leaves port validation to the endpoint consumer.
+ */
+ public static String formatTEndPointIpv4AndIpv6Url(String host, String port)
{
String formattedHost = host;
if (isIpv6Literal(host) && !isBracketedIpv6Literal(host)) {
formattedHost = IPV6_BEGIN_MARK + host + IPV6_END_MARK;
diff --git
a/iotdb-client/service-rpc/src/test/java/org/apache/iotdb/rpc/UrlUtilsTest.java
b/iotdb-client/service-rpc/src/test/java/org/apache/iotdb/rpc/UrlUtilsTest.java
index fb1b5b1359b..02dbd9ef68d 100644
---
a/iotdb-client/service-rpc/src/test/java/org/apache/iotdb/rpc/UrlUtilsTest.java
+++
b/iotdb-client/service-rpc/src/test/java/org/apache/iotdb/rpc/UrlUtilsTest.java
@@ -101,6 +101,7 @@ public class UrlUtilsTest {
@Test
public void testConvertHostNameURL() {
assertEquals("localhost:22227",
UrlUtils.formatTEndPointIpv4AndIpv6Url("localhost", 22227));
+ assertEquals("localhost:22227",
UrlUtils.formatTEndPointIpv4AndIpv6Url("localhost", "22227"));
}
@Test
@@ -122,6 +123,8 @@ public class UrlUtilsTest {
public void testConvertBracketedIPV6URL() {
assertEquals(
"[D80::ABAA:0]:22227",
UrlUtils.formatTEndPointIpv4AndIpv6Url("[D80::ABAA:0]", 22227));
+ assertEquals(
+ "[D80::ABAA:0]:invalid",
UrlUtils.formatTEndPointIpv4AndIpv6Url("D80::ABAA:0", "invalid"));
}
@Test
diff --git a/scripts/tools/ops/health_check.sh
b/scripts/tools/ops/health_check.sh
index b538305f32c..1a12ab27a7e 100644
--- a/scripts/tools/ops/health_check.sh
+++ b/scripts/tools/ops/health_check.sh
@@ -146,10 +146,14 @@ remote_ports_check() {
if [ -n "$unreachable_ports" ]; then
unreachable_combinations+=("IP: $host, Ports: $unreachable_ports")
fi
+ display_host="$host"
+ if [[ "$display_host" == *:* ]] && [[ "${display_host:0:1}" != "[" ]];
then
+ display_host="[$display_host]"
+ fi
if [ -n "$ip_port_list" ]; then
- ip_port_list="$ip_port_list,$host:$all_ports"
+ ip_port_list="$ip_port_list,$display_host:$all_ports"
else
- ip_port_list="$host:$all_ports"
+ ip_port_list="$display_host:$all_ports"
fi
done
echo ""
diff --git a/scripts/tools/windows/ops/backup.bat
b/scripts/tools/windows/ops/backup.bat
index f06c674895f..dc41df160da 100644
--- a/scripts/tools/windows/ops/backup.bat
+++ b/scripts/tools/windows/ops/backup.bat
@@ -71,24 +71,32 @@ set "operation_dirs="
set dn_rpc_port_occupied=0
set cn_internal_port_occupied=0
-for /f "tokens=1,3,7 delims=: " %%i in ('netstat /ano') do (
+for /f "tokens=1,2,5" %%i in ('netstat /ano') do (
+ set "local_endpoint=%%j"
+ if "!local_endpoint:~0,1!"=="[" (
+ set "local_port=!local_endpoint:*]:=!"
+ ) else (
+ set "local_port=!local_endpoint:*:=!"
+ )
if %%i==TCP (
- if %%j==%dn_rpc_port% (
+ if !local_port!==%dn_rpc_port% (
if !dn_rpc_port_occupied!==0 (
set spid=%%k
call :checkIfIOTDBProcess !spid! is_iotdb
if !is_iotdb!==1 (
set local_iotdb_occupied_ports=%dn_rpc_port%
!local_iotdb_occupied_ports!
)
+ set dn_rpc_port_occupied=1
)
- ) else if %%j==%cn_internal_port% (
+ ) else if !local_port!==%cn_internal_port% (
if !cn_internal_port_occupied!==0 (
set spid=%%k
call :checkIfIOTDBProcess !spid! is_iotdb
if !is_iotdb!==1 (
set local_iotdb_occupied_ports=%cn_internal_port%
!local_iotdb_occupied_ports!
)
+ set cn_internal_port_occupied=1
)
)
)
@@ -135,4 +143,4 @@ exit /b
:checkFail
echo Please stop IoTDB
-exit /b
\ No newline at end of file
+exit /b
diff --git a/scripts/tools/windows/ops/health_check.bat
b/scripts/tools/windows/ops/health_check.bat
index f8e87709efc..7fc57f2bd5a 100644
--- a/scripts/tools/windows/ops/health_check.bat
+++ b/scripts/tools/windows/ops/health_check.bat
@@ -50,7 +50,7 @@ for %%a in (%*) do (
)
:: Append IP and port to the ips string
if !isPort! equ 1 (
- set "ips=!ips!,!ip!:%%a"
+ set "ips=!ips!,!ip!;%%a"
)
)
)
@@ -72,7 +72,7 @@ for %%a in (%*) do (
)
:: Append IP and port to the ips string
if !isPort! equ 1 (
- set "ips=!ips!,!ip!:%%a"
+ set "ips=!ips!,!ip!;%%a"
)
)
)
@@ -430,9 +430,15 @@ set dn_data_region_consensus_port_occupied=0
set cn_internal_port_occupied=0
set cn_consensus_port_occupied=0
set local_ports=%dn_rpc_port% %dn_internal_port% %dn_mpp_data_exchange_port%
%dn_schema_region_consensus_port% %dn_data_region_consensus_port%
%cn_consensus_port% %cn_internal_port%
-for /f "tokens=1,3,7 delims=: " %%i in ('netstat /ano') do (
+for /f "tokens=1,2,5" %%i in ('netstat /ano') do (
+ set "local_endpoint=%%j"
+ if "!local_endpoint:~0,1!"=="[" (
+ set "local_port=!local_endpoint:*]:=!"
+ ) else (
+ set "local_port=!local_endpoint:*:=!"
+ )
if %%i==TCP (
- if %%j==%dn_rpc_port% (
+ if !local_port!==%dn_rpc_port% (
if !dn_rpc_port_occupied!==0 (
set spid=%%k
call :checkIfIOTDBProcess !spid! is_iotdb
@@ -443,7 +449,7 @@ for /f "tokens=1,3,7 delims=: " %%i in ('netstat /ano') do
(
)
set dn_rpc_port_occupied=1
)
- ) else if %%j==%dn_internal_port% (
+ ) else if !local_port!==%dn_internal_port% (
if !dn_internal_port_occupied!==0 (
set spid=%%k
call :checkIfIOTDBProcess !spid! is_iotdb
@@ -454,7 +460,7 @@ for /f "tokens=1,3,7 delims=: " %%i in ('netstat /ano') do
(
)
set dn_internal_port_occupied=1
)
- ) else if %%j==%dn_mpp_data_exchange_port% (
+ ) else if !local_port!==%dn_mpp_data_exchange_port% (
if !dn_mpp_data_exchange_port_occupied!==0 (
set spid=%%k
call :checkIfIOTDBProcess !spid! is_iotdb
@@ -465,7 +471,7 @@ for /f "tokens=1,3,7 delims=: " %%i in ('netstat /ano') do
(
)
set dn_mpp_data_exchange_port_occupied=1
)
- ) else if %%j==%dn_schema_region_consensus_port% (
+ ) else if !local_port!==%dn_schema_region_consensus_port% (
if !dn_schema_region_consensus_port_occupied!==0 (
set spid=%%k
call :checkIfIOTDBProcess !spid! is_iotdb
@@ -476,7 +482,7 @@ for /f "tokens=1,3,7 delims=: " %%i in ('netstat /ano') do
(
)
set dn_schema_region_consensus_port_occupied=1
)
- ) else if %%j==%dn_data_region_consensus_port% (
+ ) else if !local_port!==%dn_data_region_consensus_port% (
if !dn_data_region_consensus_port_occupied!==0 (
set spid=%%k
call :checkIfIOTDBProcess !spid! is_iotdb
@@ -488,7 +494,7 @@ for /f "tokens=1,3,7 delims=: " %%i in ('netstat /ano') do
(
)
set dn_data_region_consensus_port_occupied=1
)
- ) else if %%j==%cn_internal_port% (
+ ) else if !local_port!==%cn_internal_port% (
if !cn_internal_port_occupied!==0 (
set spid=%%k
call :checkIfIOTDBProcess !spid! is_iotdb
@@ -499,7 +505,7 @@ for /f "tokens=1,3,7 delims=: " %%i in ('netstat /ano') do
(
)
set cn_internal_port_occupied=1
)
- ) else if %%j==%cn_consensus_port% (
+ ) else if !local_port!==%cn_consensus_port% (
if !cn_consensus_port_occupied!==0 (
set spid=%%k
call :checkIfIOTDBProcess !spid! is_iotdb
@@ -556,9 +562,16 @@ exit /b
:remote_ports_check
for %%e in ("%endpoints:,=" "%") do (
set counter=0
- for /f "tokens=1,2 delims=:" %%i in ("%%~e") do (
+ for /f "tokens=1,2 delims=;" %%i in ("%%~e") do (
set "ip=%%i"
set "port=%%j"
+ if "!ip:~0,1!"=="[" if "!ip:~-1!"=="]" set "ip=!ip:~1,-1!"
+ set "display_ip=!ip!"
+ if not "!display_ip::=!"=="!display_ip!" (
+ if not "!display_ip:~0,1!"=="[" (
+ set "display_ip=[!display_ip!]"
+ )
+ )
if "!allpreip!" == "!ip!" (
set "iplist=!iplist! !port!"
) else (
@@ -566,12 +579,12 @@ for %%e in ("%endpoints:,=" "%") do (
if !counter! EQU 0 (
set /a counter+=1
if defined iplist (
- set "iplist=!iplist!,!ip!:!port!"
+ set "iplist=!iplist!,!display_ip!:!port!"
) else (
- set "iplist=!ip!:!port!"
+ set "iplist=!display_ip!:!port!"
)
) else (
- set "iplist=!iplist!,!ip!:!port!"
+ set "iplist=!iplist!,!display_ip!:!port!"
)
)