public void run() {
        ByteBuffer putContentBuf = ByteBuffer.wrap(putContent);
        ByteBufferAsyncWritableChannel getChannel = new ByteBufferAsyncWritableChannel();
        Future<Long> readIntoFuture = readableStreamChannel.readInto(getChannel, null);
        final int bytesToRead = putContentBuf.remaining();
        int readBytes = 0;
        Exception exceptionToReturn = null;
        try {
          do {
            ByteBuffer buf = null;
            buf = getChannel.getNextChunk();
            int bufLength = buf.remaining();
            if (readBytes + bufLength > bytesToRead) {
              throw new IllegalStateException(
                  "total content read" + (readBytes + bufLength) + " should not be greater than "
                      + "length of put content " + bytesToRead + " for " + blobId);
            }
            while (buf.hasRemaining()) {
              if (putContentBuf.get() != buf.get()) {
                exceptionToReturn = new IllegalStateException("Get and Put blob content mis-match for " + blobId);
              }
              readBytes++;
            }
            getChannel.resolveOldestChunk(null);
          } while (readBytes < bytesToRead);
          if (readBytes != readIntoFuture.get()) {
            throw new IllegalStateException(
                "The returned length in the future " + readIntoFuture.get() + " didn't match the "
                    + "length of data written " + readBytes + " for " + blobId);
          }
          if (getChannel.getNextChunk(0) != null) {
            throw new IllegalStateException(
                "More data found in the channel after reading all the required bytes for " + blobId);
          }
          readIntoFuture.get();
        } catch (InterruptedException e) {
          exceptionToReturn = e;
        } catch (ExecutionException e) {
          exceptionToReturn = e;
        } catch (IllegalStateException e) {
          exceptionToReturn = e;
        } finally {
          if (metricsCollector != null) {
            metricsCollector.updateLatency(SystemTime.getInstance().milliseconds() - startTimeInMs);
          }
          futureResult.done(null, exceptionToReturn);
          if (callback != null) {
            callback.onCompletion(null, exceptionToReturn);
          }
        }
      }
Class to compare the getBlob output
ambry-tools/src/main/java/com/github/ambry/tools/admin/ConcurrencyTestTool.java