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:05 UTC
[iotdb] branch CloseBug11 created (now da1659a)
This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a change to branch CloseBug11
in repository https://gitbox.apache.org/repos/asf/iotdb.git.
at da1659a Avoid OOM if user don't close Statement and Session manually
This branch includes the following new commits:
new da1659a Avoid OOM if user don't close Statement and Session 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 and Session
manually
Posted by ja...@apache.org.
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() {