This is an automated email from the ASF dual-hosted git repository. hxd pushed a commit to branch version_compatibility in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git
commit d2b551fb784721bcfb3bfc858c16e4836441b670 Author: xiangdong huang <[email protected]> AuthorDate: Sat Feb 22 00:43:17 2020 +0800 upgrade the protocol to v2 to reject clients or servers that version < 0.10 --- client-py/src/client_example.py | 5 +++-- .../java/org/apache/iotdb/jdbc/IoTDBConnection.java | 21 +++++++++++---------- .../org/apache/iotdb/db/service/TSServiceImpl.java | 17 ++++++++++++++++- .../main/java/org/apache/iotdb/rpc/RpcUtils.java | 2 +- .../java/org/apache/iotdb/rpc/TSStatusCode.java | 4 +++- service-rpc/src/main/thrift/rpc.thrift | 3 ++- .../main/java/org/apache/iotdb/session/Session.java | 14 +++++++++----- 7 files changed, 45 insertions(+), 21 deletions(-) diff --git a/client-py/src/client_example.py b/client-py/src/client_example.py index 90c39f8..deb3022 100644 --- a/client-py/src/client_example.py +++ b/client-py/src/client_example.py @@ -164,14 +164,15 @@ if __name__ == '__main__': transport.open() # Authentication - clientProtocol = TSProtocolVersion.IOTDB_SERVICE_PROTOCOL_V1 + clientProtocol = TSProtocolVersion.IOTDB_SERVICE_PROTOCOL_V2 resp = client.openSession(TSOpenSessionReq(client_protocol=clientProtocol, username=username, password=password)) if resp.serverProtocolVersion != clientProtocol: print('Inconsistent protocol, server version: %d, client version: %d' % (resp.serverProtocolVersion, clientProtocol)) - exit() + if resp.serverProtocolVersion > clientProtocol: + exit() sessionId = resp.sessionId # This is necessary for resource control diff --git a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBConnection.java b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBConnection.java index 4760b9c..691d53f 100644 --- a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBConnection.java +++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBConnection.java @@ -53,7 +53,7 @@ import org.slf4j.LoggerFactory; public class IoTDBConnection implements Connection { private static final Logger logger = LoggerFactory.getLogger(IoTDBConnection.class); - private static final TSProtocolVersion protocolVersion = TSProtocolVersion.IOTDB_SERVICE_PROTOCOL_V1; + private static final TSProtocolVersion protocolVersion = TSProtocolVersion.IOTDB_SERVICE_PROTOCOL_V2; private TSIService.Iface client = null; private long sessionId = -1; private IoTDBConnectionParams params; @@ -410,7 +410,7 @@ public class IoTDBConnection implements Connection { } private void openSession() throws SQLException { - TSOpenSessionReq openReq = new TSOpenSessionReq(TSProtocolVersion.IOTDB_SERVICE_PROTOCOL_V1); + TSOpenSessionReq openReq = new TSOpenSessionReq(); openReq.setUsername(params.getUsername()); openReq.setPassword(params.getPassword()); @@ -423,11 +423,14 @@ public class IoTDBConnection implements Connection { RpcUtils.verifySuccess(openResp.getStatus()); if (protocolVersion.getValue() != openResp.getServerProtocolVersion().getValue()) { - throw new TException(String - .format("Protocol not supported, Client version is %d, but Server version is %d", - protocolVersion.getValue(), openResp.getServerProtocolVersion().getValue())); + logger.warn("Protocol differ, Client version is {}}, but Server version is {}", + protocolVersion.getValue(), openResp.getServerProtocolVersion().getValue()); + if (openResp.getServerProtocolVersion().getValue() == 0) {// less than 0.10 + throw new TException(String + .format("Protocol not supported, Client version is %s, but Server version is %s", + protocolVersion.getValue(), openResp.getServerProtocolVersion().getValue())); + } } - setProtocol(openResp.getServerProtocolVersion()); if (zoneId != null) { setTimeZone(zoneId.toString()); @@ -437,8 +440,8 @@ public class IoTDBConnection implements Connection { } catch (TException e) { transport.close(); - throw new SQLException(String.format("Can not establish connection with %s.", - params.getJdbcUriString()), e); + throw new SQLException(String.format("Can not establish connection with %s : %s", + params.getJdbcUriString(), e.getMessage()), e); } catch (IoTDBRPCException e) { // failed to connect, disconnect from the server transport.close(); @@ -505,7 +508,5 @@ public class IoTDBConnection implements Connection { return getClient().getProperties(); } - private void setProtocol(TSProtocolVersion protocol) { - } } diff --git a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java index b9a4685..cbfe6f7 100644 --- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java +++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java @@ -221,9 +221,20 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext { logger.info("meet error while logging in.", e); status = false; } + TSStatus tsStatus; long sessionId = -1; if (status) { + //check the version compatibility + boolean compatible = checkCompatibility(req.getClient_protocol()); + if (!compatible) { + tsStatus = getStatus(TSStatusCode.INCOMPATIBLE_VERSION, "The version is incompatible, please upgrade to " + IoTDBConstant.VERSION); + TSOpenSessionResp resp = new TSOpenSessionResp(tsStatus, + TSProtocolVersion.IOTDB_SERVICE_PROTOCOL_V2); + resp.setSessionId(sessionId); + return resp; + } + tsStatus = getStatus(TSStatusCode.SUCCESS_STATUS, "Login successfully"); sessionId = sessionIdGenerator.incrementAndGet(); sessionIdUsernameMap.put(sessionId, req.getUsername()); @@ -233,7 +244,7 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext { tsStatus = getStatus(TSStatusCode.WRONG_LOGIN_PASSWORD_ERROR); } TSOpenSessionResp resp = new TSOpenSessionResp(tsStatus, - TSProtocolVersion.IOTDB_SERVICE_PROTOCOL_V1); + TSProtocolVersion.IOTDB_SERVICE_PROTOCOL_V2); resp.setSessionId(sessionId); logger.info("{}: Login status: {}. User : {}", IoTDBConstant.GLOBAL_DB_NAME, tsStatus.getStatusType().getMessage(), req.getUsername()); @@ -241,6 +252,10 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext { return resp; } + private boolean checkCompatibility(TSProtocolVersion version) { + return version.equals(TSProtocolVersion.IOTDB_SERVICE_PROTOCOL_V2); + } + @Override public TSStatus closeSession(TSCloseSessionReq req) { logger.info("{}: receive close session", IoTDBConstant.GLOBAL_DB_NAME); diff --git a/service-rpc/src/main/java/org/apache/iotdb/rpc/RpcUtils.java b/service-rpc/src/main/java/org/apache/iotdb/rpc/RpcUtils.java index b707c70..dbae831 100644 --- a/service-rpc/src/main/java/org/apache/iotdb/rpc/RpcUtils.java +++ b/service-rpc/src/main/java/org/apache/iotdb/rpc/RpcUtils.java @@ -36,7 +36,7 @@ public class RpcUtils { */ public static void verifySuccess(TSStatus status) throws IoTDBRPCException { if (status.getStatusType().getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - throw new IoTDBRPCException(status.getStatusType().getMessage()); + throw new IoTDBRPCException(String.format("%d: %s", status.getStatusType().getCode(), status.getStatusType().getMessage())); } } diff --git a/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java b/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java index 3ec590d..703b28e 100644 --- a/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java +++ b/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java @@ -55,7 +55,9 @@ public enum TSStatusCode { WRONG_LOGIN_PASSWORD_ERROR(600), NOT_LOGIN_ERROR(601), NO_PERMISSION_ERROR(602), - UNINITIALIZED_AUTH_ERROR(603); + UNINITIALIZED_AUTH_ERROR(603), + INCOMPATIBLE_VERSION(203) + ; private int statusCode; diff --git a/service-rpc/src/main/thrift/rpc.thrift b/service-rpc/src/main/thrift/rpc.thrift index c47ad38..fb96f02 100644 --- a/service-rpc/src/main/thrift/rpc.thrift +++ b/service-rpc/src/main/thrift/rpc.thrift @@ -47,6 +47,7 @@ struct TSExecuteStatementResp { enum TSProtocolVersion { IOTDB_SERVICE_PROTOCOL_V1, + IOTDB_SERVICE_PROTOCOL_V2,//V2 is the first version that we can check version compatibility } struct TSOpenSessionResp { @@ -65,7 +66,7 @@ struct TSOpenSessionResp { // OpenSession() // Open a session (connection) on the server against which operations may be executed. struct TSOpenSessionReq { - 1: required TSProtocolVersion client_protocol = TSProtocolVersion.IOTDB_SERVICE_PROTOCOL_V1 + 1: required TSProtocolVersion client_protocol = TSProtocolVersion.IOTDB_SERVICE_PROTOCOL_V2 2: optional string username 3: optional string password 4: optional map<string, string> configuration diff --git a/session/src/main/java/org/apache/iotdb/session/Session.java b/session/src/main/java/org/apache/iotdb/session/Session.java index 26bc558..2db5923 100644 --- a/session/src/main/java/org/apache/iotdb/session/Session.java +++ b/session/src/main/java/org/apache/iotdb/session/Session.java @@ -65,7 +65,7 @@ import org.slf4j.LoggerFactory; public class Session { private static final Logger logger = LoggerFactory.getLogger(Session.class); - private final TSProtocolVersion protocolVersion = TSProtocolVersion.IOTDB_SERVICE_PROTOCOL_V1; + private final TSProtocolVersion protocolVersion = TSProtocolVersion.IOTDB_SERVICE_PROTOCOL_V2; private String host; private int port; private String username; @@ -126,7 +126,7 @@ public class Session { client = new TSIService.Client(new TBinaryProtocol(transport)); } - TSOpenSessionReq openReq = new TSOpenSessionReq(TSProtocolVersion.IOTDB_SERVICE_PROTOCOL_V1); + TSOpenSessionReq openReq = new TSOpenSessionReq(); openReq.setUsername(username); openReq.setPassword(password); @@ -136,9 +136,13 @@ public class Session { RpcUtils.verifySuccess(openResp.getStatus()); if (protocolVersion.getValue() != openResp.getServerProtocolVersion().getValue()) { - throw new TException(String - .format("Protocol not supported, Client version is %s, but Server version is %s", - protocolVersion.getValue(), openResp.getServerProtocolVersion().getValue())); + logger.warn("Protocol differ, Client version is {}}, but Server version is {}", + protocolVersion.getValue(), openResp.getServerProtocolVersion().getValue()); + if (openResp.getServerProtocolVersion().getValue() == 0) {// less than 0.10 + throw new TException(String + .format("Protocol not supported, Client version is %s, but Server version is %s", + protocolVersion.getValue(), openResp.getServerProtocolVersion().getValue())); + } } sessionId = openResp.getSessionId();
