Refactor SegmentedJournalWriter.reset()
[controller.git] / atomix-storage / src / main / java / io / atomix / storage / journal / SegmentedByteBufWriter.java
index 0d942dd08533535dde2ffce8d641d179dda535e7..42c00e59fdf6e5620c5346871940508bda11804c 100644 (file)
@@ -46,18 +46,6 @@ final class SegmentedByteBufWriter implements ByteBufWriter {
         return currentWriter.getNextIndex();
     }
 
-    @Override
-    public void reset(final long index) {
-        if (index > currentSegment.firstIndex()) {
-            currentSegment.releaseWriter();
-            currentSegment = journal.resetSegments(index);
-            currentWriter = currentSegment.acquireWriter();
-        } else {
-            truncate(index - 1);
-        }
-        journal.resetHead(index);
-    }
-
     @Override
     public void commit(final long index) {
         if (index > journal.getCommitIndex()) {
@@ -82,12 +70,33 @@ final class SegmentedByteBufWriter implements ByteBufWriter {
         return verifyNotNull(currentWriter.append(buf));
     }
 
+    @Override
+    public void reset(final long index) {
+        final long commitIndex = journal.getCommitIndex();
+        if (index <= commitIndex) {
+          // also catches index == 0, which is not a valid next index
+          throw new IndexOutOfBoundsException("Cannot reset to: " + index + ", committed index: " + commitIndex);
+        }
+
+        if (index > currentSegment.firstIndex()) {
+            currentSegment.releaseWriter();
+            currentSegment = journal.resetSegments(index);
+            currentWriter = currentSegment.acquireWriter();
+        } else {
+            checkedTruncate(index - 1);
+        }
+        journal.resetHead(index);
+    }
+
     @Override
     public void truncate(final long index) {
         if (index < journal.getCommitIndex()) {
             throw new IndexOutOfBoundsException("Cannot truncate committed index: " + index);
         }
+        checkedTruncate(index);
+    }
 
+    private void checkedTruncate(final long index) {
         // Delete all segments with first indexes greater than the given index.
         while (index < currentSegment.firstIndex() && currentSegment != journal.firstSegment()) {
             currentSegment.releaseWriter();