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

[iotdb] branch CloseBug created (now 47e586e)

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

jackietien pushed a change to branch CloseBug
in repository https://gitbox.apache.org/repos/asf/iotdb.git.


      at 47e586e  Avoid OOM if user don't close statement manually

This branch includes the following new commits:

     new 47e586e  Avoid OOM if user don't close statement manually

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[iotdb] 01/01: Avoid OOM if user don't close statement manually

Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jackietien pushed a commit to branch CloseBug
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 47e586eb77225b47f9181fb9285aa8ce12aab1a5
Author: JackieTien97 <Ja...@foxmail.com>
AuthorDate: Thu Feb 4 17:48:23 2021 +0800

    Avoid OOM if user don't close statement manually
---
 .../src/main/java/org/apache/iotdb/cluster/ClientMain.java |  2 +-
 .../org/apache/iotdb/jdbc/AbstractIoTDBJDBCResultSet.java  |  5 ++---
 .../main/java/org/apache/iotdb/jdbc/IoTDBStatement.java    |  4 ++++
 .../java/org/apache/iotdb/db/service/TSServiceImpl.java    | 14 +++++++++-----
 .../main/java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java    |  5 ++++-
 .../java/org/apache/iotdb/session/SessionConnection.java   |  4 ++--
 .../main/java/org/apache/iotdb/session/SessionDataSet.java |  8 ++++----
 7 files changed, 26 insertions(+), 16 deletions(-)

diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/ClientMain.java b/cluster/src/main/java/org/apache/iotdb/cluster/ClientMain.java
index 5da4e52..499945b 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/ClientMain.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/ClientMain.java
@@ -329,7 +329,7 @@ public class ClientMain {
     }
 
     SessionDataSet dataSet = new SessionDataSet(query, resp.getColumns(),
-        resp.getDataTypeList(), resp.columnNameIndexMap, queryId, client, sessionId,
+        resp.getDataTypeList(), resp.columnNameIndexMap, queryId, statementId, client, sessionId,
         resp.queryDataSet, false);
 
     while (dataSet.hasNext()) {
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 259b24b..e08c618 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/AbstractIoTDBJDBCResultSet.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/AbstractIoTDBJDBCResultSet.java
@@ -42,7 +42,6 @@ import java.sql.Timestamp;
 import java.util.Calendar;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 import org.apache.iotdb.rpc.IoTDBRpcDataSet;
 import org.apache.iotdb.rpc.StatementExecutionException;
 import org.apache.iotdb.service.rpc.thrift.TSIService;
@@ -60,8 +59,8 @@ public abstract class AbstractIoTDBJDBCResultSet implements ResultSet {
       TSIService.Iface client,
       String sql, long queryId, long sessionId, long timeout)
       throws SQLException {
-    this.ioTDBRpcDataSet = new IoTDBRpcDataSet(sql, columnNameList, columnTypeList,
-        columnNameIndex, ignoreTimeStamp, queryId, client, sessionId, null,
+    this.ioTDBRpcDataSet = new IoTDBRpcDataSet(sql, columnNameList, columnTypeList, columnNameIndex,
+        ignoreTimeStamp, queryId, ((IoTDBStatement) statement).getStmtId(), client, sessionId, null,
         statement.getFetchSize(), timeout);
     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 4f91808..cda374b 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBStatement.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBStatement.java
@@ -657,4 +657,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 5459d3a..af92578 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
@@ -320,17 +320,21 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
     }
 
     try {
-      // statement close
-      if (req.isSetStatementId()) {
+      // ResultSet close
+      if (req.isSetStatementId() && req.isSetQueryId()) {
+        releaseQueryResourceNoExceptions(req.queryId);
+        // clear the statementId2QueryId map
+        statementId2QueryId.get(req.getStatementId()).remove(req.getQueryId());
+      } else {
+        // statement close
         Set<Long> queryIdSet = statementId2QueryId.remove(req.getStatementId());
         if (queryIdSet != null) {
           for (long queryId : queryIdSet) {
             releaseQueryResourceNoExceptions(queryId);
           }
         }
-      } else {
-        // ResultSet close
-        releaseQueryResourceNoExceptions(req.queryId);
+        // clear the sessionId2StatementId map
+        sessionId2StatementId.get(req.getSessionId()).remove(req.getStatementId());
       }
       return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
     } 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 1ad9db9..f0ebf25 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
@@ -65,6 +65,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
@@ -77,9 +78,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, long timeout) {
     this.sessionId = sessionId;
+    this.statementId = statementId;
     this.ignoreTimeStamp = ignoreTimeStamp;
     this.sql = sql;
     this.queryId = queryId;
@@ -171,6 +173,7 @@ public class IoTDBRpcDataSet {
     if (client != null) {
       try {
         TSCloseOperationReq closeReq = new TSCloseOperationReq(sessionId);
+        closeReq.setStatementId(statementId);
         closeReq.setQueryId(queryId);
         TSStatus closeResp = client.closeOperation(closeReq);
         RpcUtils.verifySuccess(closeResp);
diff --git a/session/src/main/java/org/apache/iotdb/session/SessionConnection.java b/session/src/main/java/org/apache/iotdb/session/SessionConnection.java
index 58c6af1..4ad4596 100644
--- a/session/src/main/java/org/apache/iotdb/session/SessionConnection.java
+++ b/session/src/main/java/org/apache/iotdb/session/SessionConnection.java
@@ -286,7 +286,7 @@ public class SessionConnection {
     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(), timeout);
   }
 
@@ -338,7 +338,7 @@ public class SessionConnection {
     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 e3ad394..e33e421 100644
--- a/session/src/main/java/org/apache/iotdb/session/SessionDataSet.java
+++ b/session/src/main/java/org/apache/iotdb/session/SessionDataSet.java
@@ -43,18 +43,18 @@ 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, 0);
+        ignoreTimeStamp, queryId, statementId, client, sessionId, queryDataSet, Config.DEFAULT_FETCH_SIZE, 0);
   }
 
   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, long timeout) {
     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,
         timeout);
   }