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

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


The following commit(s) were added to refs/heads/kyy2 by this push:
     new 0edbcd7  log number out of bound exception
0edbcd7 is described below

commit 0edbcd7978599767b9d5f54b51ab621dcdad4718
Author: Ring-k <[email protected]>
AuthorDate: Thu Jul 23 10:53:52 2020 +0800

    log number out of bound exception
---
 .../exception/LogNumberOutOfBoundException.java    | 35 ++++++++++++++++++++++
 .../cluster/log/manage/CommittedEntryManager.java  |  4 +--
 .../iotdb/cluster/log/manage/RaftLogManager.java   | 23 ++++++++++----
 .../cluster/server/member/DataGroupMember.java     |  3 +-
 .../cluster/server/member/MetaGroupMember.java     | 12 ++++----
 .../iotdb/cluster/server/member/RaftMember.java    |  9 ++++--
 .../cluster/server/service/MetaAsyncService.java   | 14 +++++----
 .../apache/iotdb/cluster/utils/StatusUtils.java    |  4 +++
 .../java/org/apache/iotdb/rpc/TSStatusCode.java    |  1 +
 9 files changed, 84 insertions(+), 21 deletions(-)

diff --git 
a/cluster/src/main/java/org/apache/iotdb/cluster/exception/LogNumberOutOfBoundException.java
 
b/cluster/src/main/java/org/apache/iotdb/cluster/exception/LogNumberOutOfBoundException.java
new file mode 100644
index 0000000..318ed79
--- /dev/null
+++ 
b/cluster/src/main/java/org/apache/iotdb/cluster/exception/LogNumberOutOfBoundException.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.cluster.exception;
+
+public class LogNumberOutOfBoundException extends Exception{
+
+  public LogNumberOutOfBoundException(String message) {
+    super(message);
+  }
+
+  public LogNumberOutOfBoundException(String message, Throwable cause) {
+    super(message, cause);
+  }
+
+  public LogNumberOutOfBoundException() {
+    super();
+  }
+}
diff --git 
a/cluster/src/main/java/org/apache/iotdb/cluster/log/manage/CommittedEntryManager.java
 
b/cluster/src/main/java/org/apache/iotdb/cluster/log/manage/CommittedEntryManager.java
index 685a662..c3b987e 100644
--- 
a/cluster/src/main/java/org/apache/iotdb/cluster/log/manage/CommittedEntryManager.java
+++ 
b/cluster/src/main/java/org/apache/iotdb/cluster/log/manage/CommittedEntryManager.java
@@ -43,8 +43,8 @@ public class CommittedEntryManager {
    * Note that it is better to use applyingSnapshot to update dummy entry 
immediately after this
    * instance is created.
    */
-  public CommittedEntryManager() {
-    entries = new ArrayList<>();
+  public CommittedEntryManager(int maxNumOfLogInMem) {
+    entries = new ArrayList<>(maxNumOfLogInMem);
     entries.add(new EmptyContentLog(-1, -1));
   }
 
diff --git 
a/cluster/src/main/java/org/apache/iotdb/cluster/log/manage/RaftLogManager.java 
b/cluster/src/main/java/org/apache/iotdb/cluster/log/manage/RaftLogManager.java
index 1e4bde5..b590beb 100644
--- 
a/cluster/src/main/java/org/apache/iotdb/cluster/log/manage/RaftLogManager.java
+++ 
b/cluster/src/main/java/org/apache/iotdb/cluster/log/manage/RaftLogManager.java
@@ -31,6 +31,7 @@ import 
org.apache.iotdb.cluster.exception.EntryCompactedException;
 import org.apache.iotdb.cluster.exception.EntryUnavailableException;
 import org.apache.iotdb.cluster.exception.GetEntriesWrongParametersException;
 import org.apache.iotdb.cluster.exception.LogExecutionException;
+import org.apache.iotdb.cluster.exception.LogNumberOutOfBoundException;
 import org.apache.iotdb.cluster.exception.TruncateCommittedEntryException;
 import org.apache.iotdb.cluster.log.HardState;
 import org.apache.iotdb.cluster.log.Log;
@@ -63,13 +64,20 @@ public class RaftLogManager {
   /**
    * minimum number of committed logs in memory
    */
-  private int minNumOfLogsInMem = 
ClusterDescriptor.getInstance().getConfig().getMinNumOfLogsInMem();
+  private int minNumOfLogsInMem = ClusterDescriptor.getInstance().getConfig()
+      .getMinNumOfLogsInMem();
+
+  /**
+   * maximum number of committed logs in memory
+   */
+  private int maxNumOfLogsInMem = ClusterDescriptor.getInstance().getConfig()
+      .getMaxNumOfLogsInMem();
 
 
   public RaftLogManager(StableEntryManager stableEntryManager, LogApplier 
applier, String name) {
     this.logApplier = applier;
     this.name = name;
-    this.setCommittedEntryManager(new CommittedEntryManager());
+    this.setCommittedEntryManager(new 
CommittedEntryManager(maxNumOfLogsInMem));
     this.setStableEntryManager(stableEntryManager);
     try {
       
this.getCommittedEntryManager().append(stableEntryManager.getAllEntries());
@@ -241,7 +249,7 @@ public class RaftLogManager {
       }
       try {
         commitTo(Math.min(leaderCommit, newLastIndex), true);
-      } catch (LogExecutionException e) {
+      } catch (LogExecutionException | LogNumberOutOfBoundException e) {
         // exceptions are ignored on follower side
       }
       return newLastIndex;
@@ -272,7 +280,7 @@ public class RaftLogManager {
       }
       try {
         commitTo(Math.min(leaderCommit, newLastIndex), true);
-      } catch (LogExecutionException e) {
+      } catch (LogExecutionException | LogNumberOutOfBoundException e) {
         // exceptions are ignored on follower side
       }
       return newLastIndex;
@@ -328,7 +336,7 @@ public class RaftLogManager {
     if (leaderCommit > commitIndex && matchTerm(term, leaderCommit)) {
       try {
         commitTo(leaderCommit, true);
-      } catch (LogExecutionException e) {
+      } catch (LogExecutionException | LogNumberOutOfBoundException e) {
         // exceptions are ignored on follower side
       }
       return true;
@@ -401,7 +409,7 @@ public class RaftLogManager {
    * @param newCommitIndex request commitIndex
    */
   public void commitTo(long newCommitIndex, boolean ignoreExecutionExceptions)
-      throws LogExecutionException {
+      throws LogExecutionException, LogNumberOutOfBoundException {
     if (commitIndex < newCommitIndex) {
       long lo = getUnCommittedEntryManager().getFirstUnCommittedIndex();
       long hi = newCommitIndex + 1;
@@ -415,6 +423,9 @@ public class RaftLogManager {
               .clear();
         }
         try {
+          if (committedEntryManager.getTotalSize() + entries.size() > 
maxNumOfLogsInMem) {
+            throw new LogNumberOutOfBoundException();
+          }
           getCommittedEntryManager().append(entries);
           if 
(ClusterDescriptor.getInstance().getConfig().isEnableRaftLogPersistence()) {
             getStableEntryManager().append(entries);
diff --git 
a/cluster/src/main/java/org/apache/iotdb/cluster/server/member/DataGroupMember.java
 
b/cluster/src/main/java/org/apache/iotdb/cluster/server/member/DataGroupMember.java
index 43a4cb6..0312f21 100644
--- 
a/cluster/src/main/java/org/apache/iotdb/cluster/server/member/DataGroupMember.java
+++ 
b/cluster/src/main/java/org/apache/iotdb/cluster/server/member/DataGroupMember.java
@@ -55,6 +55,7 @@ import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.exception.CheckConsistencyException;
 import org.apache.iotdb.cluster.exception.LogExecutionException;
+import org.apache.iotdb.cluster.exception.LogNumberOutOfBoundException;
 import org.apache.iotdb.cluster.exception.PullFileException;
 import org.apache.iotdb.cluster.exception.ReaderNotFoundException;
 import org.apache.iotdb.cluster.exception.SnapshotApplicationException;
@@ -1031,7 +1032,7 @@ public class DataGroupMember extends RaftMember {
     }
     try {
       return appendLogInGroup(log);
-    } catch (LogExecutionException e) {
+    } catch (LogExecutionException | LogNumberOutOfBoundException e) {
       logger.error("Cannot close partition {}#{} seq:{}", storageGroupName, 
partitionId, isSeq, e);
       return false;
     }
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 8a081a6..f051025 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
@@ -79,6 +79,7 @@ import org.apache.iotdb.cluster.exception.AddSelfException;
 import org.apache.iotdb.cluster.exception.CheckConsistencyException;
 import org.apache.iotdb.cluster.exception.ConfigInconsistentException;
 import org.apache.iotdb.cluster.exception.LogExecutionException;
+import org.apache.iotdb.cluster.exception.LogNumberOutOfBoundException;
 import org.apache.iotdb.cluster.exception.PartitionTableUnavailableException;
 import org.apache.iotdb.cluster.exception.QueryTimeOutException;
 import org.apache.iotdb.cluster.exception.RequestTimeOutException;
@@ -577,7 +578,8 @@ public class MetaGroupMember extends RaftMember {
     } else if (resp.getRespNum() == 
Response.RESPONSE_NEW_NODE_PARAMETER_CONFLICT) {
       CheckStatusResponse checkStatusResponse = resp.getCheckStatusResponse();
       StringBuilder parameters = new StringBuilder();
-      parameters.append(checkStatusResponse.isPartitionalIntervalEquals() ? "" 
: ", partition interval");
+      parameters
+          .append(checkStatusResponse.isPartitionalIntervalEquals() ? "" : ", 
partition interval");
       parameters.append(checkStatusResponse.isHashSaltEquals() ? "" : ", hash 
salt");
       parameters.append(checkStatusResponse.isReplicationNumEquals() ? "" : ", 
replication number");
       parameters.append(checkStatusResponse.isSeedNodeEquals() ? "" : ", 
seedNodes");
@@ -771,7 +773,7 @@ public class MetaGroupMember extends RaftMember {
    * @param node cannot be the local node
    */
   public AddNodeResponse addNode(Node node, StartUpStatus startUpStatus)
-      throws AddSelfException, LogExecutionException {
+      throws AddSelfException, LogExecutionException, 
LogNumberOutOfBoundException {
     AddNodeResponse response = new AddNodeResponse();
     if (partitionTable == null) {
       logger.info("Cannot add node now because the partition table is not 
set");
@@ -803,7 +805,7 @@ public class MetaGroupMember extends RaftMember {
    * @return true if the process is over, false if the request should be 
forwarded
    */
   private boolean processAddNodeLocally(Node node, StartUpStatus startUpStatus,
-      AddNodeResponse response) throws LogExecutionException {
+      AddNodeResponse response) throws LogExecutionException, 
LogNumberOutOfBoundException {
     if (character != NodeCharacter.LEADER) {
       return false;
     }
@@ -2986,7 +2988,7 @@ public class MetaGroupMember extends RaftMember {
    * @param node the node to be removed.
    */
   public long removeNode(Node node)
-      throws PartitionTableUnavailableException, LogExecutionException {
+      throws PartitionTableUnavailableException, LogExecutionException, 
LogNumberOutOfBoundException {
     if (partitionTable == null) {
       logger.info("Cannot add node now because the partition table is not 
set");
       throw new PartitionTableUnavailableException(thisNode);
@@ -3007,7 +3009,7 @@ public class MetaGroupMember extends RaftMember {
    * @return Long.MIN_VALUE if further forwarding is required, or the 
execution result
    */
   private long processRemoveNodeLocally(Node node)
-      throws LogExecutionException {
+      throws LogExecutionException, LogNumberOutOfBoundException {
     if (character != NodeCharacter.LEADER) {
       return Response.RESPONSE_NULL;
     }
diff --git 
a/cluster/src/main/java/org/apache/iotdb/cluster/server/member/RaftMember.java 
b/cluster/src/main/java/org/apache/iotdb/cluster/server/member/RaftMember.java
index 706e87f..a72bbec 100644
--- 
a/cluster/src/main/java/org/apache/iotdb/cluster/server/member/RaftMember.java
+++ 
b/cluster/src/main/java/org/apache/iotdb/cluster/server/member/RaftMember.java
@@ -63,6 +63,7 @@ import org.apache.iotdb.cluster.config.ClusterConfig;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.exception.CheckConsistencyException;
 import org.apache.iotdb.cluster.exception.LogExecutionException;
+import org.apache.iotdb.cluster.exception.LogNumberOutOfBoundException;
 import org.apache.iotdb.cluster.exception.UnknownLogTypeException;
 import org.apache.iotdb.cluster.log.HardState;
 import org.apache.iotdb.cluster.log.Log;
@@ -1218,6 +1219,9 @@ public abstract class RaftMember {
       }
       tsStatus.setMessage(cause.getClass().getName() + ":" + 
cause.getMessage());
       return tsStatus;
+    } catch (LogNumberOutOfBoundException e) {
+      logger.debug("{} cannot be executed because {}", plan, e);
+      return StatusUtils.LOG_NUMBER_OUT_OF_BOUND_ERROR;
     }
     return StatusUtils.TIME_OUT;
   }
@@ -1237,7 +1241,8 @@ public abstract class RaftMember {
    * @param log
    * @return true if the log is accepted by the quorum of the group, false 
otherwise
    */
-  protected boolean appendLogInGroup(Log log) throws LogExecutionException {
+  protected boolean appendLogInGroup(Log log)
+      throws LogExecutionException, LogNumberOutOfBoundException {
     int retryTime = 0;
     while (true) {
       logger.debug("{}: Send log {} to other nodes, retry times: {}", name, 
log, retryTime);
@@ -1263,7 +1268,7 @@ public abstract class RaftMember {
   }
 
   @SuppressWarnings("java:S2445")
-  private void commitLog(Log log) throws LogExecutionException {
+  private void commitLog(Log log) throws LogExecutionException, 
LogNumberOutOfBoundException {
     synchronized (logManager) {
       logManager.commitTo(log.getCurrLogIndex(), false);
     }
diff --git 
a/cluster/src/main/java/org/apache/iotdb/cluster/server/service/MetaAsyncService.java
 
b/cluster/src/main/java/org/apache/iotdb/cluster/server/service/MetaAsyncService.java
index 106723d..d78fce1 100644
--- 
a/cluster/src/main/java/org/apache/iotdb/cluster/server/service/MetaAsyncService.java
+++ 
b/cluster/src/main/java/org/apache/iotdb/cluster/server/service/MetaAsyncService.java
@@ -22,6 +22,7 @@ package org.apache.iotdb.cluster.server.service;
 import org.apache.iotdb.cluster.exception.AddSelfException;
 import org.apache.iotdb.cluster.exception.LeaderUnknownException;
 import org.apache.iotdb.cluster.exception.LogExecutionException;
+import org.apache.iotdb.cluster.exception.LogNumberOutOfBoundException;
 import org.apache.iotdb.cluster.exception.PartitionTableUnavailableException;
 import org.apache.iotdb.cluster.rpc.thrift.AddNodeResponse;
 import org.apache.iotdb.cluster.rpc.thrift.AppendEntryRequest;
@@ -69,7 +70,7 @@ public class MetaAsyncService extends BaseAsyncService 
implements TSMetaService.
     AddNodeResponse addNodeResponse = null;
     try {
       addNodeResponse = metaGroupMember.addNode(node, startUpStatus);
-    } catch (AddSelfException | LogExecutionException e) {
+    } catch (AddSelfException | LogExecutionException | 
LogNumberOutOfBoundException e) {
       resultHandler.onError(e);
     }
     if (addNodeResponse != null) {
@@ -100,7 +101,8 @@ public class MetaAsyncService extends BaseAsyncService 
implements TSMetaService.
   @Override
   public void checkStatus(StartUpStatus startUpStatus,
       AsyncMethodCallback<CheckStatusResponse> resultHandler) {
-    CheckStatusResponse response = ClusterUtils.checkStatus(startUpStatus, 
metaGroupMember.getNewStartUpStatus());
+    CheckStatusResponse response = ClusterUtils
+        .checkStatus(startUpStatus, metaGroupMember.getNewStartUpStatus());
     resultHandler.onComplete(response);
   }
 
@@ -145,7 +147,7 @@ public class MetaAsyncService extends BaseAsyncService 
implements TSMetaService.
     long result = Response.RESPONSE_NULL;
     try {
       result = metaGroupMember.removeNode(node);
-    } catch (PartitionTableUnavailableException | LogExecutionException e) {
+    } catch (PartitionTableUnavailableException | LogExecutionException | 
LogNumberOutOfBoundException e) {
       resultHandler.onError(e);
     }
 
@@ -154,8 +156,10 @@ public class MetaAsyncService extends BaseAsyncService 
implements TSMetaService.
       return;
     }
 
-    if (metaGroupMember.getCharacter() == NodeCharacter.FOLLOWER && 
metaGroupMember.getLeader() != null) {
-      logger.info("Forward the node removal request of {} to leader {}", node, 
metaGroupMember.getLeader());
+    if (metaGroupMember.getCharacter() == NodeCharacter.FOLLOWER
+        && metaGroupMember.getLeader() != null) {
+      logger.info("Forward the node removal request of {} to leader {}", node,
+          metaGroupMember.getLeader());
       if (forwardRemoveNode(node, resultHandler)) {
         return;
       }
diff --git 
a/cluster/src/main/java/org/apache/iotdb/cluster/utils/StatusUtils.java 
b/cluster/src/main/java/org/apache/iotdb/cluster/utils/StatusUtils.java
index 5cadaeb..d68d51b 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/utils/StatusUtils.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/utils/StatusUtils.java
@@ -42,6 +42,8 @@ public class StatusUtils {
   public static final TSStatus NO_STORAGE_GROUP = 
getStatus(TSStatusCode.STORAGE_GROUP_ERROR);
   public static final TSStatus NODE_READ_ONLY = 
getStatus(TSStatusCode.NODE_READ_ONLY);
   public static final TSStatus CONSISTENCY_FAILURE = 
getStatus(TSStatusCode.CONSISTENCY_FAILURE);
+  public static final TSStatus LOG_NUMBER_OUT_OF_BOUND_ERROR = getStatus(
+      TSStatusCode.LOG_NUMBER_OUT_OF_BOUND_ERROR);
 
 
   private static TSStatus getStatus(TSStatusCode statusCode) {
@@ -190,6 +192,8 @@ public class StatusUtils {
       case UNSUPPORTED_OPERATION:
         status.setMessage("unsupported operation. ");
         break;
+      case LOG_NUMBER_OUT_OF_BOUND_ERROR:
+        status.setMessage("Log number is out of bound. ");
       default:
         status.setMessage("");
         break;
diff --git a/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java 
b/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java
index 9b9c031..e2c4851 100644
--- a/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java
+++ b/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java
@@ -58,6 +58,7 @@ public enum TSStatusCode {
   PATH_ERROR(410),
   QUERY_PROCESS_ERROR(411),
   WRITE_PROCESS_ERROR(412),
+  LOG_NUMBER_OUT_OF_BOUND_ERROR(413),
 
   INTERNAL_SERVER_ERROR(500),
   CLOSE_OPERATION_ERROR(501),

Reply via email to