/** * 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; }
public void checkLedger(final LedgerHandle lh, final GenericCallback<Set<LedgerFragment>> cb, long percentageOfLedgerFragmentToBeVerified) { // build a set of all fragment replicas final Set<LedgerFragment> fragments = new HashSet<LedgerFragment>(); Long curEntryId = null; List<BookieSocketAddress> curEnsemble = null; for (Map.Entry<Long, ? extends List<BookieSocketAddress>> e : lh .getLedgerMetadata().getAllEnsembles().entrySet()) { if (curEntryId != null) { Set<Integer> bookieIndexes = new HashSet<Integer>(); for (int i = 0; i < curEnsemble.size(); i++) { bookieIndexes.add(i); } fragments.add(new LedgerFragment(lh, curEntryId, e.getKey() - 1, bookieIndexes)); } curEntryId = e.getKey(); curEnsemble = e.getValue(); } /* Checking the last segment of the ledger can be complicated in some cases. * In the case that the ledger is closed, we can just check the fragments of * the segment as normal even if no data has ever been written to. * In the case that the ledger is open, but enough entries have been written, * for lastAddConfirmed to be set above the start entry of the segment, we * can also check as normal. * However, if ledger is open, sometimes lastAddConfirmed cannot be trusted, * such as when it's lower than the first entry id, or not set at all,