builder = builder.setEnvelopeEntries(true); return builder.build(); } else if (parts.length == 10) { long recordCount = (versionStatusCount & LOGRECORD_COUNT_MASK) >> LOGRECORD_COUNT_SHIFT; builder = builder.setEnvelopeEntries(true); return builder.build(); } else { throw new IOException("Invalid logsegment metadata : "
.setLogSegmentSequenceNo(logSegmentSeqNo) .setInprogress(false) .build(); l.write(dlm.writerZKC); writeHandler.maxTxId.store(startTxID);
conf.getDLLedgerMetadataLayoutVersion(), lh.getId(), startTxID) .setLogSegmentSequenceNo(logSegmentSeqNo) .build(); l.write(dlm.writerZKC); writeHandler.maxTxId.store(startTxID);
.setLastEntryId(metadata.getLastEntryId() + 100) .setLastTxId(metadata.getLastTxId() + 100) .build(); metadataToChange.write(zkClient);
@Test(timeout = 60000) public void testOpenAndCloseLedger() throws Exception { LedgerHandle lh = bkc.get().createLedger(1, 1, 1, BookKeeper.DigestType.CRC32, conf.getBKDigestPW().getBytes(UTF_8)); LedgerHandleCache cache = LedgerHandleCache.newBuilder().bkc(bkc).conf(conf).build(); LogSegmentMetadata segment = new LogSegmentMetadata.LogSegmentMetadataBuilder( "/data", LogSegmentMetadata.LogSegmentMetadataVersion.VERSION_V5_SEQUENCE_ID, lh.getId(), 0L) .build(); LedgerDescriptor desc1 = cache.openLedger(segment, false); assertTrue(cache.handlesMap.containsKey(desc1)); LedgerHandleCache.RefCountedLedgerHandle refLh = cache.handlesMap.get(desc1); assertEquals(1, refLh.getRefCount()); cache.openLedger(segment, false); assertTrue(cache.handlesMap.containsKey(desc1)); assertEquals(2, refLh.getRefCount()); // close the ledger cache.closeLedger(desc1); assertTrue(cache.handlesMap.containsKey(desc1)); assertEquals(1, refLh.getRefCount()); cache.closeLedger(desc1); assertFalse(cache.handlesMap.containsKey(desc1)); assertEquals(0, refLh.getRefCount()); } }
@Test(timeout = 60000, expected = BKException.ZKException.class) public void testOpenLedgerWhenZkClosed() throws Exception { ZooKeeperClient newZkc = TestZooKeeperClientBuilder.newBuilder() .name("zkc-openledger-when-zk-closed") .zkServers(zkServers) .build(); BookKeeperClient newBkc = BookKeeperClientBuilder.newBuilder() .name("bkc-openledger-when-zk-closed") .zkc(newZkc) .ledgersPath(ledgersPath) .dlConfig(conf) .build(); try { LedgerHandle lh = newBkc.get().createLedger(BookKeeper.DigestType.CRC32, "zkcClosed".getBytes(UTF_8)); lh.close(); newZkc.close(); LedgerHandleCache cache = LedgerHandleCache.newBuilder().bkc(newBkc).conf(conf).build(); // open ledger after zkc closed cache.openLedger(new LogSegmentMetadata.LogSegmentMetadataBuilder("", 2, lh.getId(), 1).setLogSegmentSequenceNo(lh.getId()).build(), false); } finally { newBkc.close(); } }
.setRecordCount(recordCount) .setStartSequenceId(startSequenceId) .build();
@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); } }
public static LogSegmentMetadata completedLogSegment(String ledgerPath, long ledgerId, long firstTxId, long lastTxId, int recordCount, long logSegmentSeqNo, long lastEntryId, long lastSlotId, int version) { LogSegmentMetadata metadata = new LogSegmentMetadata.LogSegmentMetadataBuilder( ledgerPath + "/" + inprogressZNodeName(logSegmentSeqNo), version, ledgerId, firstTxId) .setInprogress(false) .setLogSegmentSequenceNo(logSegmentSeqNo) .build(); return metadata.completeLogSegment(ledgerPath + "/" + completedLedgerZNodeNameWithLogSegmentSequenceNumber(logSegmentSeqNo), lastTxId, recordCount, lastEntryId, lastSlotId, firstTxId); }
@Test(timeout = 60000) public void testMutateTruncationStatus() { LogSegmentMetadata metadata = new LogSegmentMetadataBuilder( "/metadata", LogSegmentMetadataVersion.VERSION_V4_ENVELOPED_ENTRIES, 1L, 0L) .setRegionId(0).setLogSegmentSequenceNo(1L).build(); metadata = metadata.completeLogSegment("/completed-metadata", 1000L, 1000, 1000L, 0L, 0L); LogSegmentMetadata partiallyTruncatedSegment = metadata.mutator() .setTruncationStatus(TruncationStatus.PARTIALLY_TRUNCATED) .setMinActiveDLSN(new DLSN(1L, 500L, 0L)) .build(); LogSegmentMetadata fullyTruncatedSegment = partiallyTruncatedSegment.mutator() .setTruncationStatus(TruncationStatus.TRUNCATED) .build(); assertEquals(new DLSN(1L, 500L, 0L), fullyTruncatedSegment.getMinActiveDLSN()); }
@Override public Future<LogSegmentMetadata> updateLastRecord(LogSegmentMetadata segment, LogRecordWithDLSN record) { DLSN dlsn = record.getDlsn(); Preconditions.checkState(!segment.isInProgress(), "Updating last dlsn for an inprogress log segment isn't supported."); Preconditions.checkArgument(segment.isDLSNinThisSegment(dlsn), "DLSN " + dlsn + " doesn't belong to segment " + segment); final LogSegmentMetadata newSegment = segment.mutator() .setLastDLSN(dlsn) .setLastTxId(record.getTransactionId()) .setRecordCount(record) .build(); return updateSegmentMetadata(newSegment); }
@Test(timeout = 60000) public void testReadMetadataCrossVersionFailure() throws Exception { LogSegmentMetadata metadata1 = new LogSegmentMetadataBuilder("/metadata-failure", 1, 1000, 1).setRegionId(TEST_REGION_ID).build(); metadata1.write(zkc); // synchronous read try { LogSegmentMetadata read1 = FutureUtils.result(LogSegmentMetadata.read(zkc, "/metadata-failure")); fail("The previous statement should throw an exception"); } catch (UnsupportedMetadataVersionException e) { // Expected } }
public static LogSegmentMetadata inprogressLogSegment(String ledgerPath, long ledgerId, long firstTxId, long logSegmentSeqNo, int version) { return new LogSegmentMetadata.LogSegmentMetadataBuilder( ledgerPath + "/" + inprogressZNodeName(logSegmentSeqNo), version, ledgerId, firstTxId) .setLogSegmentSequenceNo(logSegmentSeqNo) .build(); }
@Test(timeout = 60000) public void testReadMetadataCrossVersion() throws Exception { LogSegmentMetadata metadata1 = new LogSegmentMetadataBuilder("/metadata2", 1, 1000, 1).setRegionId(TEST_REGION_ID).build(); metadata1.write(zkc); // synchronous read LogSegmentMetadata read1 = FutureUtils.result(LogSegmentMetadata.read(zkc, "/metadata2", true)); assertEquals(read1.getLedgerId(), metadata1.getLedgerId()); assertEquals(read1.getFirstTxId(), metadata1.getFirstTxId()); assertEquals(read1.getLastTxId(), metadata1.getLastTxId()); assertEquals(read1.getLogSegmentSequenceNumber(), metadata1.getLogSegmentSequenceNumber()); assertEquals(DistributedLogConstants.LOCAL_REGION_ID, read1.getRegionId()); }
@Test(timeout = 60000) public void testComputeStartSequenceId() throws Exception { List<LogSegmentMetadata> segments = Lists.newArrayList( completedLogSegment(3L, 201L, 300L).mutator() .setStartSequenceId(201L).setRecordCount(100).build(), completedLogSegment(2L, 101L, 200L).mutator() .setStartSequenceId(101L).setRecordCount(100).build() ); assertEquals(301L, DLUtils.computeStartSequenceId(segments, inprogressLogSegment(4L, 301L))); }
@Test(timeout = 60000) public void testReadMetadata() throws Exception { LogSegmentMetadata metadata1 = new LogSegmentMetadataBuilder("/metadata1", LogSegmentMetadata.LEDGER_METADATA_CURRENT_LAYOUT_VERSION, 1000, 1).setRegionId(TEST_REGION_ID).build(); metadata1.write(zkc); LogSegmentMetadata read1 = FutureUtils.result(LogSegmentMetadata.read(zkc, "/metadata1")); assertEquals(metadata1, read1); assertEquals(TEST_REGION_ID, read1.getRegionId()); }
@Test(timeout = 60000, expected = BKException.BKBookieHandleNotAvailableException.class) public void testOpenLedgerWhenBkcClosed() throws Exception { BookKeeperClient newBkc = BookKeeperClientBuilder.newBuilder().name("newBkc") .zkc(zkc).ledgersPath(ledgersPath).dlConfig(conf).build(); LedgerHandleCache cache = LedgerHandleCache.newBuilder().bkc(newBkc).conf(conf).build(); // closed the bkc newBkc.close(); // open ledger after bkc closed. cache.openLedger(new LogSegmentMetadata.LogSegmentMetadataBuilder("", 2, 1, 1).setRegionId(1).build(), false); }
static void updateCompletionTime(ZooKeeperClient zkc, LogSegmentMetadata l, long completionTime) throws Exception { LogSegmentMetadata newSegment = l.mutator().setCompletionTime(completionTime).build(); DLMTestUtil.updateSegmentMetadata(zkc, newSegment); }