code: private void fetchAllOutstanding() {
      // Start by retrieving our shared state within a synchronized block.
      String[] blockIdsToFetch;
      int numRetries;
      RetryingBlockFetchListener myListener;
      synchronized (this) {
        blockIdsToFetch = outstandingBlocksIds.toArray(new String[outstandingBlocksIds.size()]);
        numRetries = retryCount;
        myListener = currentListener;
      }
  
      // Now initiate the fetch on all outstanding blocks, possibly initiating a retry if that fails.
      try {
        fetchStarter.createAndStart(blockIdsToFetch, myListener);
      } catch (Exception e) {
        logger.error(String.format("Exception while beginning fetch of %s outstanding blocks %s",
          blockIdsToFetch.length, numRetries > 0 ? "(after " + numRetries + " retries)" : ""), e);
  
        if (shouldRetry(e)) {
          initiateRetry();
        } else {
          for (String bid : blockIdsToFetch) {
            listener.onBlockFetchFailure(bid, e);
          }
        }
      }
    }
docs: Fires off a request to fetch all blocks that have not been fetched successfully or permanently
  failed (i.e., by a non-IOException).