public synchronized void close() { if (closed) { return; } LOG.info("BookKeeper Client closed {}", name); if (null != bkc) { try { bkc.close(); } catch (InterruptedException e) { LOG.warn("Interrupted on closing bookkeeper client {} : ", name, e); Thread.currentThread().interrupt(); } catch (BKException e) { LOG.warn("Error on closing bookkeeper client {} : ", name, e); } } if (null != zkc) { if (null != sessionExpireWatcher) { zkc.unregister(sessionExpireWatcher); } if (ownZK) { zkc.close(); } } closed = true; }
/** * Create ledger async and schedule a timeout task to check ledger-creation is complete else it fails the callback * with TimeoutException. * * @param bookKeeper * @param config * @param digestType * @param cb * @param emptyMap */ protected void asyncCreateLedger(BookKeeper bookKeeper, ManagedLedgerConfig config, DigestType digestType, CreateCallback cb, Map<Object, Object> emptyMap) { AtomicBoolean ledgerCreated = new AtomicBoolean(false); bookKeeper.asyncCreateLedger(config.getEnsembleSize(), config.getWriteQuorumSize(), config.getAckQuorumSize(), digestType, config.getPassword(), cb, ledgerCreated, Collections.emptyMap()); scheduledExecutor.schedule(() -> { if (!ledgerCreated.get()) { ledgerCreated.set(true); cb.createComplete(BKException.Code.TimeoutException, null, null); } }, config.getMetadataOperationsTimeoutSeconds(), TimeUnit.SECONDS); }
LogSegmentReader(String streamName, DistributedLogConfiguration conf, BookKeeper bk, LogSegmentSplit split) throws IOException { this.streamName = streamName; this.bk = bk; this.metadata = split.getMetadata(); try { this.lh = bk.openLedgerNoRecovery( split.getLedgerId(), BookKeeper.DigestType.CRC32, conf.getBKDigestPW().getBytes(UTF_8)); } catch (BKException e) { throw new IOException(e); } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new IOException(e); } }
/** * Open the given ledger <i>ledgerDesc</i>. * * @param ledgerDesc * ledger description * @param callback * open callback. * @param ctx * callback context */ private void asyncOpenLedger(LedgerDescriptor ledgerDesc, AsyncCallback.OpenCallback callback, Object ctx) { try { if (!ledgerDesc.isFenced()) { bkc.get().asyncOpenLedgerNoRecovery(ledgerDesc.getLedgerId(), BookKeeper.DigestType.CRC32, digestpw.getBytes(UTF_8), callback, ctx); } else { bkc.get().asyncOpenLedger(ledgerDesc.getLedgerId(), BookKeeper.DigestType.CRC32, digestpw.getBytes(UTF_8), callback, ctx); } } catch (IOException ace) { // :) when we can't get bkc, it means bookie handle not available callback.openComplete(BKException.Code.BookieHandleNotAvailableException, null, ctx); } }
conf.setReadEntryTimeout(timeoutSecs); BookKeeper bk = new BookKeeper(conf); LedgerHandle lh = null; try { lh = bk.createLedger(1, 1, DigestType.MAC, new byte[0]); LOG.info("Created ledger {}", lh.getId()); lh = bk.openLedger(lh.getId(), DigestType.MAC, new byte[0]); if (lh.getLastAddConfirmed() != (numberOfEntries - 1)) { throw new Exception("Invalid last entry found on ledger. expecting: " + (numberOfEntries - 1) } finally { if (lh != null) { bk.deleteLedger(lh.getId()); LOG.info("Deleted ledger {}", lh.getId()); bk.close();
@Override public int runCmd(CommandLine cmdLine) throws Exception { final long lid = getOptionLedgerIdValue(cmdLine, "ledgerid", -1); if (lid == -1) { System.err.println("Must specify a ledger id"); return -1; } boolean force = cmdLine.hasOption("f"); boolean confirm = false; if (!force) { confirm = IOUtils.confirmPrompt( "Are you sure to delete Ledger : " + ledgerIdFormatter.formatLedgerId(lid) + "?"); } BookKeeper bk = null; try { if (force || confirm) { ClientConfiguration conf = new ClientConfiguration(); conf.addConfiguration(bkConf); bk = new BookKeeper(conf); bk.deleteLedger(lid); } } finally { if (bk != null) { bk.close(); } } return 0; }
@Override public int runCmd(CommandLine cmdLine) throws Exception { ClientConfiguration clientConf = new ClientConfiguration(bkConf); clientConf.setDiskWeightBasedPlacementEnabled(true); BookKeeper bk = new BookKeeper(clientConf); Map<BookieSocketAddress, BookieInfo> map = bk.getBookieInfo(); if (map.size() == 0) { System.out.println("Failed to retrieve bookie information from any of the bookies"); bk.close(); return 0; } System.out.println("Free disk space info:"); long totalFree = 0, total = 0; for (Map.Entry<BookieSocketAddress, BookieInfo> e : map.entrySet()) { BookieInfo bInfo = e.getValue(); BookieSocketAddress bookieId = e.getKey(); System.out.println(getBookieSocketAddrStringRepresentation(bookieId) + ":\tFree: " + bInfo.getFreeDiskSpace() + getReadable(bInfo.getFreeDiskSpace()) + "\tTotal: " + bInfo.getTotalDiskSpace() + getReadable(bInfo.getTotalDiskSpace())); totalFree += bInfo.getFreeDiskSpace(); total += bInfo.getTotalDiskSpace(); } System.out.println("Total free disk space in the cluster:\t" + totalFree + getReadable(totalFree)); System.out.println("Total disk capacity in the cluster:\t" + total + getReadable(total)); bk.close(); return 0; } }
@Override public void operationComplete(Void result, Stat stat) { log.info("[{}] Updated cursor {} with ledger id {} md-position={} rd-position={}", ledger.getName(), name, lh.getId(), markDeletePosition, readPosition); final LedgerHandle oldLedger = cursorLedger; cursorLedger = lh; cursorLedgerStat = stat; // At this point the position had already been safely markdeleted callback.operationComplete(); asyncDeleteLedger(oldLedger); }
while (numRetries > 0) { try { LedgerHandle lh = bkc.get().openLedger(lid, BookKeeper.DigestType.CRC32, passwd); lh.close(); System.out.println("Fenced ledger " + lid + ", " + numPendings.decrementAndGet() + " left.");
bookKeeper.asyncDeleteLedger(lh.getId(), (rc, ctx) -> { mbean.endDataLedgerDeleteOp(); log.info("[{}] Delete complete for empty ledger {}. rc={}", name, lh.getId(), rc); this.lastLedgerCreationInitiationTimestamp = System.nanoTime(); mbean.startDataLedgerCreateOp(); bookKeeper.asyncCreateLedger(config.getEnsembleSize(), config.getWriteQuorumSize(), config.getAckQuorumSize(), config.getDigestType(), config.getPassword(), this, null);
bookKeeper.asyncOpenLedger(id, digestType, config.getPassword(), opencb, null); } else { initializeBookKeeper(callback);
private ManagedLedgerFactoryImpl(ZooKeeper zkc, ClientConfiguration bkClientConfiguration, ManagedLedgerFactoryConfig config) throws Exception { this(new BookKeeper(bkClientConfiguration, zkc), true /* isBookkeeperManaged */, zkc, config); }
ClientConfiguration clientConf = new ClientConfiguration(); clientConf.addConfiguration(conf); BookKeeper bk = new BookKeeper(clientConf); Long ledgerId = Long.parseLong(params.get("ledger_id")); bk.deleteLedger(ledgerId);
@Override public void run() { while (true) { Long ledger = ledgerQueue.poll(); if (null == ledger) { break; } try { getBookKeeperClient().get().deleteLedger(ledger); int numLedgersDeleted = numLedgers.incrementAndGet(); if (numLedgersDeleted % 1000 == 0) { System.out.println("Deleted " + numLedgersDeleted + " ledgers."); } } catch (BKException.BKNoSuchLedgerExistsException e) { int numLedgersDeleted = numLedgers.incrementAndGet(); if (numLedgersDeleted % 1000 == 0) { System.out.println("Deleted " + numLedgersDeleted + " ledgers."); } } catch (Exception e) { numFailures.incrementAndGet(); break; } } doneLatch.countDown(); System.out.println("Thread " + tid + " quits"); } });
@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()); } }
ClientConfiguration clientConf = new ClientConfiguration(conf); clientConf.setDiskWeightBasedPlacementEnabled(true); BookKeeper bk = new BookKeeper(clientConf); Map<BookieSocketAddress, BookieInfoReader.BookieInfo> map = bk.getBookieInfo(); if (map.size() == 0) { bk.close(); response.setCode(HttpServer.StatusCode.NOT_FOUND); response.setBody("Not found any Bookie info."); + ", Total: " + total + getReadable(total) + "}"); bk.close();
private void asyncDeleteLedger(long ledgerId, long retry) { if (retry <= 0) { log.warn("[{}] Failed to delete ledger after retries {}", name, ledgerId); return; } bookKeeper.asyncDeleteLedger(ledgerId, (rc, ctx) -> { if (rc == BKException.Code.NoSuchLedgerExistsException) { log.warn("[{}] Ledger was already deleted {}", name, ledgerId); } else if (rc != BKException.Code.OK) { log.error("[{}] Error deleting ledger {}", name, ledgerId, BKException.getMessage(rc)); scheduledExecutor.schedule(safeRun(() -> { asyncDeleteLedger(ledgerId, retry - 1); }), DEFAULT_LEDGER_DELETE_BACKOFF_TIME_SEC, TimeUnit.SECONDS); } else { if (log.isDebugEnabled()) { log.debug("[{}] Deleted ledger {}", name, ledgerId); } } }, null); }
LedgerHandle lh = bkc.get().openLedger(ledgerId, BookKeeper.DigestType.CRC32, getConf().getBKDigestPW().getBytes(UTF_8)); LedgerHandle readLh = bkc.get().openLedger(ledgerId, BookKeeper.DigestType.CRC32, getConf().getBKDigestPW().getBytes(UTF_8)); LedgerReader lr = new LedgerReader(bkc.get());
} else { iterator.remove(); bookKeeper.asyncDeleteLedger(li.getLedgerId(), (rc, ctx) -> { if (log.isDebugEnabled()) { log.debug("[{}] Deleted empty ledger ledgerId={} rc={}", name, li.getLedgerId(), rc); bookKeeper.asyncCreateLedger(config.getEnsembleSize(), config.getWriteQuorumSize(), config.getAckQuorumSize(), config.getDigestType(), config.getPassword(), (rc, lh, ctx) -> { executor.submitOrdered(name, safeRun(() -> {
bookkeeper.asyncOpenLedger(ledgerId, digestType, config.getPassword(), (rc, lh, ctx) -> { if (log.isDebugEnabled()) { log.debug("[{}] Opened ledger {} for consumer {}. rc={}", ledger.getName(), ledgerId, name, rc);