@Override
  public Future<GetBlobResult> getBlob(String blobId, GetBlobOptions options, Callback<GetBlobResult> callback,
      QuotaChargeCallback quotaChargeCallback) {
    logger.trace("Received getBlob call");
    FutureResult<GetBlobResult> futureResult = new FutureResult<>();
    if (!routerOpen) {
      completeOperation(futureResult, callback, null, ROUTER_CLOSED_EXCEPTION);
    } else {
      GetBlobResult result = null;
      switch (options.getOperationType()) {
        case All:
          result = new GetBlobResult(new BlobInfo(blobProperties, usermetadata),
              new PerfRSC(chunk, blobProperties.getBlobSize()), null);
          break;
        case Data:
          result = new GetBlobResult(null, new PerfRSC(chunk, blobProperties.getBlobSize()), null);
          break;
        case BlobInfo:
          result = new GetBlobResult(new BlobInfo(blobProperties, usermetadata), null, null);
          break;
      }
      completeOperation(futureResult, callback, result, null);
    }
    return futureResult;
  }
Creates an instance of PerfRouter with configuration as specified in {@code perfRouterConfig}.
@param perfConfig the {@link PerfConfig} to use that determines behavior.
@param perfRouterMetrics the {@link PerfRouterMetrics} instance to use to record metrics.
ambry-tools/src/main/java/com/github/ambry/tools/perf/rest/PerfRouter.java