This is an automated email from the ASF dual-hosted git repository.
chaow pushed a commit to branch rel/0.12
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/rel/0.12 by this push:
new a203da6 init dummyIndex after restart cluster (#3939) (#4104)
a203da6 is described below
commit a203da61130a3647b8b6dc41c45fd45e1a52fe76
Author: Houliang Qi <[email protected]>
AuthorDate: Mon Oct 11 17:47:49 2021 +0800
init dummyIndex after restart cluster (#3939) (#4104)
Co-authored-by: lisijia <[email protected]>
---
.../iotdb/cluster/log/StableEntryManager.java | 6 ++++++
.../cluster/log/manage/CommittedEntryManager.java | 12 +++++++++++
.../iotdb/cluster/log/manage/RaftLogManager.java | 6 +++++-
.../serializable/SyncLogDequeSerializer.java | 25 ++++++++++++++++++++++
4 files changed, 48 insertions(+), 1 deletion(-)
diff --git
a/cluster/src/main/java/org/apache/iotdb/cluster/log/StableEntryManager.java
b/cluster/src/main/java/org/apache/iotdb/cluster/log/StableEntryManager.java
index 62d34f3..c82597e 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/log/StableEntryManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/log/StableEntryManager.java
@@ -19,6 +19,8 @@
package org.apache.iotdb.cluster.log;
+import org.apache.iotdb.cluster.log.manage.serializable.LogManagerMeta;
+
import java.io.IOException;
import java.util.List;
@@ -26,6 +28,8 @@ public interface StableEntryManager {
List<Log> getAllEntriesAfterAppliedIndex();
+ List<Log> getAllEntriesAfterCommittedIndex();
+
void append(List<Log> entries, long maxHaveAppliedCommitIndex) throws
IOException;
void flushLogBuffer();
@@ -38,6 +42,8 @@ public interface StableEntryManager {
HardState getHardState();
+ LogManagerMeta getMeta();
+
/**
* @param startIndex (inclusive) the log start index
* @param endIndex (inclusive) the log end index
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 d8d511b..43b35ce 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
@@ -25,6 +25,7 @@ import
org.apache.iotdb.cluster.exception.TruncateCommittedEntryException;
import org.apache.iotdb.cluster.log.Log;
import org.apache.iotdb.cluster.log.Snapshot;
import org.apache.iotdb.cluster.log.logtypes.EmptyContentLog;
+import org.apache.iotdb.cluster.log.manage.serializable.LogManagerMeta;
import org.apache.iotdb.db.utils.TestOnly;
import org.slf4j.Logger;
@@ -53,6 +54,17 @@ public class CommittedEntryManager {
entryTotalMemSize = 0;
}
+ CommittedEntryManager(int maxNumOfLogInMem, LogManagerMeta meta) {
+ entries = Collections.synchronizedList(new ArrayList<>(maxNumOfLogInMem));
+ entries.add(
+ new EmptyContentLog(
+ meta.getMaxHaveAppliedCommitIndex() == -1
+ ? -1
+ : meta.getMaxHaveAppliedCommitIndex() - 1,
+ meta.getLastLogTerm()));
+ entryTotalMemSize = 0;
+ }
+
/**
* Overwrite the contents of this object with those of the given snapshot.
Note that this function
* is only used if you want to override all the contents, otherwise please
use
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 446eefc..3ae298c 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
@@ -30,6 +30,7 @@ import org.apache.iotdb.cluster.log.Log;
import org.apache.iotdb.cluster.log.LogApplier;
import org.apache.iotdb.cluster.log.Snapshot;
import org.apache.iotdb.cluster.log.StableEntryManager;
+import org.apache.iotdb.cluster.log.manage.serializable.LogManagerMeta;
import org.apache.iotdb.cluster.server.monitor.Timer.Statistic;
import org.apache.iotdb.db.utils.TestOnly;
import org.apache.iotdb.tsfile.utils.RamUsageEstimator;
@@ -115,7 +116,8 @@ public abstract class RaftLogManager {
protected RaftLogManager(StableEntryManager stableEntryManager, LogApplier
applier, String name) {
this.logApplier = applier;
this.name = name;
- this.setCommittedEntryManager(new
CommittedEntryManager(maxNumOfLogsInMem));
+ LogManagerMeta meta = stableEntryManager.getMeta();
+ this.setCommittedEntryManager(new CommittedEntryManager(maxNumOfLogsInMem,
meta));
this.setStableEntryManager(stableEntryManager);
try {
this.getCommittedEntryManager().append(stableEntryManager.getAllEntriesAfterAppliedIndex());
@@ -125,6 +127,8 @@ public abstract class RaftLogManager {
long first = getCommittedEntryManager().getDummyIndex();
long last = getCommittedEntryManager().getLastIndex();
this.setUnCommittedEntryManager(new UnCommittedEntryManager(last + 1));
+ this.getUnCommittedEntryManager()
+
.truncateAndAppend(stableEntryManager.getAllEntriesAfterCommittedIndex());
/** must have applied entry [compactIndex,last] to state machine */
this.commitIndex = last;
diff --git
a/cluster/src/main/java/org/apache/iotdb/cluster/log/manage/serializable/SyncLogDequeSerializer.java
b/cluster/src/main/java/org/apache/iotdb/cluster/log/manage/serializable/SyncLogDequeSerializer.java
index 87f2c8b..7579a51 100644
---
a/cluster/src/main/java/org/apache/iotdb/cluster/log/manage/serializable/SyncLogDequeSerializer.java
+++
b/cluster/src/main/java/org/apache/iotdb/cluster/log/manage/serializable/SyncLogDequeSerializer.java
@@ -219,6 +219,7 @@ public class SyncLogDequeSerializer implements
StableEntryManager {
}
/** for log tools */
+ @Override
public LogManagerMeta getMeta() {
return meta;
}
@@ -236,6 +237,30 @@ public class SyncLogDequeSerializer implements
StableEntryManager {
return getLogs(meta.getMaxHaveAppliedCommitIndex(),
meta.getCommitLogIndex());
}
+ /**
+ * When raft log files flushed,meta would not be flushed synchronously.So
data has flushed to disk
+ * is uncommitted for persistent LogManagerMeta(meta's info is stale).We
need to recover these
+ * already persistent logs.
+ *
+ * <p>For example,commitIndex is 5 in persistent LogManagerMeta,But the log
file has actually been
+ * flushed to 7,when we restart cluster,we need to recover 6 and 7.
+ *
+ * <p>Maybe,we can extract getAllEntriesAfterAppliedIndex and
getAllEntriesAfterCommittedIndex
+ * into getAllEntriesByIndex,but now there are too many test cases using it.
+ */
+ @Override
+ public List<Log> getAllEntriesAfterCommittedIndex() {
+ long lastIndex = firstLogIndex + logIndexOffsetList.size() - 1;
+ logger.debug(
+ "getAllEntriesAfterCommittedIndex, firstUnCommitIndex={},
lastIndexBeforeStart={}",
+ meta.getCommitLogIndex() + 1,
+ lastIndex);
+ if (meta.getCommitLogIndex() >= lastIndex) {
+ return Collections.emptyList();
+ }
+ return getLogs(meta.getCommitLogIndex() + 1, lastIndex);
+ }
+
@Override
public void append(List<Log> entries, long maxHaveAppliedCommitIndex) throws
IOException {
lock.lock();