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 10:00:06 UTC
[iotdb] 01/01: Avoid OOM if user don't close Statement and Session
manually
This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a commit to branch CloseBug11
in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit da1659a720126371ea7c0f04012fc71997ab64b9
Author: JackieTien97 <Ja...@foxmail.com>
AuthorDate: Thu Feb 4 17:59:30 2021 +0800
Avoid OOM if user don't close Statement and Session manually
---
.../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() {