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

jackietien 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 bc1a59e6a6 Guarantee Atomicity in Ratis InstallSnapshot RPC (#7131)
bc1a59e6a6 is described below

commit bc1a59e6a65bbd6be6331df8857c84efe813c11c
Author: William Song <[email protected]>
AuthorDate: Tue Aug 30 16:51:43 2022 +0800

    Guarantee Atomicity in Ratis InstallSnapshot RPC (#7131)
---
 .../apache/iotdb/consensus/ratis/SnapshotStorage.java    | 16 +++++++++-------
 .../org/apache/iotdb/consensus/ratis/SnapshotTest.java   |  6 +++++-
 2 files changed, 14 insertions(+), 8 deletions(-)

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 60d117dee3..aaa766029e 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
@@ -117,13 +117,20 @@ public class SnapshotStorage implements 
StateMachineStorage {
     }
 
     List<FileInfo> fileInfos = new ArrayList<>();
+    FileInfo metafileInfo = null;
     for (Path file : actualSnapshotFiles) {
       if (file.endsWith(".md5")) {
         continue;
       }
       FileInfo fileInfo = new FileInfoWithDelayedMd5Computing(file);
-      fileInfos.add(fileInfo);
+      if (file.toFile().getName().startsWith(META_FILE_PREFIX)) {
+        metafileInfo = fileInfo;
+      } else {
+        fileInfos.add(fileInfo);
+      }
     }
+    // metafile should be sent last for atomicity considerations
+    fileInfos.add(metafileInfo);
 
     return new FileListSnapshotInfo(
         fileInfos, snapshotTermIndex.getTerm(), snapshotTermIndex.getIndex());
@@ -176,11 +183,6 @@ public class SnapshotStorage implements 
StateMachineStorage {
     return snapshotDir.getAbsolutePath() + File.separator + META_FILE_PREFIX + 
termIndexMetadata;
   }
 
-  private String getMetafileMatcherRegex() {
-    // meta file should always end with term_index
-    return META_FILE_PREFIX + "\\d+_\\d+$";
-  }
-
   /**
    * After leader InstallSnapshot to a slow follower, Ratis will put all 
snapshot files directly
    * under statemachineDir. We need to handle this special scenario and 
rearrange these files to
@@ -189,7 +191,7 @@ public class SnapshotStorage implements StateMachineStorage 
{
    */
   void moveSnapshotFileToSubDirectory() {
     File[] potentialMetafile =
-        stateMachineDir.listFiles((dir, name) -> 
name.matches(getMetafileMatcherRegex()));
+        stateMachineDir.listFiles((dir, name) -> 
name.startsWith(META_FILE_PREFIX));
     if (potentialMetafile == null || potentialMetafile.length == 0) {
       // the statemachine dir contains no direct metafile
       return;
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 fc89eebd4d..ee6149c928 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
@@ -118,6 +118,10 @@ public class SnapshotTest {
     SnapshotInfo info = proxy.getLatestSnapshot();
     Assert.assertEquals(info.getTerm(), 616);
     Assert.assertEquals(info.getIndex(), 4217);
+    // metafile must be the last file in SnapshotInfo for atomicity 
consideration
+    Path last = info.getFiles().get(info.getFiles().size() - 1).getPath();
+    Assert.assertEquals(
+        last.toFile().getName(), new 
File(getSnapshotMetaFilename("616_4217")).getName());
 
     // clean up
     proxy.getStateMachineStorage().cleanupOldSnapshots(null);
@@ -190,7 +194,7 @@ public class SnapshotTest {
     String actualSnapshotName =
         CrossDiskLinkStatemachine.ensureSnapshotFileName(testDir, "20_1005");
     File actualSnapshotFile = new File(actualSnapshotName);
-    Assert.assertEquals(proxy.getLatestSnapshot().getFiles().size(), 1);
+    Assert.assertEquals(proxy.getLatestSnapshot().getFiles().size(), 2);
     Assert.assertEquals(
         
proxy.getLatestSnapshot().getFiles().get(0).getPath().toFile().getAbsolutePath(),
         actualSnapshotFile.getAbsolutePath());

Reply via email to