void doPrefetch(long relativeOffset, long size) throws IOException {
    long sizeToRead = Math.min(size, getMessageInfo().getSize() - relativeOffset);
    prefetchedData = PooledByteBufAllocator.DEFAULT.ioBuffer((int) sizeToRead);
    long fetchStartTime = SystemTime.getInstance().milliseconds();
    FileChannel fileChannel = getChannel();
    long fileOffset = offset.getOffset() + relativeOffset;
    int sizeRead = Utils.readFileToByteBuf(fileChannel, prefetchedData, fileOffset, (int) sizeToRead);
    if (sizeRead != sizeToRead) {
      throw new IOException(
          "Reading from " + getFile().getAbsolutePath() + " at offset " + fileOffset + ", expect " + sizeToRead
              + " bytes, but get " + sizeRead);
    }

    if (diskMetrics != null) {
      diskMetrics.diskReadTimePerMbInMs.update(
          ((SystemTime.getInstance().milliseconds() - fetchStartTime) << 20) / sizeToRead);
    }
    prefetchedDataRelativeOffset = relativeOffset;
  }
Do data doPrefetch: from disk to memory buffer.
@param relativeOffset the relativeOffset to start.
@param size The size requested to doPrefetch.
@throws IOException
ambry-store/src/main/java/com/github/ambry/store/StoreMessageReadSet.java