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

jiangtian pushed a commit to branch cluster_new
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git


The following commit(s) were added to refs/heads/cluster_new by this push:
     new 0c07a44  fix query clientPool leak
     new 0e8f77c  Merge pull request #1618 from 
LebronAl/cluster_new_bug_clientpool_query_leak
0c07a44 is described below

commit 0c07a44478ec176d5fc028093eda07a51a546022
Author: LebronAl <[email protected]>
AuthorDate: Thu Aug 13 21:09:31 2020 +0800

    fix query clientPool leak
---
 .../iotdb/cluster/query/reader/DataSourceInfo.java | 40 ++++++++++------------
 .../cluster/server/member/MetaGroupMember.java     |  8 ++---
 .../cluster/query/reader/DatasourceInfoTest.java   |  7 ++--
 .../reader/RemoteSeriesReaderByTimestampTest.java  | 10 +++---
 .../query/reader/RemoteSimpleSeriesReaderTest.java |  4 +--
 .../handlers/caller/HeartbeatHandlerTest.java      |  6 ++--
 6 files changed, 38 insertions(+), 37 deletions(-)

diff --git 
a/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/DataSourceInfo.java
 
b/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/DataSourceInfo.java
index eabc6df..8f2255a 100644
--- 
a/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/DataSourceInfo.java
+++ 
b/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/DataSourceInfo.java
@@ -24,7 +24,6 @@ import java.util.List;
 import org.apache.iotdb.cluster.client.async.AsyncDataClient;
 import org.apache.iotdb.cluster.client.sync.SyncClientAdaptor;
 import org.apache.iotdb.cluster.client.sync.SyncDataClient;
-import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.partition.PartitionGroup;
 import org.apache.iotdb.cluster.query.RemoteQueryContext;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
@@ -52,9 +51,9 @@ public class DataSourceInfo {
   private RemoteQueryContext context;
   private MetaGroupMember metaGroupMember;
   private List<Node> nodes;
-  private boolean isNoData;
   private int curPos;
-  private boolean noClient = false;
+  private boolean isNoData = false;
+  private boolean isNoClient = false;
 
   public DataSourceInfo(PartitionGroup group, TSDataType dataType,
       SingleSeriesQueryRequest request, RemoteQueryContext context,
@@ -66,16 +65,15 @@ public class DataSourceInfo {
     this.context = context;
     this.metaGroupMember = metaGroupMember;
     this.nodes = nodes;
-    this.isNoData = false;
     // set to the last node so after nextDataClient() is called it will scan 
from the first node
     this.curPos = nodes.size() - 1;
     this.curSource = nodes.get(curPos);
   }
 
-  public AsyncDataClient nextDataClient(boolean byTimestamp, long timestamp) {
+  public boolean hasNextDataClient(boolean byTimestamp, long timestamp) {
     if (this.nodes.isEmpty()) {
       this.isNoData = false;
-      return null;
+      return false;
     }
 
     int nextNodePos = (this.curPos + 1) % this.nodes.size();
@@ -96,14 +94,13 @@ public class DataSourceInfo {
             this.readerId = newReaderId;
             this.curSource = node;
             this.curPos = nextNodePos;
-            return this.metaGroupMember
-                .getAsyncDataClient(node, 
RaftServer.getReadOperationTimeoutMS());
+            return true;
           } else {
             // the id being -1 means there is no satisfying data on the remote 
node, create an
             // empty reader to reduce further communication
-            this.noClient = true;
+            this.isNoClient = true;
             this.isNoData = true;
-            return null;
+            return false;
           }
         }
       } catch (TException | IOException e) {
@@ -115,13 +112,13 @@ public class DataSourceInfo {
       nextNodePos = (nextNodePos + 1) % this.nodes.size();
       if (nextNodePos == this.curPos) {
         // has iterate over all nodes
-        noClient = true;
+        isNoClient = true;
         break;
       }
     }
     // all nodes are failed
     this.isNoData = false;
-    return null;
+    return false;
   }
 
   private Long applyForReaderId(AsyncDataClient client, boolean byTimestamp, 
long timestamp)
@@ -152,17 +149,21 @@ public class DataSourceInfo {
   }
 
   public AsyncDataClient getCurAsyncClient(int timeout) throws IOException {
-    return noClient ? null : 
metaGroupMember.getAsyncDataClient(this.curSource, timeout);
+    return isNoClient ? null : 
metaGroupMember.getAsyncDataClient(this.curSource, timeout);
   }
 
   public SyncDataClient getCurSyncClient(int timeout) throws IOException {
-    return noClient ? null : metaGroupMember.getSyncDataClient(this.curSource, 
timeout);
+    return isNoClient ? null : 
metaGroupMember.getSyncDataClient(this.curSource, timeout);
   }
 
   public boolean isNoData() {
     return this.isNoData;
   }
 
+  public boolean isNoClient(){
+    return this.isNoClient;
+  }
+
   @Override
   public String toString() {
     return "DataSourceInfo{" +
@@ -180,10 +181,7 @@ public class DataSourceInfo {
    * @throws IOException if all clients are unavailable.
    */
   boolean checkCurClient() throws IOException {
-    if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()
-        && getCurAsyncClient(RaftServer.getConnectionTimeoutInMS()) == null ||
-        !ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()
-            && getCurSyncClient(RaftServer.getConnectionTimeoutInMS()) == 
null) {
+    if (isNoClient()) {
       if (!isNoData()) {
         throw new IOException("no available client.");
       } else {
@@ -196,9 +194,9 @@ public class DataSourceInfo {
   }
 
   boolean switchNode(boolean byTimestamp, long timeOffset) throws IOException {
-    AsyncDataClient newClient = nextDataClient(byTimestamp, timeOffset);
-    logger.info("Client failed, changed to {}", newClient);
-    if (newClient == null) {
+    boolean hasClient = hasNextDataClient(byTimestamp, timeOffset);
+    logger.info("Client failed, changed to {}", curSource);
+    if (!hasClient) {
       if (!isNoData()) {
         throw new IOException("no available client.");
       } else {
diff --git 
a/cluster/src/main/java/org/apache/iotdb/cluster/server/member/MetaGroupMember.java
 
b/cluster/src/main/java/org/apache/iotdb/cluster/server/member/MetaGroupMember.java
index d664c1d..51ccd0b 100644
--- 
a/cluster/src/main/java/org/apache/iotdb/cluster/server/member/MetaGroupMember.java
+++ 
b/cluster/src/main/java/org/apache/iotdb/cluster/server/member/MetaGroupMember.java
@@ -2322,8 +2322,8 @@ public class MetaGroupMember extends RaftMember {
     DataSourceInfo dataSourceInfo = new DataSourceInfo(partitionGroup, 
dataType, request,
         (RemoteQueryContext) context, this, partitionGroup);
 
-    AsyncDataClient client = dataSourceInfo.nextDataClient(true, 
Long.MIN_VALUE);
-    if (client != null) {
+    boolean hasClient = dataSourceInfo.hasNextDataClient(true, Long.MIN_VALUE);
+    if (hasClient) {
       return new RemoteSeriesReaderByTimestamp(dataSourceInfo);
     } else if (dataSourceInfo.isNoData()) {
       return new EmptyReader();
@@ -2672,8 +2672,8 @@ public class MetaGroupMember extends RaftMember {
     DataSourceInfo dataSourceInfo = new DataSourceInfo(partitionGroup, 
dataType, request,
         (RemoteQueryContext) context, this, orderedNodes);
 
-    AsyncDataClient client = dataSourceInfo.nextDataClient(false, 
Long.MIN_VALUE);
-    if (client != null) {
+    boolean hasClient = dataSourceInfo.hasNextDataClient(false, 
Long.MIN_VALUE);
+    if (hasClient) {
       return new RemoteSimpleSeriesReader(dataSourceInfo);
     } else if (dataSourceInfo.isNoData()) {
       // there is no satisfying data on the remote node
diff --git 
a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/DatasourceInfoTest.java
 
b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/DatasourceInfoTest.java
index eca6d97..d05c58a84 100644
--- 
a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/DatasourceInfoTest.java
+++ 
b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/DatasourceInfoTest.java
@@ -20,8 +20,7 @@
 
 package org.apache.iotdb.cluster.query.reader;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertFalse;
 
 import java.io.IOException;
 import org.apache.iotdb.cluster.client.async.AsyncDataClient;
@@ -68,8 +67,8 @@ public class DatasourceInfoTest {
 
     DataSourceInfo sourceInfo = new DataSourceInfo(group, TSDataType.DOUBLE,
       request, context, metaGroupMember, group);
-    AsyncDataClient client = sourceInfo.nextDataClient(false, Long.MIN_VALUE);
+    boolean hasClient = sourceInfo.hasNextDataClient(false, Long.MIN_VALUE);
 
-    assertNull(client);
+    assertFalse(hasClient);
   }
 }
diff --git 
a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestampTest.java
 
b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestampTest.java
index aa78946..2011d40 100644
--- 
a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestampTest.java
+++ 
b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestampTest.java
@@ -19,6 +19,10 @@
 
 package org.apache.iotdb.cluster.query.reader;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
 import java.io.ByteArrayOutputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
@@ -42,8 +46,6 @@ import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
-import static org.junit.Assert.*;
-
 public class RemoteSeriesReaderByTimestampTest {
 
   private BatchData batchData = TestUtils.genBatchData(TSDataType.DOUBLE, 0, 
100);
@@ -122,7 +124,7 @@ public class RemoteSeriesReaderByTimestampTest {
 
     DataSourceInfo sourceInfo = new DataSourceInfo(group, TSDataType.DOUBLE,
         request, context, metaGroupMember, group);
-    sourceInfo.nextDataClient(true, Long.MIN_VALUE);
+    sourceInfo.hasNextDataClient(true, Long.MIN_VALUE);
 
     RemoteSeriesReaderByTimestamp reader = new 
RemoteSeriesReaderByTimestamp(sourceInfo);
 
@@ -146,7 +148,7 @@ public class RemoteSeriesReaderByTimestampTest {
     DataSourceInfo sourceInfo = new DataSourceInfo(group, TSDataType.DOUBLE,
         request, context, metaGroupMember, group);
     long startTime = System.currentTimeMillis();
-    sourceInfo.nextDataClient(true, Long.MIN_VALUE);
+    sourceInfo.hasNextDataClient(true, Long.MIN_VALUE);
     RemoteSeriesReaderByTimestamp reader = new 
RemoteSeriesReaderByTimestamp(sourceInfo);
 
     long endTime = System.currentTimeMillis();
diff --git 
a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSimpleSeriesReaderTest.java
 
b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSimpleSeriesReaderTest.java
index 86071b3..8f66f8e 100644
--- 
a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSimpleSeriesReaderTest.java
+++ 
b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSimpleSeriesReaderTest.java
@@ -123,7 +123,7 @@ public class RemoteSimpleSeriesReaderTest {
 
     DataSourceInfo sourceInfo = new DataSourceInfo(group, TSDataType.DOUBLE,
         request, context, metaGroupMember, group);
-    sourceInfo.nextDataClient(false, Long.MIN_VALUE);
+    sourceInfo.hasNextDataClient(false, Long.MIN_VALUE);
 
     reader = new RemoteSimpleSeriesReader(sourceInfo);
 
@@ -153,7 +153,7 @@ public class RemoteSimpleSeriesReaderTest {
 
     DataSourceInfo sourceInfo = new DataSourceInfo(group, TSDataType.DOUBLE,
         request, context, metaGroupMember, group);
-    sourceInfo.nextDataClient(false, Long.MIN_VALUE);
+    sourceInfo.hasNextDataClient(false, Long.MIN_VALUE);
     reader = new RemoteSimpleSeriesReader(sourceInfo);
 
     // normal read
diff --git 
a/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/HeartbeatHandlerTest.java
 
b/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/HeartbeatHandlerTest.java
index ca6f860..bb4bef1 100644
--- 
a/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/HeartbeatHandlerTest.java
+++ 
b/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/HeartbeatHandlerTest.java
@@ -30,7 +30,6 @@ import org.apache.iotdb.cluster.common.TestUtils;
 import org.apache.iotdb.cluster.rpc.thrift.HeartBeatResponse;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.server.Response;
-import org.apache.iotdb.cluster.server.handlers.caller.HeartbeatHandler;
 import org.apache.iotdb.cluster.server.member.MetaGroupMember;
 import org.junit.After;
 import org.junit.Before;
@@ -40,6 +39,7 @@ public class HeartbeatHandlerTest {
 
   private MetaGroupMember metaGroupMember;
   private boolean catchUpFlag;
+  private long looseInconsistentNum = 5;
 
   @Before
   public void setUp() {
@@ -70,7 +70,9 @@ public class HeartbeatHandlerTest {
     response.setLastLogTerm(-2);
     response.setFollower(new Node("192.168.0.6", 9003, 6, 40010));
     catchUpFlag = false;
-    handler.onComplete(response);
+    for (int i = 0; i < looseInconsistentNum; i++) {
+      handler.onComplete(response);
+    }
     assertTrue(catchUpFlag);
   }
 

Reply via email to