From 040127f946d719562d35f05a06d745d0788f9f3c Mon Sep 17 00:00:00 2001 From: luyuncheng Date: Tue, 6 Jun 2023 17:58:28 +0800 Subject: [PATCH] Reduce numDeletesToMerge in softdelete merge --- .../java/org/apache/lucene/index/MergePolicy.java | 10 +++++++++- .../org/apache/lucene/index/TieredMergePolicy.java | 13 +++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/lucene/core/src/java/org/apache/lucene/index/MergePolicy.java b/lucene/core/src/java/org/apache/lucene/index/MergePolicy.java index 3eb527edb196..6b90b10836ed 100644 --- a/lucene/core/src/java/org/apache/lucene/index/MergePolicy.java +++ b/lucene/core/src/java/org/apache/lucene/index/MergePolicy.java @@ -741,8 +741,16 @@ public boolean useCompoundFile( * non-deleted documents is set. */ protected long size(SegmentCommitInfo info, MergeContext mergeContext) throws IOException { - long byteSize = info.sizeInBytes(); int delCount = mergeContext.numDeletesToMerge(info); + return size(info, delCount); + } + + /** + * Return the byte size of the provided {@link SegmentCommitInfo}, pro-rated by percentage of + * non-deleted documents is set. + */ + protected final long size(SegmentCommitInfo info, int delCount) throws IOException { + long byteSize = info.sizeInBytes(); assert assertDelCount(delCount, info); double delRatio = info.info.maxDoc() <= 0 ? 0d : (double) delCount / (double) info.info.maxDoc(); diff --git a/lucene/core/src/java/org/apache/lucene/index/TieredMergePolicy.java b/lucene/core/src/java/org/apache/lucene/index/TieredMergePolicy.java index 304bbdd2e57a..b4f3bb340dd2 100644 --- a/lucene/core/src/java/org/apache/lucene/index/TieredMergePolicy.java +++ b/lucene/core/src/java/org/apache/lucene/index/TieredMergePolicy.java @@ -915,13 +915,14 @@ public MergeSpecification findForcedDeletesMerges(SegmentInfos infos, MergeConte final Set merging = mergeContext.getMergingSegments(); boolean haveWork = false; + List sortedInfos = new ArrayList<>(); for (SegmentCommitInfo info : infos) { int delCount = mergeContext.numDeletesToMerge(info); assert assertDelCount(delCount, info); + sortedInfos.add(new SegmentSizeAndDocs(info, size(info, delCount), delCount)); double pctDeletes = 100. * ((double) delCount) / info.info.maxDoc(); if (pctDeletes > forceMergeDeletesPctAllowed && !merging.contains(info)) { haveWork = true; - break; } } @@ -929,7 +930,15 @@ public MergeSpecification findForcedDeletesMerges(SegmentInfos infos, MergeConte return null; } - List sortedInfos = getSortedBySegmentSize(infos, mergeContext); + sortedInfos.sort( + (o1, o2) -> { + // Sort by largest size: + int cmp = Long.compare(o2.sizeInBytes, o1.sizeInBytes); + if (cmp == 0) { + cmp = o1.name.compareTo(o2.name); + } + return cmp; + }); Iterator iter = sortedInfos.iterator(); while (iter.hasNext()) {