code: public ByteBuffer fetch(long position) throws InterruptedException, ExecutionException {
      long blockIndex = position / bufSize;
      boolean goingBack = false;
      for (WorkUnit w : full) {
        if (w.blockIndex == blockIndex) {
          ensureFetching(blockIndex + 1);
          nbHit++;
          return w.buf;
        } else if (w.blockIndex > blockIndex) {
          goingBack = true;
        }
      }
      if (goingBack) {
        // user is asking for a block with a lower index than we've already fetched -
        // in other words they are not following the expected pattern of increasing indexes.
        nbGoingBack++;
      }
      if (null == fetching) {
        ensureFetching(blockIndex);
      }
      WorkUnit candidate = fetching;
      // block until we have the buffer
      ByteBuffer buf = candidate.getBuf();
      full.add(candidate);
      fetching = null;
      if (candidate.blockIndex == blockIndex) {
        // this is who we were waiting for
        nbNearHit++;
        ensureFetching(blockIndex + 1);
        return buf;
      } else {
        // wrong block. Let's fetch the right one now.
        nbMiss++;
        ensureFetching(blockIndex);
        candidate = fetching;
        buf = candidate.getBuf();
        full.add(candidate);
        fetching = null;
        ensureFetching(blockIndex + 1);
        return buf;
      }
    }
docs: Start a background read of the buffer after this one (if there isn't one already).