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

szetszwo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ratis.git


The following commit(s) were added to refs/heads/master by this push:
     new 05f392211 RATIS-1887. Gap between segement log (#919)
05f392211 is described below

commit 05f39221102abc00b2934e279da872d06f6a1811
Author: hao guo <[email protected]>
AuthorDate: Mon Sep 18 13:57:29 2023 +0800

    RATIS-1887. Gap between segement log (#919)
---
 .../raftlog/segmented/SegmentedRaftLogCache.java   | 17 ++++++++++--
 .../raftlog/segmented/SegmentedRaftLogWorker.java  | 30 ++++++++++++----------
 2 files changed, 31 insertions(+), 16 deletions(-)

diff --git 
a/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLogCache.java
 
b/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLogCache.java
index 631cbf951..6d5aa6d41 100644
--- 
a/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLogCache.java
+++ 
b/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLogCache.java
@@ -51,6 +51,20 @@ public class SegmentedRaftLogCache {
   public static final Logger LOG = 
LoggerFactory.getLogger(SegmentedRaftLogCache.class);
 
   static final class SegmentFileInfo {
+    static final SegmentFileInfo[] EMPTY_ARRAY = {};
+    static final Comparator<SegmentFileInfo> REVERSED_ORDER = 
Comparator.comparingLong(SegmentFileInfo::getStartIndex)
+        .thenComparingLong(SegmentFileInfo::getEndIndex)
+        .reversed();
+
+    static SegmentFileInfo[] toSortedArray(List<SegmentFileInfo> list) {
+      if (list == null) {
+        return EMPTY_ARRAY;
+      }
+      final SegmentFileInfo[] array = list.toArray(EMPTY_ARRAY);
+      Arrays.sort(array, REVERSED_ORDER);
+      return array;
+    }
+
     static SegmentFileInfo newClosedSegmentFileInfo(LogSegment ls) {
       Objects.requireNonNull(ls, "ls == null");
       Preconditions.assertTrue(!ls.isOpen(), () -> ls + " is OPEN");
@@ -121,8 +135,7 @@ public class SegmentedRaftLogCache {
 
     TruncationSegments(SegmentFileInfo toTruncate,
                        List<SegmentFileInfo> toDelete) {
-      this.toDelete = toDelete == null ? null :
-          toDelete.toArray(new SegmentFileInfo[toDelete.size()]);
+      this.toDelete = SegmentFileInfo.toSortedArray(toDelete);
       this.toTruncate = toTruncate;
     }
 
diff --git 
a/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLogWorker.java
 
b/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLogWorker.java
index 7928f2297..9f34f2917 100644
--- 
a/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLogWorker.java
+++ 
b/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLogWorker.java
@@ -657,6 +657,21 @@ class SegmentedRaftLogWorker {
     void execute() throws IOException {
       freeSegmentedRaftLogOutputStream();
 
+      if (segments.getToDelete() != null && segments.getToDelete().length > 0) 
{
+        long minStart = segments.getToDelete()[0].getStartIndex();
+        for (SegmentFileInfo del : segments.getToDelete()) {
+          final File delFile = del.getFile(storage);
+          Preconditions.assertTrue(delFile.exists(),
+              "File %s to be deleted does not exist", delFile);
+          FileUtils.deleteFile(delFile);
+          LOG.info("{}: Deleted log file {}", name, delFile);
+          minStart = Math.min(minStart, del.getStartIndex());
+        }
+        if (segments.getToTruncate() == null) {
+          lastWrittenIndex = minStart - 1;
+        }
+      }
+
       if (segments.getToTruncate() != null) {
         final File fileToTruncate = segments.getToTruncate().getFile(storage);
         Preconditions.assertTrue(fileToTruncate.exists(),
@@ -674,20 +689,7 @@ class SegmentedRaftLogWorker {
         // update lastWrittenIndex
         lastWrittenIndex = segments.getToTruncate().getNewEndIndex();
       }
-      if (segments.getToDelete() != null && segments.getToDelete().length > 0) 
{
-        long minStart = segments.getToDelete()[0].getStartIndex();
-        for (SegmentFileInfo del : segments.getToDelete()) {
-          final File delFile = del.getFile(storage);
-          Preconditions.assertTrue(delFile.exists(),
-              "File %s to be deleted does not exist", delFile);
-          FileUtils.deleteFile(delFile);
-          LOG.info("{}: Deleted log file {}", name, delFile);
-          minStart = Math.min(minStart, del.getStartIndex());
-        }
-        if (segments.getToTruncate() == null) {
-          lastWrittenIndex = minStart - 1;
-        }
-      }
+
       if (stateMachineFuture != null) {
         IOUtils.getFromFuture(stateMachineFuture, () -> this + 
"-truncateStateMachineData");
       }

Reply via email to