Clean up SegmentedJournalWriter 84/110584/2
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 11 Mar 2024 08:08:57 +0000 (09:08 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 11 Mar 2024 12:51:31 +0000 (13:51 +0100)
We have duplicated code in append() methods and their recovery is not
obvious. Move common code into a private method and reduce the size of
catch blocks.

JIRA: CONTROLLER-2098
Change-Id: I58e6ff19cf2eaa2e97c56499d70171cb93da6174
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
atomix-storage/src/main/java/io/atomix/storage/journal/SegmentedJournalWriter.java

index d4a1a68261975c50777b4b471b89b3d83b4743f8..64a4c70c7a00937df1ba61511d7618c9e85c2ad0 100644 (file)
@@ -20,12 +20,12 @@ import java.nio.BufferOverflowException;
 /**
  * Raft log writer.
  */
-public class SegmentedJournalWriter<E> implements JournalWriter<E> {
+public final class SegmentedJournalWriter<E> implements JournalWriter<E> {
   private final SegmentedJournal<E> journal;
   private JournalSegment<E> currentSegment;
   private MappableJournalSegmentWriter<E> currentWriter;
 
-  public SegmentedJournalWriter(SegmentedJournal<E> journal) {
+  SegmentedJournalWriter(SegmentedJournal<E> journal) {
     this.journal = journal;
     this.currentSegment = journal.getLastSegment();
     currentSegment.acquire();
@@ -78,30 +78,33 @@ public class SegmentedJournalWriter<E> implements JournalWriter<E> {
       if (currentSegment.index() == currentWriter.getNextIndex()) {
         throw e;
       }
-      currentWriter.flush();
-      currentSegment.release();
-      currentSegment = journal.getNextSegment();
-      currentSegment.acquire();
-      currentWriter = currentSegment.writer();
-      return currentWriter.append(entry);
     }
+
+    moveToNextSegment();
+    return currentWriter.append(entry);
   }
 
   @Override
   public void append(Indexed<E> entry) {
     try {
       currentWriter.append(entry);
+      return;
     } catch (BufferOverflowException e) {
       if (currentSegment.index() == currentWriter.getNextIndex()) {
         throw e;
       }
-      currentWriter.flush();
-      currentSegment.release();
-      currentSegment = journal.getNextSegment();
-      currentSegment.acquire();
-      currentWriter = currentSegment.writer();
-      currentWriter.append(entry);
     }
+
+    moveToNextSegment();
+    currentWriter.append(entry);
+  }
+
+  private void moveToNextSegment() {
+    currentWriter.flush();
+    currentSegment.release();
+    currentSegment = journal.getNextSegment();
+    currentSegment.acquire();
+    currentWriter = currentSegment.writer();
   }
 
   @Override