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),