You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by xi...@apache.org on 2021/11/08 08:45:23 UTC
[iotdb] 01/01: Fix memory leak
This is an automated email from the ASF dual-hosted git repository.
xiangweiwei pushed a commit to branch memoryleak
in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 4af55d463af5a3b71a00ccd8f54f0e0ca427b2e9
Author: Alima777 <wx...@gmail.com>
AuthorDate: Mon Nov 8 16:44:35 2021 +0800
Fix memory leak
---
.../apache/iotdb/cluster/server/ClientServer.java | 2 +-
.../iotdb/db/query/control/SessionManager.java | 23 +++++++--------------
.../org/apache/iotdb/db/service/TSServiceImpl.java | 24 +++++++++++++++-------
3 files changed, 25 insertions(+), 24 deletions(-)
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/server/ClientServer.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/ClientServer.java
index 36de122..ec2c523 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/ClientServer.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/ClientServer.java
@@ -302,7 +302,7 @@ public class ClientServer extends TSServiceImpl {
* @throws StorageEngineException
*/
@Override
- protected void releaseQueryResource(long queryId) throws StorageEngineException {
+ public void releaseQueryResource(long queryId) throws StorageEngineException {
// release resources locally
super.releaseQueryResource(queryId);
// release resources remotely
diff --git a/server/src/main/java/org/apache/iotdb/db/query/control/SessionManager.java b/server/src/main/java/org/apache/iotdb/db/query/control/SessionManager.java
index c3257fb..9fc5ed5 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/control/SessionManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/control/SessionManager.java
@@ -20,6 +20,7 @@ package org.apache.iotdb.db.query.control;
import org.apache.iotdb.db.exception.StorageEngineException;
import org.apache.iotdb.db.query.dataset.UDTFDataSet;
+import org.apache.iotdb.db.service.TSServiceImpl;
import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
import org.slf4j.Logger;
@@ -85,7 +86,7 @@ public class SessionManager {
return sessionId;
}
- public boolean releaseSessionResource(long sessionId) {
+ public boolean releaseSessionResource(TSServiceImpl service, long sessionId) {
sessionIdToZoneId.remove(sessionId);
Set<Long> statementIdSet = sessionIdToStatementId.remove(sessionId);
@@ -94,7 +95,7 @@ public class SessionManager {
Set<Long> queryIdSet = statementIdToQueryId.remove(statementId);
if (queryIdSet != null) {
for (Long queryId : queryIdSet) {
- releaseQueryResourceNoExceptions(queryId);
+ service.releaseQueryResourceNoExceptions(queryId);
}
}
}
@@ -111,11 +112,11 @@ public class SessionManager {
return statementId;
}
- public void closeStatement(long sessionId, long statementId) {
+ public void closeStatement(TSServiceImpl tsService, long sessionId, long statementId) {
Set<Long> queryIdSet = statementIdToQueryId.remove(statementId);
if (queryIdSet != null) {
for (Long queryId : queryIdSet) {
- releaseQueryResourceNoExceptions(queryId);
+ tsService.releaseQueryResourceNoExceptions(queryId);
}
}
@@ -144,16 +145,6 @@ public class SessionManager {
QueryResourceManager.getInstance().endQuery(queryId);
}
- public void releaseQueryResourceNoExceptions(long queryId) {
- if (queryId != -1) {
- try {
- releaseQueryResource(queryId);
- } catch (Exception e) {
- LOGGER.warn("Error occurred while releasing query resource: ", e);
- }
- }
- }
-
public String getUsername(Long sessionId) {
return sessionIdToUsername.get(sessionId);
}
@@ -182,8 +173,8 @@ public class SessionManager {
queryIdToDataSet.remove(queryId);
}
- public void closeDataset(Long statementId, Long queryId) {
- releaseQueryResourceNoExceptions(queryId);
+ public void closeDataset(TSServiceImpl tsService, Long statementId, Long queryId) {
+ tsService.releaseQueryResourceNoExceptions(queryId);
if (statementIdToQueryId.containsKey(statementId)) {
statementIdToQueryId.get(statementId).remove(queryId);
}
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 b36a5ee..813e93c 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
@@ -281,7 +281,7 @@ public class TSServiceImpl implements TSIService.Iface {
sessionManager.removeCurrSessionId();
return new TSStatus(
- !sessionManager.releaseSessionResource(sessionId)
+ !sessionManager.releaseSessionResource(this, sessionId)
? RpcUtils.getStatus(TSStatusCode.NOT_LOGIN_ERROR)
: RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS));
}
@@ -308,9 +308,9 @@ public class TSServiceImpl implements TSIService.Iface {
try {
if (req.isSetStatementId()) {
if (req.isSetQueryId()) {
- sessionManager.closeDataset(req.statementId, req.queryId);
+ sessionManager.closeDataset(this, req.statementId, req.queryId);
} else {
- sessionManager.closeStatement(req.sessionId, req.statementId);
+ sessionManager.closeStatement(this, req.sessionId, req.statementId);
}
return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
} else {
@@ -324,10 +324,20 @@ public class TSServiceImpl implements TSIService.Iface {
}
/** release single operation resource */
- protected void releaseQueryResource(long queryId) throws StorageEngineException {
+ public void releaseQueryResource(long queryId) throws StorageEngineException {
sessionManager.releaseQueryResource(queryId);
}
+ public void releaseQueryResourceNoExceptions(long queryId) {
+ if (queryId != -1) {
+ try {
+ releaseQueryResource(queryId);
+ } catch (Exception e) {
+ LOGGER.warn("Error occurred while releasing query resource: ", e);
+ }
+ }
+ }
+
@Override
public TSFetchMetadataResp fetchMetadata(TSFetchMetadataReq req) {
TSFetchMetadataResp resp = new TSFetchMetadataResp();
@@ -805,7 +815,7 @@ public class TSServiceImpl implements TSIService.Iface {
}
return resp;
} catch (Exception e) {
- sessionManager.releaseQueryResourceNoExceptions(queryId);
+ releaseQueryResourceNoExceptions(queryId);
throw e;
} finally {
Measurement.INSTANCE.addOperationLatency(Operation.EXECUTE_QUERY, startTime);
@@ -1009,7 +1019,7 @@ public class TSServiceImpl implements TSIService.Iface {
req.fetchSize, queryDataSet, sessionManager.getUsername(req.sessionId));
boolean hasResultSet = result.bufferForTime().limit() != 0;
if (!hasResultSet) {
- sessionManager.releaseQueryResourceNoExceptions(req.queryId);
+ releaseQueryResourceNoExceptions(req.queryId);
}
TSFetchResultsResp resp = RpcUtils.getTSFetchResultsResp(TSStatusCode.SUCCESS_STATUS);
resp.setHasResultSet(hasResultSet);
@@ -1047,7 +1057,7 @@ public class TSServiceImpl implements TSIService.Iface {
onNPEOrUnexpectedException(
e, "executing fetchResults", TSStatusCode.INTERNAL_SERVER_ERROR));
} catch (Exception e) {
- sessionManager.releaseQueryResourceNoExceptions(req.queryId);
+ releaseQueryResourceNoExceptions(req.queryId);
return RpcUtils.getTSFetchResultsResp(
onNPEOrUnexpectedException(
e, "executing fetchResults", TSStatusCode.INTERNAL_SERVER_ERROR));