LogRecordWithEntry getEntryWithoutLoading(long index) { LogRecord record = getLogRecord(index); if (record == null) { return null; } return new LogRecordWithEntry(record, entryCache.get(record.getTermIndex())); }
@Override public LogEntryProto get(long index) throws RaftLogIOException { checkLogState(); LogSegment segment; LogRecordWithEntry recordAndEntry; try (AutoCloseableLock readLock = readLock()) { segment = cache.getSegment(index); if (segment == null) { return null; } recordAndEntry = segment.getEntryWithoutLoading(index); if (recordAndEntry == null) { return null; } if (recordAndEntry.hasEntry()) { return recordAndEntry.getEntry(); } } // the entry is not in the segment's cache. Load the cache without holding // RaftLog's lock. checkAndEvictCache(); return segment.loadCache(recordAndEntry.getRecord()); }
@Override public LogEntryProto get(long index) throws RaftLogIOException { checkLogState(); LogSegment segment; LogRecordWithEntry recordAndEntry; try (AutoCloseableLock readLock = readLock()) { segment = cache.getSegment(index); if (segment == null) { return null; } recordAndEntry = segment.getEntryWithoutLoading(index); if (recordAndEntry == null) { return null; } if (recordAndEntry.hasEntry()) { return recordAndEntry.getEntry(); } } // the entry is not in the segment's cache. Load the cache without holding // RaftLog's lock. checkAndEvictCache(); return segment.loadCache(recordAndEntry.getRecord()); }
private void checkLogSegment(LogSegment segment, long start, long end, boolean isOpen, long totalSize, long term) throws Exception { Assert.assertEquals(start, segment.getStartIndex()); Assert.assertEquals(end, segment.getEndIndex()); Assert.assertEquals(isOpen, segment.isOpen()); Assert.assertEquals(totalSize, segment.getTotalSize()); long offset = SegmentedRaftLog.HEADER_BYTES.length; for (long i = start; i <= end; i++) { LogSegment.LogRecord record = segment.getLogRecord(i); LogRecordWithEntry lre = segment.getEntryWithoutLoading(i); Assert.assertEquals(i, lre.getRecord().getTermIndex().getIndex()); Assert.assertEquals(term, lre.getRecord().getTermIndex().getTerm()); Assert.assertEquals(offset, record.getOffset()); LogEntryProto entry = lre.hasEntry() ? lre.getEntry() : segment.loadCache(lre.getRecord()); offset += getEntrySize(entry); } }
static void checkLogSegment(LogSegment segment, long start, long end, boolean isOpen, long totalSize, long term) throws Exception { Assert.assertEquals(start, segment.getStartIndex()); Assert.assertEquals(end, segment.getEndIndex()); Assert.assertEquals(isOpen, segment.isOpen()); Assert.assertEquals(totalSize, segment.getTotalSize()); long offset = SegmentedRaftLogFormat.getHeaderLength(); for (long i = start; i <= end; i++) { LogSegment.LogRecord record = segment.getLogRecord(i); LogRecordWithEntry lre = segment.getEntryWithoutLoading(i); Assert.assertEquals(i, lre.getRecord().getTermIndex().getIndex()); Assert.assertEquals(term, lre.getRecord().getTermIndex().getTerm()); Assert.assertEquals(offset, record.getOffset()); LogEntryProto entry = lre.hasEntry() ? lre.getEntry() : segment.loadCache(lre.getRecord()); offset += getEntrySize(entry); } }
private void checkCache(long start, long end, int segmentSize) throws IOException { Assert.assertEquals(start, cache.getStartIndex()); Assert.assertEquals(end, cache.getEndIndex()); for (long index = start; index <= end; index++) { LogEntryProto entry = cache.getSegment(index).getEntryWithoutLoading(index).getEntry(); Assert.assertEquals(index, entry.getIndex()); } long[] offsets = new long[]{start, start + 1, start + (end - start) / 2, end - 1, end}; for (long offset : offsets) { checkCacheEntries(offset, (int) (end - offset + 1), end); checkCacheEntries(offset, 1, end); checkCacheEntries(offset, 20, end); checkCacheEntries(offset, segmentSize, end); checkCacheEntries(offset, segmentSize - 1, end); } }
private void checkCache(long start, long end, int segmentSize) throws IOException { Assert.assertEquals(start, cache.getStartIndex()); Assert.assertEquals(end, cache.getEndIndex()); for (long index = start; index <= end; index++) { LogEntryProto entry = cache.getSegment(index).getEntryWithoutLoading(index).getEntry(); Assert.assertEquals(index, entry.getIndex()); } long[] offsets = new long[]{start, start + 1, start + (end - start) / 2, end - 1, end}; for (long offset : offsets) { checkCacheEntries(offset, (int) (end - offset + 1), end); checkCacheEntries(offset, 1, end); checkCacheEntries(offset, 20, end); checkCacheEntries(offset, segmentSize, end); checkCacheEntries(offset, segmentSize - 1, end); } }
LogRecordWithEntry getEntryWithoutLoading(long index) { LogRecord record = getLogRecord(index); if (record == null) { return null; } return new LogRecordWithEntry(record, entryCache.get(record.getTermIndex())); }