diff --git a/iotdb-client/client-py/iotdb/Session.py b/iotdb-client/client-py/iotdb/Session.py index a3d89d717464b..5635e3e9e100d 100644 --- a/iotdb-client/client-py/iotdb/Session.py +++ b/iotdb-client/client-py/iotdb/Session.py @@ -150,9 +150,22 @@ def init_from_node_urls( session.__hosts = [] session.__ports = [] for node_url in node_urls: - split = node_url.split(":") - session.__hosts.append(split[0]) - session.__ports.append(int(split[1])) + # Handle IPv6 address format [ipv6]:port + if node_url.startswith("["): + bracket_end = node_url.find("]") + if bracket_end > 0: + host = node_url[1:bracket_end] + # Port comes after "]:" + port_str = node_url[bracket_end + 2:] + session.__hosts.append(host) + session.__ports.append(int(port_str)) + else: + raise RuntimeError(f"Invalid IPv6 address format: {node_url}") + else: + # IPv4 format: host:port + split = node_url.split(":") + session.__hosts.append(split[0]) + session.__ports.append(int(split[1])) session.__host = session.__hosts[0] session.__port = session.__ports[0] session.__default_endpoint = TEndPoint(session.__host, session.__port) diff --git a/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/Utils.java b/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/Utils.java index 00e46cc340d15..f6665be1a64dd 100644 --- a/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/Utils.java +++ b/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/Utils.java @@ -42,8 +42,8 @@ public class Utils { static final String RPC_COMPRESS = "rpc_compress"; /** - * Parse JDBC connection URL The only supported format of the URL is: - * jdbc:iotdb://localhost:6667/. + * Parse JDBC connection URL The only supported format of the URL is: jdbc:iotdb://localhost:6667/ + * or jdbc:iotdb://[::1]:6667/ for IPv6. */ static IoTDBConnectionParams parseUrl(String url, Properties info) throws IoTDBURLException { IoTDBConnectionParams params = new IoTDBConnectionParams(url); @@ -57,10 +57,24 @@ static IoTDBConnectionParams parseUrl(String url, Properties info) throws IoTDBU String suffixURL = null; if (url.startsWith(Config.IOTDB_URL_PREFIX)) { String subURL = url.substring(Config.IOTDB_URL_PREFIX.length()); - int i = subURL.lastIndexOf(COLON); - host = subURL.substring(0, i); + int i; + // Handle IPv6 address format [ipv6]:port + if (subURL.startsWith("[")) { + int bracketEnd = subURL.indexOf(']'); + if (bracketEnd > 0) { + host = subURL.substring(1, bracketEnd); + // Find port after "]:" + i = bracketEnd + 2; + } else { + throw new IoTDBURLException("Invalid IPv6 address format in URL: " + url); + } + } else { + // IPv4 format: use lastIndexOf to find port separator + i = subURL.lastIndexOf(COLON); + host = subURL.substring(0, i); + i++; + } params.setHost(host); - i++; // parse port int port = 0; for (; i < subURL.length() && Character.isDigit(subURL.charAt(i)); i++) { diff --git a/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/ratis/utils/Utils.java b/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/ratis/utils/Utils.java index adaf820572f86..c8943d3b9c4d2 100644 --- a/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/ratis/utils/Utils.java +++ b/iotdb-core/consensus/src/main/java/org/apache/iotdb/consensus/ratis/utils/Utils.java @@ -85,7 +85,12 @@ public class Utils { private Utils() {} public static String hostAddress(TEndPoint endpoint) { - return String.format("%s:%d", endpoint.getIp(), endpoint.getPort()); + String ip = endpoint.getIp(); + // IPv6 addresses need to be wrapped in brackets + if (ip.contains(":")) { + return String.format("[%s]:%d", ip, endpoint.getPort()); + } + return String.format("%s:%d", ip, endpoint.getPort()); } public static String fromTEndPointToString(TEndPoint endpoint) { @@ -106,6 +111,14 @@ public static RaftPeerId fromNodeIdToRaftPeerId(int nodeId) { } public static TEndPoint fromRaftPeerAddressToTEndPoint(String address) { + // Handle IPv6 address format [ipv6]:port + if (address.startsWith("[")) { + int bracketEnd = address.indexOf(']'); + String ip = address.substring(1, bracketEnd); + int port = Integer.parseInt(address.substring(bracketEnd + 2)); + return new TEndPoint(ip, port); + } + // IPv4 format: ip:port String[] items = address.split(":"); return new TEndPoint(items[0], Integer.parseInt(items[1])); } @@ -115,7 +128,16 @@ public static int fromRaftPeerIdToNodeId(RaftPeerId id) { } public static TEndPoint fromRaftPeerProtoToTEndPoint(RaftPeerProto proto) { - String[] items = proto.getAddress().split(":"); + String address = proto.getAddress(); + // Handle IPv6 address format [ipv6]:port + if (address.startsWith("[")) { + int bracketEnd = address.indexOf(']'); + String ip = address.substring(1, bracketEnd); + int port = Integer.parseInt(address.substring(bracketEnd + 2)); + return new TEndPoint(ip, port); + } + // IPv4 format: ip:port + String[] items = address.split(":"); return new TEndPoint(items[0], Integer.parseInt(items[1])); }