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:08 UTC
[iotdb] 01/01: Avoid OOM if user don't close statement manually
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);
}