/**
  * 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()));
   }
 }