This is an automated email from the ASF dual-hosted git repository.
qiaojialin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new e3dbb4ae44 guarantee atomicity for latest Csnapshot (#7070)
e3dbb4ae44 is described below
commit e3dbb4ae4483fb3a91af7cefcdf08feaf2446b80
Author: William Song <[email protected]>
AuthorDate: Mon Aug 22 21:53:29 2022 +0800
guarantee atomicity for latest Csnapshot (#7070)
---
.../consensus/ratis/ApplicationStateMachineProxy.java | 2 +-
.../apache/iotdb/consensus/ratis/SnapshotStorage.java | 16 +++++++++++++++-
.../org/apache/iotdb/consensus/ratis/SnapshotTest.java | 6 ++++++
3 files changed, 22 insertions(+), 2 deletions(-)
diff --git
a/consensus/src/main/java/org/apache/iotdb/consensus/ratis/ApplicationStateMachineProxy.java
b/consensus/src/main/java/org/apache/iotdb/consensus/ratis/ApplicationStateMachineProxy.java
index 601791f257..be98aac33b 100644
---
a/consensus/src/main/java/org/apache/iotdb/consensus/ratis/ApplicationStateMachineProxy.java
+++
b/consensus/src/main/java/org/apache/iotdb/consensus/ratis/ApplicationStateMachineProxy.java
@@ -174,7 +174,7 @@ public class ApplicationStateMachineProxy extends
BaseStateMachine {
// delete snapshotDir fully in case of last takeSnapshot() crashed
FileUtils.deleteFully(snapshotDir);
- snapshotDir.mkdir();
+ snapshotDir.mkdirs();
if (!snapshotDir.isDirectory()) {
logger.error("Unable to create snapshotDir at {}", snapshotDir);
return RaftLog.INVALID_LOG_INDEX;
diff --git
a/consensus/src/main/java/org/apache/iotdb/consensus/ratis/SnapshotStorage.java
b/consensus/src/main/java/org/apache/iotdb/consensus/ratis/SnapshotStorage.java
index ecbc4ae628..de0f70a427 100644
---
a/consensus/src/main/java/org/apache/iotdb/consensus/ratis/SnapshotStorage.java
+++
b/consensus/src/main/java/org/apache/iotdb/consensus/ratis/SnapshotStorage.java
@@ -90,7 +90,21 @@ public class SnapshotStorage implements StateMachineStorage {
if (snapshots == null || snapshots.length == 0) {
return null;
}
- return snapshots[snapshots.length - 1].toFile();
+ int i = snapshots.length - 1;
+ for (; i >= 0; i--) {
+ String metafilePath =
+ getMetafilePath(snapshots[i].toFile(),
snapshots[i].getFileName().toString());
+ if (new File(metafilePath).exists()) {
+ break;
+ } else {
+ try {
+ FileUtils.deleteFully(snapshots[i]);
+ } catch (IOException e) {
+ logger.warn("delete incomplete snapshot directory {} failed due to
{}", snapshots[i], e);
+ }
+ }
+ }
+ return i < 0 ? null : snapshots[i].toFile();
}
private List<Path> getAllFilesUnder(File rootDir) {
diff --git
a/consensus/src/test/java/org/apache/iotdb/consensus/ratis/SnapshotTest.java
b/consensus/src/test/java/org/apache/iotdb/consensus/ratis/SnapshotTest.java
index 45b4d6ee6b..204a6725c4 100644
--- a/consensus/src/test/java/org/apache/iotdb/consensus/ratis/SnapshotTest.java
+++ b/consensus/src/test/java/org/apache/iotdb/consensus/ratis/SnapshotTest.java
@@ -116,6 +116,12 @@ public class SnapshotTest {
proxy.getStateMachineStorage().cleanupOldSnapshots(null);
Assert.assertFalse(new File(snapshotFilename).exists());
Assert.assertTrue(new File(snapshotFilenameLatest).exists());
+
+ // delete meta file, then the proxy will consider the latest snapshotInfo
incomplete
+ Assert.assertTrue(new File(getSnapshotMetaFilename("616_4217")).delete());
+ info = proxy.getLatestSnapshot();
+ Assert.assertNull(info);
+ Assert.assertFalse(new File(snapshotFilenameLatest).exists());
}
private String getSnapshotMetaFilename(String termIndexMeta) {