private ServerResponse getRecordFromNode(DataNodeId dataNodeId, BlobId blobId, GetOption getOption,
      ClusterMap clusterMap, StoreKeyFactory storeKeyFactory) throws InterruptedException {
    LOGGER.debug("Getting {} from {}", blobId, dataNodeId);
    ServerResponse serverResponse;
    try {
      Pair<ServerErrorCode, BlobAll> response =
          serverAdminTool.getAll(dataNodeId, blobId, getOption, clusterMap, storeKeyFactory);
      ServerErrorCode errorCode = response.getFirst();
      if (errorCode == ServerErrorCode.NoError) {
        BlobAll blobAll = response.getSecond();
        ByteBuf buffer = blobAll.getBlobData().content();
        byte[] blobBytes = new byte[buffer.readableBytes()];
        buffer.readBytes(blobBytes);
        buffer.release();
        serverResponse = new ServerResponse(errorCode, blobAll.getStoreKey(), blobAll.getBlobInfo().getBlobProperties(),
            blobAll.getBlobInfo().getUserMetadata(), blobBytes, blobAll.getBlobEncryptionKey());
      } else {
        serverResponse = new ServerResponse(errorCode, null, null, null, null, null);
      }
    } catch (MessageFormatException e) {
      LOGGER.error("Error while deserializing record for {} from {}", blobId, dataNodeId, e);
      serverResponse = new ServerResponse(ServerErrorCode.DataCorrupt, null, null, null, null, null);
    } catch (Exception e) {
      LOGGER.error("Error while getting record for {} from {}", blobId, dataNodeId, e);
      serverResponse = new ServerResponse(ServerErrorCode.UnknownError, null, null, null, null, null);
    } finally {
      throttler.maybeThrottle(1);
    }
    LOGGER.debug("ServerError code is {} for blob {} from {}", serverResponse.serverErrorCode, blobId, dataNodeId);
    return serverResponse;
  }
Gets the {@link ServerResponse} from {@code dataNodeId} for {@code blobId}.
@param dataNodeId the {@link DataNodeId} to query.
@param blobId the {@link BlobId} to operate on.
@param getOption the {@link GetOption} to use with the {@link com.github.ambry.protocol.GetRequest}.
@param clusterMap the {@link ClusterMap} instance to use.
@param storeKeyFactory the {@link StoreKeyFactory} to use.
@return the {@link ServerResponse} from {@code dataNodeId} for {@code blobId}.
@throws InterruptedException
ambry-tools/src/main/java/com/github/ambry/tools/admin/BlobValidator.java