LogSegmentList segments, final int maxCachedSegments) { List<LogSegment> result = new ArrayList<>(); int safeIndex = segments.size() - 1; for (; safeIndex >= 0; safeIndex--) { LogSegment segment = segments.get(safeIndex);
EntryIterator(long start) { this.nextIndex = start; segmentIndex = closedSegments.binarySearch(nextIndex); if (segmentIndex >= 0) { currentSegment = closedSegments.get(segmentIndex); } else { segmentIndex = -segmentIndex - 1; if (segmentIndex == closedSegments.size()) { currentSegment = openSegment; } else { // the start index is smaller than the first closed segment's start // index. We no longer keep the log entry (because of the snapshot) or // the start index is invalid. Preconditions.assertTrue(segmentIndex == 0); throw new IndexOutOfBoundsException(); } } }
@Override public TermIndex next() { LogRecord record; if (currentSegment == null || (record = currentSegment.getLogRecord(nextIndex)) == null) { throw new NoSuchElementException(); } if (++nextIndex > currentSegment.getEndIndex()) { if (currentSegment != openSegment) { segmentIndex++; currentSegment = segmentIndex == closedSegments.size() ? openSegment : closedSegments.get(segmentIndex); } } return record.getTermIndex(); } }
int getNumOfSegments() { return closedSegments.size() + (openSegment == null ? 0 : 1); }
long getEndIndex() { return openSegment != null ? openSegment.getEndIndex() : (closedSegments.isEmpty() ? INVALID_LOG_INDEX : closedSegments.get(closedSegments.size() - 1).getEndIndex()); }
TermIndex getLastTermIndex() { return (openSegment != null && openSegment.numOfEntries() > 0) ? openSegment.getLastTermIndex() : (closedSegments.isEmpty() ? null : closedSegments.get(closedSegments.size() - 1).getLastTermIndex()); }