You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by qi...@apache.org on 2021/02/04 13:21:05 UTC

[iotdb] branch rel/0.11 updated: Avoid OOM if user don't close Statement and Session manually (#2631)

This is an automated email from the ASF dual-hosted git repository.

qiaojialin pushed a commit to branch rel/0.11
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/rel/0.11 by this push:
     new c654750  Avoid OOM if user don't close Statement and Session manually (#2631)
c654750 is described below

commit c654750dffa30e7d10dda8918010fedab0dd3277
Author: Jackie Tien <Ja...@foxmail.com>
AuthorDate: Thu Feb 4 21:18:49 2021 +0800

    Avoid OOM if user don't close Statement and Session manually (#2631)
---
 .../apache/iotdb/jdbc/AbstractIoTDBJDBCResultSet.java |  2 +-
 .../java/org/apache/iotdb/jdbc/IoTDBStatement.java    |  4 ++++
 .../org/apache/iotdb/db/service/TSServiceImpl.java    | 19 ++++++++++++++-----
 .../java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java    |  5 ++++-
 .../main/java/org/apache/iotdb/session/Session.java   |  4 ++--
 .../java/org/apache/iotdb/session/SessionDataSet.java |  4 ++--
 6 files changed, 27 insertions(+), 11 deletions(-)

diff --git a/jdbc/src/main/java/org/apache/iotdb/jdbc/AbstractIoTDBJDBCResultSet.java b/jdbc/src/main/java/org/apache/iotdb/jdbc/AbstractIoTDBJDBCResultSet.java
index 99c300f..7acb7ba 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/AbstractIoTDBJDBCResultSet.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/AbstractIoTDBJDBCResultSet.java
@@ -61,7 +61,7 @@ public abstract class AbstractIoTDBJDBCResultSet implements ResultSet {
       String sql, long queryId, long sessionId)
       throws SQLException {
     this.ioTDBRpcDataSet = new IoTDBRpcDataSet(sql, columnNameList, columnTypeList,
-        columnNameIndex, ignoreTimeStamp, queryId, client, sessionId, null,
+        columnNameIndex, ignoreTimeStamp, queryId, ((IoTDBStatement) statement).getStmtId(), client, sessionId, null,
         statement.getFetchSize());
     this.statement = statement;
     this.columnTypeList = columnTypeList;
diff --git a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBStatement.java b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBStatement.java
index f4b7502..4430adf 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBStatement.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBStatement.java
@@ -630,4 +630,8 @@ public class IoTDBStatement implements Statement {
   public long getSessionId() {
     return sessionId;
   }
+
+  public long getStmtId() {
+    return stmtId;
+  }
 }
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 d4d7966..500ae7a 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
@@ -329,8 +329,16 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
       return RpcUtils.getStatus(TSStatusCode.NOT_LOGIN_ERROR);
     }
     try {
-      // statement close
-      if (req.isSetStatementId()) {
+
+      // ResultSet close
+      if (req.isSetStatementId() && req.isSetQueryId()) {
+        releaseQueryResource(req.queryId);
+        // clear the statementId2QueryId map
+        if (statementId2QueryId.containsKey(req.getStatementId())) {
+          statementId2QueryId.get(req.getStatementId()).remove(req.getQueryId());
+        }
+      } else {
+        // statement close
         long stmtId = req.getStatementId();
         Set<Long> queryIdSet = statementId2QueryId.remove(stmtId);
         if (queryIdSet != null) {
@@ -338,9 +346,10 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
             releaseQueryResource(queryId);
           }
         }
-      } else {
-        // ResultSet close
-        releaseQueryResource(req.queryId);
+        // clear the sessionId2StatementId map
+        if (sessionId2StatementId.containsKey(req.getSessionId())) {
+          sessionId2StatementId.get(req.getSessionId()).remove(req.getStatementId());
+        }
       }
 
     } catch (Exception e) {
diff --git a/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java b/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java
index 972a281..5c9e8f5 100644
--- a/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java
+++ b/service-rpc/src/main/java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java
@@ -64,6 +64,7 @@ public class IoTDBRpcDataSet {
 
   public long sessionId;
   public long queryId;
+  public long statementId;
   public boolean ignoreTimeStamp;
 
   public int rowsIndex = 0; // used to record the row index in current TSQueryDataSet
@@ -76,9 +77,10 @@ public class IoTDBRpcDataSet {
   @SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity warning
   public IoTDBRpcDataSet(String sql, List<String> columnNameList, List<String> columnTypeList,
       Map<String, Integer> columnNameIndex, boolean ignoreTimeStamp,
-      long queryId, TSIService.Iface client, long sessionId, TSQueryDataSet queryDataSet,
+      long queryId, long statementId, TSIService.Iface client, long sessionId, TSQueryDataSet queryDataSet,
       int fetchSize) {
     this.sessionId = sessionId;
+    this.statementId = statementId;
     this.ignoreTimeStamp = ignoreTimeStamp;
     this.sql = sql;
     this.queryId = queryId;
@@ -170,6 +172,7 @@ public class IoTDBRpcDataSet {
       try {
         TSCloseOperationReq closeReq = new TSCloseOperationReq(sessionId);
         closeReq.setQueryId(queryId);
+        closeReq.setStatementId(statementId);
         TSStatus closeResp = client.closeOperation(closeReq);
         RpcUtils.verifySuccess(closeResp);
       } catch (StatementExecutionException e) {
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 30de8d2..ecbbc60 100644
--- a/session/src/main/java/org/apache/iotdb/session/Session.java
+++ b/session/src/main/java/org/apache/iotdb/session/Session.java
@@ -1101,7 +1101,7 @@ public class Session {
     RpcUtils.verifySuccess(execResp.getStatus());
     return new SessionDataSet(sql, execResp.getColumns(), execResp.getDataTypeList(),
         execResp.columnNameIndexMap,
-        execResp.getQueryId(), client, sessionId, execResp.queryDataSet,
+        execResp.getQueryId(), statementId, client, sessionId, execResp.queryDataSet,
         execResp.isIgnoreTimeStamp());
   }
 
@@ -1172,7 +1172,7 @@ public class Session {
     RpcUtils.verifySuccess(execResp.getStatus());
     return new SessionDataSet("", execResp.getColumns(), execResp.getDataTypeList(),
         execResp.columnNameIndexMap,
-        execResp.getQueryId(), client, sessionId, execResp.queryDataSet,
+        execResp.getQueryId(), statementId, client, sessionId, execResp.queryDataSet,
         execResp.isIgnoreTimeStamp());
   }
 
diff --git a/session/src/main/java/org/apache/iotdb/session/SessionDataSet.java b/session/src/main/java/org/apache/iotdb/session/SessionDataSet.java
index dbe078d..42f0a50 100644
--- a/session/src/main/java/org/apache/iotdb/session/SessionDataSet.java
+++ b/session/src/main/java/org/apache/iotdb/session/SessionDataSet.java
@@ -43,10 +43,10 @@ public class SessionDataSet {
 
   public SessionDataSet(String sql, List<String> columnNameList, List<String> columnTypeList,
       Map<String, Integer> columnNameIndex,
-      long queryId, TSIService.Iface client, long sessionId, TSQueryDataSet queryDataSet,
+      long queryId, long statementId, TSIService.Iface client, long sessionId, TSQueryDataSet queryDataSet,
       boolean ignoreTimeStamp) {
     this.ioTDBRpcDataSet = new IoTDBRpcDataSet(sql, columnNameList, columnTypeList, columnNameIndex,
-        ignoreTimeStamp, queryId, client, sessionId, queryDataSet, Config.DEFAULT_FETCH_SIZE);
+        ignoreTimeStamp, queryId, statementId, client, sessionId, queryDataSet, Config.DEFAULT_FETCH_SIZE);
   }
 
   public int getFetchSize() {