LedgerReadPosition readPosition = new LedgerReadPosition(e.getLedgerId(), currentMetadata.getLogSegmentSequenceNumber(), e.getEntryId()); readAheadCache.set(readPosition, e, null != ctx ? ctx.toString() : "", currentMetadata.getEnvelopeEntries(), currentMetadata.getStartSequenceId()); ++numReads; if (LOG.isDebugEnabled()) {
startSequenceId = segment.getStartSequenceId() + segment.getRecordCount(); if (null != prevSegment && prevSegment.supportsSequenceId() && prevSegment.getStartSequenceId() > segment.getStartSequenceId()) { LOG.warn("{} found decreasing start sequence id in log segment {}, previous is {}", new Object[] { streamName, segment, prevSegment });
protected long computeStartSequenceId(LogSegmentMetadata segment) throws IOException { if (!segment.isInProgress()) { return segment.getStartSequenceId(); } long startSequenceId = DistributedLogConstants.UNASSIGNED_SEQUENCE_ID; // we only record sequence id when both write version and logsegment's version support sequence id if (LogSegmentMetadata.supportsSequenceId(conf.getDLLedgerMetadataLayoutVersion()) && segment.supportsSequenceId()) { List<LogSegmentMetadata> logSegmentDescList = getFilteredLedgerListDesc(false, false); startSequenceId = DLUtils.computeStartSequenceId(logSegmentDescList, segment); } return startSequenceId; }
currentMetadata.getEnvelopeEntries(), currentMetadata.getStartSequenceId());
@Test(timeout = 60000) public void testSameLogSegment() throws Exception { LogSegmentCache cache = new LogSegmentCache("test-same-log-segment"); List<LogSegmentMetadata> expectedList = Lists.newArrayListWithExpectedSize(2); LogSegmentMetadata inprogress = DLMTestUtil.inprogressLogSegment("/inprogress-1", 1L, 1L, 1L); expectedList.add(inprogress); cache.add(DLMTestUtil.inprogressZNodeName(1L), inprogress); LogSegmentMetadata completed = DLMTestUtil.completedLogSegment("/segment-1", 1L, 1L, 100L, 100, 1L, 99L, 0L); expectedList.add(completed); cache.add(DLMTestUtil.completedLedgerZNodeNameWithLogSegmentSequenceNumber(1L), completed); List<LogSegmentMetadata> retrievedList = cache.getLogSegments(LogSegmentMetadata.COMPARATOR); assertEquals("Should get both log segments in ascending order", expectedList.size(), retrievedList.size()); for (int i = 0; i < expectedList.size(); i++) { assertEqualsWithoutSequenceId(expectedList.get(i), retrievedList.get(i)); } assertEquals("inprogress log segment should see start sequence id : 0", 0L, retrievedList.get(0).getStartSequenceId()); Collections.reverse(expectedList); retrievedList = cache.getLogSegments(LogSegmentMetadata.DESC_COMPARATOR); assertEquals("Should get both log segments in descending order", expectedList.size(), retrievedList.size()); for (int i = 0; i < expectedList.size(); i++) { assertEqualsWithoutSequenceId(expectedList.get(i), retrievedList.get(i)); } assertEquals("inprogress log segment should see start sequence id : 0", 0L, retrievedList.get(1).getStartSequenceId()); }
.setLogSegmentInfo(segment.getLogSegmentSequenceNumber(), segment.getStartSequenceId()) .setEntryId(lastEntry.getEntryId()) .setEnvelopeEntry(LogSegmentMetadata.supportsEnvelopedEntries(segment.getVersion()))
reader = Entry.newBuilder() .setLogSegmentInfo(metadata.getLogSegmentSequenceNumber(), metadata.getStartSequenceId()) .setEntryId(entry.getEntryId()) .setEnvelopeEntry(
/** * Compute the start sequence id for <code>segment</code>, based on previous segment list * <code>segmentListDesc</code>. * * @param logSegmentDescList * list of segments in descending order * @param segment * segment to compute start sequence id for * @return start sequence id */ public static long computeStartSequenceId(List<LogSegmentMetadata> logSegmentDescList, LogSegmentMetadata segment) throws UnexpectedException { long startSequenceId = 0L; for (LogSegmentMetadata metadata : logSegmentDescList) { if (metadata.getLogSegmentSequenceNumber() >= segment.getLogSegmentSequenceNumber()) { continue; } else if (metadata.getLogSegmentSequenceNumber() < (segment.getLogSegmentSequenceNumber() - 1)) { break; } if (metadata.isInProgress()) { throw new UnexpectedException("Should not complete log segment " + segment.getLogSegmentSequenceNumber() + " since it's previous log segment is still inprogress : " + logSegmentDescList); } if (metadata.supportsSequenceId()) { startSequenceId = metadata.getStartSequenceId() + metadata.getRecordCount(); } } return startSequenceId; }
LogRecordSelector selector) throws IOException { Entry.Reader reader = Entry.newBuilder() .setLogSegmentInfo(logSegmentSeqNo, metadata.getStartSequenceId()) .setEntryId(entry.getEntryId()) .setEnvelopeEntry(metadata.getEnvelopeEntries())
assertEquals(0L, segments.get(0).getStartSequenceId()); } else { assertTrue(segments.get(0).getStartSequenceId() < 0); assertTrue(segments.get(0).getStartSequenceId() < 0);
@Test(timeout = 60000) public void testReadLogSegmentWithSequenceId() throws Exception { LogSegmentMetadata metadata = new LogSegmentMetadataBuilder( "/metadata", LogSegmentMetadataVersion.VERSION_V5_SEQUENCE_ID, 1L, 0L) .setRegionId(0) .setLogSegmentSequenceNo(1L) .setStartSequenceId(999L) .build(); // write inprogress log segment with v5 String data = metadata.getFinalisedData(); LogSegmentMetadata parsedMetadata = LogSegmentMetadata.parseData("/metadatav5", data.getBytes(UTF_8), false); assertEquals(999L, parsedMetadata.getStartSequenceId()); LogSegmentMetadata metadatav4 = new LogSegmentMetadataBuilder( "/metadata", LogSegmentMetadataVersion.VERSION_V4_ENVELOPED_ENTRIES, 1L, 0L) .setRegionId(0) .setLogSegmentSequenceNo(1L) .setStartSequenceId(999L) .build(); String datav4 = metadatav4.getFinalisedData(); LogSegmentMetadata parsedMetadatav4 = LogSegmentMetadata.parseData("/metadatav4", datav4.getBytes(UTF_8), false); assertTrue(parsedMetadatav4.getStartSequenceId() < 0); } }
Mutator(LogSegmentMetadata original) { super(original.getZkPath(), original.getVersion(), original.getLedgerId(), original.getFirstTxId()); this.inprogress = original.isInProgress(); this.logSegmentSequenceNo = original.getLogSegmentSequenceNumber(); this.lastEntryId = original.getLastEntryId(); this.lastSlotId = original.getLastSlotId(); this.lastTxId = original.getLastTxId(); this.completionTime = original.getCompletionTime(); this.recordCount = original.getRecordCount(); this.regionId = original.getRegionId(); this.status = original.getStatus(); this.minActiveEntryId = original.getMinActiveDLSN().getEntryId(); this.minActiveSlotId = original.getMinActiveDLSN().getSlotId(); this.startSequenceId = original.getStartSequenceId(); this.envelopeEntries = original.getEnvelopeEntries(); }
for (int i = 0; i < 3; i++) { assertFalse(segments.get(i).isInProgress()); assertTrue(segments.get(i).getStartSequenceId() < 0); assertTrue(segments.get(3).getStartSequenceId() < 0); assertTrue(segmentsv5.get(3).getStartSequenceId() < 0); assertEquals(startSequenceId, segmentsv5.get(i).getStartSequenceId()); startSequenceId += 2L; assertEquals(startSequenceId, segmentsv5.get(7).getStartSequenceId()); assertTrue(segmentsv4.get(i).getStartSequenceId() < 0);