/**
* Raft log reader.
*/
-public class SegmentedJournalReader<E> implements JournalReader<E> {
+public final class SegmentedJournalReader<E> implements JournalReader<E> {
private final SegmentedJournal<E> journal;
private JournalSegment<E> currentSegment;
private Indexed<E> previousEntry;
private MappableJournalSegmentReader<E> currentReader;
private final Mode mode;
- public SegmentedJournalReader(SegmentedJournal<E> journal, long index, Mode mode) {
+ SegmentedJournalReader(SegmentedJournal<E> journal, long index, Mode mode) {
this.journal = journal;
this.mode = mode;
currentSegment = journal.getSegment(index);
currentSegment.acquire();
currentReader = currentSegment.createReader();
+
long nextIndex = getNextIndex();
while (index > nextIndex && hasNext()) {
next();
@Override
public void reset() {
+ previousEntry = null;
currentReader.close();
currentSegment.release();
+
currentSegment = journal.getFirstSegment();
currentSegment.acquire();
currentReader = currentSegment.createReader();
- previousEntry = null;
}
@Override
if (segment != null) {
currentReader.close();
currentSegment.release();
+
currentSegment = segment;
currentSegment.acquire();
currentReader = currentSegment.createReader();
}
private boolean hasNextEntry() {
- if (!currentReader.hasNext()) {
- JournalSegment<E> nextSegment = journal.getNextSegment(currentSegment.index());
- if (nextSegment != null && nextSegment.index() == getNextIndex()) {
- previousEntry = currentReader.getCurrentEntry();
- currentSegment.release();
- currentSegment = nextSegment;
- currentSegment.acquire();
- currentReader = currentSegment.createReader();
- return currentReader.hasNext();
- }
- return false;
+ if (currentReader.hasNext()) {
+ return true;
}
- return true;
+ return moveToNextSegment() ? currentReader.hasNext() : false;
}
@Override
public Indexed<E> next() {
- if (!currentReader.hasNext()) {
- JournalSegment<E> nextSegment = journal.getNextSegment(currentSegment.index());
- if (nextSegment != null && nextSegment.index() == getNextIndex()) {
- previousEntry = currentReader.getCurrentEntry();
- currentSegment.release();
- currentSegment = nextSegment;
- currentSegment.acquire();
- currentReader = currentSegment.createReader();
- return currentReader.next();
- } else {
- throw new NoSuchElementException();
- }
- } else {
+ if (currentReader.hasNext()) {
previousEntry = currentReader.getCurrentEntry();
return currentReader.next();
}
+ if (moveToNextSegment()) {
+ return currentReader.next();
+ }
+ throw new NoSuchElementException();
}
@Override
currentReader.close();
journal.closeReader(this);
}
+
+ private boolean moveToNextSegment() {
+ final var nextSegment = journal.getNextSegment(currentSegment.index());
+ if (nextSegment == null || nextSegment.index() != getNextIndex()) {
+ return false;
+ }
+
+ previousEntry = currentReader.getCurrentEntry();
+ currentReader.close();
+ currentSegment.release();
+
+ currentSegment = nextSegment;
+ currentSegment.acquire();
+ currentReader = currentSegment.createReader();
+ return true;
+ }
}