code: private CompletableFuture<CompactionArgs> readCandidates(DirectSegmentAccess segment, long startOffset, int maxLength, TimeoutTimer timer) {
          ReadResult rr = segment.read(startOffset, maxLength, timer.getRemaining());
          return AsyncReadResultProcessor.processAll(rr, this.executor, timer.getRemaining())
                                         .thenApply(inputStream -> parseEntries(inputStream, startOffset, maxLength));
      }
docs: Reads a set of compaction candidates from the Segment and generates a {@link CompactionArgs} with them grouped
  by their Key Hash.
  
  @param segment     The Segment to read from.
  @param startOffset The offset to start reading from.
  @param maxLength   The maximum number of bytes to read. The actual number of bytes read will be at most this, since
  we can only read whole Table Entries.
  @param timer       Timer for the operation.
  @return A CompletableFuture that, when completed, will contain a {@link CompactionArgs} with the result.