Optimize SegmentedJournalReader.getCurrentEntry()
[controller.git] / atomix-storage / src / main / java / io / atomix / storage / journal / SegmentedJournal.java
index 865daeee528574d17acaf2289f3a8f3b03d6018f..7da4655a48591d1192be4be4a6f6419f0c2e9371 100644 (file)
@@ -210,7 +210,17 @@ public final class SegmentedJournal<E> implements Journal<E> {
    * @return The Raft log reader.
    */
   public JournalReader<E> openReader(long index, JournalReader.Mode mode) {
-    final var reader = new SegmentedJournalReader<>(this, index, mode);
+    final var segment = getSegment(index);
+    final var reader = switch (mode) {
+      case ALL -> new SegmentedJournalReader<>(this, segment);
+      case COMMITS -> new CommitsSegmentJournalReader<>(this, segment);
+    };
+
+    // Forward reader to specified index
+    for (long next = reader.getNextIndex(); index > next && reader.hasNext(); next = reader.getNextIndex()) {
+      reader.next();
+    }
+
     readers.add(reader);
     return reader;
   }