* Segmented journal.
*/
public final class SegmentedJournal<E> implements Journal<E> {
-
/**
* Returns a new Raft log builder.
*
this.indexDensity = indexDensity;
this.flushOnCommit = flushOnCommit;
open();
- this.writer = openWriter();
+ this.writer = new SegmentedJournalWriter<>(this);
}
/**
}
@Override
- public SegmentedJournalWriter<E> writer() {
+ public JournalWriter<E> writer() {
return writer;
}
@Override
- public SegmentedJournalReader<E> openReader(long index) {
- return openReader(index, SegmentedJournalReader.Mode.ALL);
+ public JournalReader<E> openReader(long index) {
+ return openReader(index, JournalReader.Mode.ALL);
}
/**
* @param mode The mode in which to read entries.
* @return The Raft log reader.
*/
- public SegmentedJournalReader<E> openReader(long index, SegmentedJournalReader.Mode mode) {
- SegmentedJournalReader<E> reader = new SegmentedJournalReader<>(this, index, mode);
+ public JournalReader<E> openReader(long index, JournalReader.Mode 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;
}
- /**
- * Opens a new journal writer.
- *
- * @return A new journal writer.
- */
- protected SegmentedJournalWriter<E> openWriter() {
- return new SegmentedJournalWriter<>(this);
- }
-
/**
* Opens the segments.
*/