/** * Replicate the Ledger fragment to target Bookie passed. * * @param lh - ledgerHandle * @param ledgerFragment - LedgerFragment to replicate */ public void replicateLedgerFragment(LedgerHandle lh, final LedgerFragment ledgerFragment) throws InterruptedException, BKException { Optional<Set<BookieSocketAddress>> excludedBookies = Optional.absent(); Map<Integer, BookieSocketAddress> targetBookieAddresses = getReplacedBookiesByIndexes( lh, ledgerFragment.getEnsemble(), ledgerFragment.getBookiesIndexes(), excludedBookies); replicateLedgerFragment(lh, ledgerFragment, targetBookieAddresses); }
private static Map<BookieSocketAddress, BookieSocketAddress> getReplacedBookiesMap( LedgerFragment ledgerFragment, Map<Integer, BookieSocketAddress> targetBookieAddresses) { Map<BookieSocketAddress, BookieSocketAddress> bookiesMap = new HashMap<BookieSocketAddress, BookieSocketAddress>(); for (Integer bookieIndex : ledgerFragment.getBookiesIndexes()) { BookieSocketAddress oldBookie = ledgerFragment.getAddress(bookieIndex); BookieSocketAddress newBookie = targetBookieAddresses.get(bookieIndex); bookiesMap.put(oldBookie, newBookie); } return bookiesMap; }
private void replicateLedgerFragment( LedgerHandle lh, final LedgerFragment ledgerFragment, final Map<Integer, BookieSocketAddress> targetBookieAddresses) throws InterruptedException, BKException { SyncCounter syncCounter = new SyncCounter(); ResultCallBack resultCallBack = new ResultCallBack(syncCounter); SingleFragmentCallback cb = new SingleFragmentCallback( resultCallBack, lh, ledgerFragment.getFirstEntryId(), getReplacedBookiesMap(ledgerFragment, targetBookieAddresses)); syncCounter.inc(); Set<BookieSocketAddress> targetBookieSet = new HashSet<BookieSocketAddress>(); targetBookieSet.addAll(targetBookieAddresses.values()); asyncRecoverLedgerFragment(lh, ledgerFragment, cb, targetBookieSet); syncCounter.block(0); if (syncCounter.getrc() != BKException.Code.OK) { throw BKException.create(bkc.getReturnRc(syncCounter.getrc())); } }