@Override
          public void onCompletion(String result, Exception exception) {
            long latencyPerBlob = SystemTime.getInstance().milliseconds() - startTimeInMs;
            metricsCollector.updateLatency(latencyPerBlob);
            logger.trace(" Time taken to put blob id {} in ms {} for blob of size {}", result, latencyPerBlob,
                blob.length);
            Exception exceptionToReturn = null;
            Pair<String, byte[]> toReturn = null;
            if (result != null) {
              toReturn = new Pair(result, blob);
            } else {
              exceptionToReturn = exception;
            }
            futureResult.done(toReturn, exceptionToReturn);
            if (callback != null) {
              callback.onCompletion(toReturn, exceptionToReturn);
            }
          }
{@inheritDoc}
Uploads a blob to the server directly and returns the blobId along with the content
@param callback the {@link Callback} that will be called on completion
@param metricsCollector the {@link MetricsCollector} to collect and report metrics
@return a {@link Future} which will contain the result eventually
ambry-tools/src/main/java/com/github/ambry/tools/admin/ConcurrencyTestTool.java