@Override
              public void onCompletion(Pair<String, byte[]> result, Exception exception) {
                if (exception == null) {
                  if (currentPutCount.get() < totalPutCount) {
                    generatedBlobAccessInfos.add(new BlobAccessInfo(result.getFirst(), result.getSecond()));
                    currentPutCount.incrementAndGet();
                  }
                } else {
                  logger.error("PutBlob failed with ", exception);
                  failureCount.incrementAndGet();
                }
                countDownLatch.countDown();
              }
Put threads to assist in producing blobs or uploading blobs to ambry
Put threads proceeds in multiple phases until {@code totalPutCount} is reached.
During each phase, N random uploads(max of {@code maxParallelRequest} are done to ambry with the help of
{@link PutGetHelper}. On completion of one phase, the thread proceeds onto the next phase after sleeping for max of
{@code sleepTimeBetweenBatchPutsInMs} ms.
ambry-tools/src/main/java/com/github/ambry/tools/admin/ConcurrencyTestTool.java