long getStartIndex() { if (closedSegments.isEmpty()) { return openSegment != null ? openSegment.getStartIndex() : RaftServerConstants.INVALID_LOG_INDEX; } else { return closedSegments.get(0).getStartIndex(); } }
LogSegment getSegment(long index) { if (openSegment != null && index >= openSegment.getStartIndex()) { return openSegment; } else { int segmentIndex = Collections.binarySearch(closedSegments, index); return segmentIndex < 0 ? null : closedSegments.get(segmentIndex); } }
long getStartIndex() { if (closedSegments.isEmpty()) { return openSegment != null ? openSegment.getStartIndex() : RaftServerConstants.INVALID_LOG_INDEX; } else { return closedSegments.get(0).getStartIndex(); } }
LogSegment getSegment(long index) { if (openSegment != null && index >= openSegment.getStartIndex()) { return openSegment; } else { return closedSegments.search(index); } }
FinalizeLogSegment(LogSegment segmentToClose) { Preconditions.assertTrue(segmentToClose != null, "Log segment to be rolled is null"); this.startIndex = segmentToClose.getStartIndex(); this.endIndex = segmentToClose.getEndIndex(); }
@Override public int compareTo(Long l) { return (l >= getStartIndex() && l <= getEndIndex()) ? 0 : (this.getEndIndex() < l ? -1 : 1); }
@Override public int compareTo(Long l) { return (l >= getStartIndex() && l <= getEndIndex()) ? 0 : (this.getEndIndex() < l ? -1 : 1); }
static SegmentFileInfo deleteOpenSegment(LogSegment openSegment, Runnable clearOpenSegment) { final long oldEnd = openSegment.getEndIndex(); openSegment.clear(); final SegmentFileInfo info = new SegmentFileInfo(openSegment.getStartIndex(), oldEnd, true, 0, openSegment.getEndIndex()); clearOpenSegment.run(); return info; } }
@Override protected void openImpl(long lastIndexInSnapshot, Consumer<LogEntryProto> consumer) throws IOException { loadLogSegments(lastIndexInSnapshot, consumer); File openSegmentFile = null; LogSegment openSegment = cache.getOpenSegment(); if (openSegment != null) { openSegmentFile = storage.getStorageDir() .getOpenLogFile(openSegment.getStartIndex()); } fileLogWorker.start(Math.max(cache.getEndIndex(), lastIndexInSnapshot), openSegmentFile); }
private void validateAdding(LogSegment segment) { final LogSegment lastClosed = getLastClosedSegment(); if (lastClosed != null) { Preconditions.assertTrue(!lastClosed.isOpen()); Preconditions.assertTrue(lastClosed.getEndIndex() + 1 == segment.getStartIndex()); } }
private SegmentFileInfo deleteOpenSegment() { final long oldEnd = openSegment.getEndIndex(); openSegment.clear(); SegmentFileInfo info = new SegmentFileInfo(openSegment.getStartIndex(), oldEnd, true, 0, openSegment.getEndIndex()); clearOpenSegment(); return info; }
private void validateAdding(LogSegment segment) { final LogSegment lastClosed = closedSegments.getLast(); if (lastClosed != null) { Preconditions.assertTrue(!lastClosed.isOpen()); Preconditions.assertTrue(lastClosed.getEndIndex() + 1 == segment.getStartIndex()); } }
@Override public void open(long lastIndexInSnapshot, Consumer<LogEntryProto> consumer) throws IOException { loadLogSegments(lastIndexInSnapshot, consumer); File openSegmentFile = null; LogSegment openSegment = cache.getOpenSegment(); if (openSegment != null) { openSegmentFile = storage.getStorageDir() .getOpenLogFile(openSegment.getStartIndex()); } fileLogWorker.start(Math.max(cache.getEndIndex(), lastIndexInSnapshot), openSegmentFile); super.open(lastIndexInSnapshot, consumer); }
@Override public void execute() throws IOException { IOUtils.cleanup(LOG, out); out = null; Preconditions.assertTrue(segmentToClose != null); File openFile = storage.getStorageDir() .getOpenLogFile(segmentToClose.getStartIndex()); LOG.debug("{} finalizing log segment {}", name, openFile); Preconditions.assertTrue(openFile.exists(), () -> name + ": File " + openFile + " does not exist, segmentToClose=" + segmentToClose.toDebugString()); if (segmentToClose.numOfEntries() > 0) { // finalize the current open segment File dstFile = storage.getStorageDir().getClosedLogFile( segmentToClose.getStartIndex(), segmentToClose.getEndIndex()); Preconditions.assertTrue(!dstFile.exists()); FileUtils.move(openFile, dstFile); } else { // delete the file of the empty segment FileUtils.deleteFile(openFile); } updateFlushedIndex(); }
if (openSegment != null && openSegment.getEndIndex() >= index) { final long oldEnd = openSegment.getEndIndex(); if (index == openSegment.getStartIndex()) { openSegment.truncate(index); Preconditions.assertTrue(!openSegment.isOpen()); SegmentFileInfo info = new SegmentFileInfo(openSegment.getStartIndex(), oldEnd, true, openSegment.getTotalSize(), openSegment.getEndIndex()); final long endOfS = i == segmentIndex ? oldEnd : s.getEndIndex(); s.clear(); list.add(new SegmentFileInfo(s.getStartIndex(), endOfS, false, 0, s.getEndIndex())); new SegmentFileInfo(ts.getStartIndex(), oldEnd, false, ts.getTotalSize(), ts.getEndIndex()); return new TruncationSegments(t, list);
if (openSegment != null && openSegment.getEndIndex() >= index) { final long oldEnd = openSegment.getEndIndex(); if (index == openSegment.getStartIndex()) { openSegment.truncate(index); Preconditions.assertTrue(!openSegment.isOpen()); final SegmentFileInfo info = new SegmentFileInfo(openSegment.getStartIndex(), oldEnd, true, openSegment.getTotalSize(), openSegment.getEndIndex()); segments.add(openSegment); final long endOfS = i == segmentIndex? oldEnd: s.getEndIndex(); s.clear(); list.add(new SegmentFileInfo(s.getStartIndex(), endOfS, false, 0, s.getEndIndex())); new SegmentFileInfo(ts.getStartIndex(), oldEnd, false, ts.getTotalSize(), ts.getEndIndex()); return new TruncationSegments(t, list);
Preconditions.assertTrue(start == segment.getStartIndex()); if (!segment.records.isEmpty()) { Preconditions.assertTrue(start == segment.records.get(0).getTermIndex().getIndex());
static LogSegment loadSegment(RaftStorage storage, File file, long start, long end, boolean isOpen, boolean keepEntryInCache, Consumer<LogEntryProto> logConsumer) throws IOException { final LogSegment segment = isOpen ? LogSegment.newOpenSegment(storage, start) : LogSegment.newCloseSegment(storage, start, end); readSegmentFile(file, start, end, isOpen, entry -> { segment.append(keepEntryInCache | isOpen, entry); if (logConsumer != null) { logConsumer.accept(entry); } }); // truncate padding if necessary if (file.length() > segment.getTotalSize()) { FileUtils.truncateFile(file, segment.getTotalSize()); } Preconditions.assertTrue(start == segment.getStartIndex()); if (!segment.records.isEmpty()) { Preconditions.assertTrue(start == segment.records.get(0).getTermIndex().getIndex()); } if (!isOpen) { Preconditions.assertTrue(segment.getEndIndex() == end); } return segment; }
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); } }