private DiskRangeList preReadUncompressedStreams(long stripeOffset, ReadContext[] colCtxs,
      MutateHelper toRead, IdentityHashMap<ByteBuffer, Boolean> toRelease) throws IOException {
    if (isCompressed) return toRead.next;
    DiskRangeList iter = toRead.next;  // Keep "toRead" list for future use, don't extract().
    boolean hasError = true;
    try {
      for (int colIx = 0; colIx < colCtxs.length; ++colIx) {
        ReadContext ctx = colCtxs[colIx];
        if (ctx == null) continue; // This column is not included.
        for (int streamIx = 0; streamIx < ctx.streamCount; ++streamIx) {
          StreamContext sctx = ctx.streams[streamIx];
          DiskRangeList newIter = preReadUncompressedStream(
              stripeOffset, iter, sctx.offset, sctx.offset + sctx.length, sctx.kind);
          if (newIter != null) {
            iter = newIter;
          }
        }
      }
      // Release buffers as we are done with all the streams... also see toRelease comment.\
      // With uncompressed streams, we know we are done earlier.
      if (toRelease != null) {
        releaseBuffers(toRelease.keySet(), true);
        toRelease.clear();
      }
      if (LOG.isDebugEnabled()) {
        LOG.debug("Disk ranges after pre-read (file " + fileKey + ", base offset "
            + stripeOffset + "): " + RecordReaderUtils.stringifyDiskRanges(toRead.next));
      }
      iter = toRead.next; // Reset the iter to start.
      hasError = false;
    } finally {
      // At this point, everything in the list is going to have a refcount of one. Unless it
      // failed between the allocation and the incref for a single item, we should be ok.
      if (hasError) {
        try {
          releaseInitialRefcounts(toRead.next);
          if (toRelease != null) {
            releaseBuffers(toRelease.keySet(), true);
            toRelease.clear();
          }
        } catch (Throwable t) {
          LOG.error("Error during the cleanup after another error; ignoring", t);
        }
      }
    }
    return toRead.next; // Reset the iter to start.
  }
Pool factory that is used if another one isn't specified - just creates the objects.
ql/src/java/org/apache/hadoop/hive/ql/io/orc/encoded/EncodedReaderImpl.java