int safeIndex = segments.size() - 1; for (; safeIndex >= 0; safeIndex--) { LogSegment segment = segments.get(safeIndex); LogSegment segment = segments.get(j); if (segment.getEndIndex() > lastAppliedIndex) { break; LogSegment s = segments.get(i); if (s.getStartIndex() > lastAppliedIndex && s.hasCache()) { result.add(s); int j = 0; for (; j <= safeIndex; j++) { LogSegment s = segments.get(j); if (s.getEndIndex() >= minToRead) { break; LogSegment s = segments.get(j); if (Arrays.stream(followerNextIndices).noneMatch(s::containsIndex) && !s.containsIndex(lastAppliedIndex) && s.hasCache()) {
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(); } }
Assert.assertSame(evicted.get(0), segments.get(0)); Assert.assertSame(evicted.get(1), segments.get(1)); Assert.assertSame(evicted.get(0), segments.get(0)); Assert.assertSame(evicted.get(0), segments.get(0)); Mockito.when(segments.get(0).hasCache()).thenReturn(false); evicted = policy.evict(new long[]{15, 45, 45}, 55, 50, segments, maxCached); Assert.assertEquals(1, evicted.size()); Assert.assertSame(evicted.get(0), segments.get(2)); Mockito.when(segments.get(2).hasCache()).thenReturn(false); evicted = policy.evict(new long[]{15, 45, 45}, 55, 50, segments, maxCached); Assert.assertEquals(1, evicted.size()); Assert.assertSame(evicted.get(0), segments.get(3)); Mockito.when(segments.get(3).hasCache()).thenReturn(false); evicted = policy.evict(new long[]{15, 45, 45}, 55, 50, segments, maxCached); Assert.assertEquals(0, evicted.size());
Assert.assertSame(evicted.get(0), segments.get(0)); Assert.assertSame(evicted.get(1), segments.get(1)); Assert.assertSame(evicted.get(0), segments.get(0)); Assert.assertSame(evicted.get(0), segments.get(2)); Mockito.when(segments.get(2).hasCache()).thenReturn(false); evicted = policy.evict(null, 35, 5, segments, maxCached); Assert.assertEquals(1, evicted.size()); Assert.assertSame(evicted.get(0), segments.get(1)); Mockito.when(segments.get(1).hasCache()).thenReturn(false); evicted = policy.evict(null, 35, 5, segments, maxCached); Assert.assertEquals(0, evicted.size());
long getStartIndex() { if (closedSegments.isEmpty()) { return openSegment != null ? openSegment.getStartIndex() : RaftServerConstants.INVALID_LOG_INDEX; } else { return closedSegments.get(0).getStartIndex(); } }
TermIndex getLastTermIndex() { return (openSegment != null && openSegment.numOfEntries() > 0) ? openSegment.getLastTermIndex() : (closedSegments.isEmpty() ? null : closedSegments.get(closedSegments.size() - 1).getLastTermIndex()); }
long getEndIndex() { return openSegment != null ? openSegment.getEndIndex() : (closedSegments.isEmpty() ? INVALID_LOG_INDEX : closedSegments.get(closedSegments.size() - 1).getEndIndex()); }