/** * Gets the under replicated fragments. */ private Set<LedgerFragment> getUnderreplicatedFragments(LedgerHandle lh, Long ledgerVerificationPercentage) throws InterruptedException { CheckerCallback checkerCb = new CheckerCallback(); ledgerChecker.checkLedger(lh, checkerCb, ledgerVerificationPercentage); Set<LedgerFragment> fragments = checkerCb.waitAndGetResult(); return fragments; }
private void checkFragments(Set<LedgerFragment> fragments, GenericCallback<Set<LedgerFragment>> cb, long percentageOfLedgerFragmentToBeVerified) { if (fragments.size() == 0) { // no fragments to verify cb.operationComplete(BKException.Code.OK, fragments); return; } // verify all the collected fragment replicas FullLedgerCallback allFragmentsCb = new FullLedgerCallback(fragments .size(), cb); for (LedgerFragment r : fragments) { LOG.debug("Checking fragment {}", r); try { verifyLedgerFragment(r, allFragmentsCb, percentageOfLedgerFragmentToBeVerified); } catch (InvalidFragmentException ife) { LOG.error("Invalid fragment found : {}", r); allFragmentsCb.operationComplete( BKException.Code.IncorrectParameterException, r); } catch (BKException e) { LOG.error("BKException when checking fragment : {}", r, e); } } }
checkFragments(fragments, cb, percentageOfLedgerFragmentToBeVerified);
final LedgerChecker checker = new LedgerChecker(client); checker.checkLedger(lh,
.newLedgerUnderreplicationManager(); this.admin = new BookKeeperAdmin(bkc, statsLogger); this.ledgerChecker = new LedgerChecker(bkc); this.workerThread = new BookieThread(this, "ReplicationWorker"); this.openLedgerRereplicationGracePeriod = conf
/** * Verify a ledger fragment to collect bad bookies. * * @param fragment * fragment to verify * @param cb * callback * @throws InvalidFragmentException */ private void verifyLedgerFragment(LedgerFragment fragment, GenericCallback<LedgerFragment> cb, Long percentageOfLedgerFragmentToBeVerified) throws InvalidFragmentException, BKException { Set<Integer> bookiesToCheck = fragment.getBookiesIndexes(); if (bookiesToCheck.isEmpty()) { cb.operationComplete(BKException.Code.OK, fragment); return; } AtomicInteger numBookies = new AtomicInteger(bookiesToCheck.size()); Map<Integer, Integer> badBookies = new HashMap<Integer, Integer>(); for (Integer bookieIndex : bookiesToCheck) { LedgerFragmentCallback lfCb = new LedgerFragmentCallback( fragment, bookieIndex, cb, badBookies, numBookies); verifyLedgerFragment(fragment, bookieIndex, lfCb, percentageOfLedgerFragmentToBeVerified); } }