private void mergeIfPossible(List<MemorySegment> mergeReadMemory,
ChannelDeleteRegistry<Tuple2<Integer, T>> channelDeleteRegistry,
AtomicBoolean aliveFlag) throws IOException {
List<DataFileInfo<SortedDataFile<Tuple2<Integer, T>>>> mergeCandidates = mergePolicy.selectMergeCandidates(mergeReadMemory.size());
while (mergeCandidates != null && aliveFlag.get()) {
int maxMergeRound = 0;
LinkedList<PartitionedSortedDataFile<T>> toBeMerged = new LinkedList<>();
for (DataFileInfo<SortedDataFile<Tuple2<Integer, T>>> mergeCandidate: mergeCandidates) {
maxMergeRound = Math.max(maxMergeRound, mergeCandidate.getMergeRound());
PartitionedSortedDataFile<T> partitionedSortedDataFile = (PartitionedSortedDataFile<T>) mergeCandidate.getDataFile();
toBeMerged.add(partitionedSortedDataFile);
}
LOG.info("Start merging {} files to one file.", toBeMerged.size());
try {
SortedDataFile<Tuple2<Integer, T>> mergedFile = mergeToOutput(
toBeMerged, mergeReadMemory, channelDeleteRegistry, mergeFileIndex--);
DataFileInfo<SortedDataFile<Tuple2<Integer, T>>> mergedFileInfo = new DataFileInfo<>(
mergedFile.getBytesWritten(), maxMergeRound + 1, numberOfSubpartitions, mergedFile);
mergePolicy.addNewCandidate(mergedFileInfo);
} catch (InterruptedException e) {
throw new RuntimeException("Merge was interrupted.", e);
}
mergeCandidates = mergePolicy.selectMergeCandidates(mergeReadMemory.size());
}
}