public static void fenceStream(DistributedLogConfiguration conf, URI uri, String name) throws Exception { BKDistributedLogManager dlm = (BKDistributedLogManager) createNewDLM(name, conf, uri); try { BKLogReadHandler readHandler = dlm.createReadHandler(); List<LogSegmentMetadata> ledgerList = readHandler.getFullLedgerList(true, true); LogSegmentMetadata lastSegment = ledgerList.get(ledgerList.size() - 1); BookKeeperClient bkc = dlm.getWriterBKC(); LedgerHandle lh = bkc.get().openLedger(lastSegment.getLedgerId(), BookKeeper.DigestType.CRC32, conf.getBKDigestPW().getBytes(UTF_8)); lh.close(); } finally { dlm.close(); } }
@Test(timeout = 60000) public void testLockStreamDifferentSubscribers() throws Exception { String streamName = runtime.getMethodName(); BKDistributedLogManager bkdlm = createNewDLM(conf, streamName); DLMTestUtil.generateLogSegmentNonPartitioned(bkdlm, 0, 5, 1); BKLogReadHandler readHandler = bkdlm.createReadHandler(); Await.result(readHandler.lockStream()); // two subscribers could lock stream in parallel BKDistributedLogManager bkdlm10 = createNewDLM(conf, streamName); BKLogReadHandler s10Handler = bkdlm10.createReadHandler(Optional.of("s1")); Await.result(s10Handler.lockStream()); BKDistributedLogManager bkdlm20 = createNewDLM(conf, streamName); BKLogReadHandler s20Handler = bkdlm20.createReadHandler(Optional.of("s2")); Await.result(s20Handler.lockStream()); readHandler.asyncClose(); bkdlm.close(); s10Handler.asyncClose(); bkdlm10.close(); s20Handler.asyncClose(); bkdlm20.close(); }
@Test(timeout = 60000) public void testGetLastRecordAllControlRecords() throws Exception { String streamName = runtime.getMethodName(); BKDistributedLogManager bkdlm = (BKDistributedLogManager) createNewDLM(conf, streamName); DLMTestUtil.generateLogSegmentNonPartitioned(bkdlm, 5 /* control recs */, 0, 1 /* txid */); Future<LogRecordWithDLSN> futureLogrec = getLastUserRecord(bkdlm, 0); LogRecordWithDLSN logrec = Await.result(futureLogrec); assertEquals(null, logrec); bkdlm.close(); }
@Test(timeout = 60000) public void testForwardScanForRecordAfterLedger() throws Exception { String streamName = runtime.getMethodName(); BKDistributedLogManager bkdlm = (BKDistributedLogManager) createNewDLM(conf, streamName); DLMTestUtil.generateLogSegmentNonPartitioned(bkdlm, 0, 5 /* user recs */ , 1 /* txid */); DLSN dlsn = new DLSN(2,0,0); Future<LogRecordWithDLSN> futureLogrec = getFirstGreaterThanRecord(bkdlm, 0, dlsn); LogRecordWithDLSN logrec = Await.result(futureLogrec); assertEquals(null, logrec); bkdlm.close(); }
@Test(timeout = 60000) public void testForwardScanNotFirstRecord() throws Exception { String streamName = runtime.getMethodName(); BKDistributedLogManager bkdlm = (BKDistributedLogManager) createNewDLM(conf, streamName); DLMTestUtil.generateLogSegmentNonPartitioned(bkdlm, 0, 5, 1 /* txid */); DLSN dlsn = new DLSN(1,1,0); Future<LogRecordWithDLSN> futureLogrec = getFirstGreaterThanRecord(bkdlm, 0, dlsn); LogRecordWithDLSN logrec = Await.result(futureLogrec); assertEquals("should be an exact match", dlsn, logrec.getDlsn()); bkdlm.close(); }
@Test(timeout = 60000) public void testForwardScanFirstRecord() throws Exception { String streamName = runtime.getMethodName(); BKDistributedLogManager bkdlm = (BKDistributedLogManager) createNewDLM(conf, streamName); DLMTestUtil.generateLogSegmentNonPartitioned(bkdlm, 0, 5, 1 /* txid */); DLSN dlsn = new DLSN(1,0,0); Future<LogRecordWithDLSN> futureLogrec = getFirstGreaterThanRecord(bkdlm, 0, dlsn); LogRecordWithDLSN logrec = Await.result(futureLogrec); assertEquals("should be an exact match", dlsn, logrec.getDlsn()); bkdlm.close(); }
@Test(timeout = 60000) public void testGetLastRecordUserRecord() throws Exception { String streamName = runtime.getMethodName(); BKDistributedLogManager bkdlm = (BKDistributedLogManager) createNewDLM(conf, streamName); DLMTestUtil.generateLogSegmentNonPartitioned(bkdlm, 5 /* control recs */, 5, 1 /* txid */); Future<LogRecordWithDLSN> futureLogrec = getLastUserRecord(bkdlm, 0); LogRecordWithDLSN logrec = Await.result(futureLogrec); assertEquals(new DLSN(1,9,0), logrec.getDlsn()); bkdlm.close(); }
@Test(timeout = 60000) public void testForwardScanValidButNonExistentRecord() throws Exception { String streamName = runtime.getMethodName(); BKDistributedLogManager bkdlm = (BKDistributedLogManager) createNewDLM(conf, streamName); DLMTestUtil.generateLogSegmentNonPartitioned(bkdlm, 0, 5, 1 /* txid */); DLSN dlsn = new DLSN(1,0,1); Future<LogRecordWithDLSN> futureLogrec = getFirstGreaterThanRecord(bkdlm, 0, dlsn); LogRecordWithDLSN logrec = Await.result(futureLogrec); assertEquals(new DLSN(1,1,0), logrec.getDlsn()); bkdlm.close(); }
@Test(timeout = 60000) public void testForwardScanControlRecord() throws Exception { String streamName = runtime.getMethodName(); BKDistributedLogManager bkdlm = (BKDistributedLogManager) createNewDLM(conf, streamName); DLMTestUtil.generateLogSegmentNonPartitioned(bkdlm, 5 /* control recs */, 5, 1 /* txid */); DLSN dlsn = new DLSN(1,3,0); Future<LogRecordWithDLSN> futureLogrec = getFirstGreaterThanRecord(bkdlm, 0, dlsn); LogRecordWithDLSN logrec = Await.result(futureLogrec); assertEquals(new DLSN(1,5,0), logrec.getDlsn()); bkdlm.close(); }
@Test(timeout = 60000) public void testWriterStartsAtTxidZeroForEmptyStream() throws Exception { String name = testNames.getMethodName(); DistributedLogConfiguration conf = new DistributedLogConfiguration(); conf.setImmediateFlushEnabled(true); conf.setOutputBufferSize(1024); BKDistributedLogManager dlm = (BKDistributedLogManager) createNewDLM(conf, name); URI uri = createDLMURI("/" + name); BKDistributedLogManager.createLog(conf, dlm.getReaderZKC(), uri, name); // Log exists but is empty, better not throw. AppendOnlyStreamWriter writer = dlm.getAppendOnlyStreamWriter(); byte[] byteStream = DLMTestUtil.repeatString("a", 1025).getBytes(); Await.result(writer.write(byteStream)); writer.close(); dlm.close(); }
@Test(timeout = 60000) public void testForwardScanForRecordBeforeLedger() throws Exception { String streamName = runtime.getMethodName(); BKDistributedLogManager bkdlm = (BKDistributedLogManager) createNewDLM(conf, streamName); long txid = 1; txid += DLMTestUtil.generateLogSegmentNonPartitioned(bkdlm, 0, 5 /* user recs */ , txid); txid += DLMTestUtil.generateLogSegmentNonPartitioned(bkdlm, 0, 5 /* user recs */ , txid); txid += DLMTestUtil.generateLogSegmentNonPartitioned(bkdlm, 0, 5 /* user recs */ , txid); DLSN dlsn = new DLSN(1,3,0); Future<LogRecordWithDLSN> futureLogrec = getFirstGreaterThanRecord(bkdlm, 1, dlsn); LogRecordWithDLSN logrec = Await.result(futureLogrec); assertEquals(new DLSN(2,0,0), logrec.getDlsn()); bkdlm.close(); }
assertTrue(segments.get(0).isInProgress()); dlm.close();
assertTrue(segments.get(0).isInProgress()); dlm.close();
@Test(timeout = 60000) public void testReaderLockDlmClosed() throws Exception { String name = runtime.getMethodName(); DistributedLogManager dlm0 = createNewDLM(conf, name); BKAsyncLogWriter writer = (BKAsyncLogWriter)(dlm0.startAsyncLogSegmentNonPartitioned()); writer.write(DLMTestUtil.getLogRecordInstance(1L)); writer.write(DLMTestUtil.getLogRecordInstance(2L)); writer.closeAndComplete(); DistributedLogManager dlm1 = createNewDLM(conf, name); Future<AsyncLogReader> futureReader1 = dlm1.getAsyncLogReaderWithLock(DLSN.InitialDLSN); Await.result(futureReader1); BKDistributedLogManager dlm2 = (BKDistributedLogManager) createNewDLM(conf, name); Future<AsyncLogReader> futureReader2 = dlm2.getAsyncLogReaderWithLock(DLSN.InitialDLSN); dlm2.close(); try { Await.result(futureReader2); fail("should have thrown exception!"); } catch (LockClosedException ex) { } catch (LockCancelledException ex) { } dlm0.close(); dlm1.close(); }
@Test(timeout = 60000) public void testGetLastRecordControlRecord() throws Exception { String streamName = runtime.getMethodName(); BKDistributedLogManager bkdlm = (BKDistributedLogManager) createNewDLM(conf, streamName); AsyncLogWriter out = bkdlm.startAsyncLogSegmentNonPartitioned(); int txid = 1; Await.result(out.write(DLMTestUtil.getLargeLogRecordInstance(txid++, false))); Await.result(out.write(DLMTestUtil.getLargeLogRecordInstance(txid++, false))); Await.result(out.write(DLMTestUtil.getLargeLogRecordInstance(txid++, false))); Await.result(out.write(DLMTestUtil.getLargeLogRecordInstance(txid++, true))); Await.result(out.write(DLMTestUtil.getLargeLogRecordInstance(txid++, true))); Utils.close(out); Future<LogRecordWithDLSN> futureLogrec = getLastUserRecord(bkdlm, 0); LogRecordWithDLSN logrec = Await.result(futureLogrec); assertEquals(new DLSN(1,2,0), logrec.getDlsn()); bkdlm.close(); }