@@ -55,7 +55,7 @@ public class ThreadPoolMergeScheduler extends MergeScheduler implements Elastics
5555 private final ThreadPoolMergeExecutorService threadPoolMergeExecutorService ;
5656 private final PriorityQueue <MergeTask > backloggedMergeTasks = new PriorityQueue <>(
5757 16 ,
58- Comparator .comparingLong (MergeTask ::estimatedMergeSize )
58+ Comparator .comparingLong (MergeTask ::estimatedRemainingMergeSize )
5959 );
6060 private final Map <MergePolicy .OneMerge , MergeTask > runningMergeTasks = new HashMap <>();
6161 // set when incoming merges should be throttled (i.e. restrict the indexing rate)
@@ -266,7 +266,7 @@ private void checkMergeTaskThrottling() {
266266 // exposed for tests
267267 // synchronized so that {@code #closed}, {@code #runningMergeTasks} and {@code #backloggedMergeTasks} are modified atomically
268268 synchronized Schedule schedule (MergeTask mergeTask ) {
269- assert mergeTask .isRunning () == false ;
269+ assert mergeTask .hasStartedRunning () == false ;
270270 if (closed ) {
271271 // do not run or backlog tasks when closing the merge scheduler, instead abort them
272272 return Schedule .ABORT ;
@@ -280,6 +280,7 @@ synchronized Schedule schedule(MergeTask mergeTask) {
280280 assert added : "starting merge task [" + mergeTask + "] registered as already running" ;
281281 return Schedule .RUN ;
282282 } else {
283+ assert mergeTask .hasStartedRunning () == false ;
283284 backloggedMergeTasks .add (mergeTask );
284285 return Schedule .BACKLOG ;
285286 }
@@ -403,8 +404,14 @@ public void setIORateLimit(long ioRateLimitBytesPerSec) {
403404 this .rateLimiter .setMBPerSec (ByteSizeValue .ofBytes (ioRateLimitBytesPerSec ).getMbFrac ());
404405 }
405406
406- public boolean isRunning () {
407- return mergeStartTimeNS .get () > 0L ;
407+ /**
408+ * Returns {@code true} if this task is currently running, or was run in the past.
409+ * An aborted task (see {@link #abort()}) is considered as NOT run.
410+ */
411+ public boolean hasStartedRunning () {
412+ boolean isRunning = mergeStartTimeNS .get () > 0L ;
413+ assert isRunning != false || rateLimiter .getTotalBytesWritten () == 0L ;
414+ return isRunning ;
408415 }
409416
410417 /**
@@ -415,7 +422,7 @@ public boolean isRunning() {
415422 */
416423 @ Override
417424 public void run () {
418- assert isRunning () == false ;
425+ assert hasStartedRunning () == false ;
419426 assert ThreadPoolMergeScheduler .this .runningMergeTasks .containsKey (onGoingMerge .getMerge ())
420427 : "runNowOrBacklog must be invoked before actually running the merge task" ;
421428 try {
@@ -480,7 +487,7 @@ public void run() {
480487 * (by the {@link org.apache.lucene.index.IndexWriter}) to any subsequent merges.
481488 */
482489 void abort () {
483- assert isRunning () == false ;
490+ assert hasStartedRunning () == false ;
484491 assert ThreadPoolMergeScheduler .this .runningMergeTasks .containsKey (onGoingMerge .getMerge ()) == false
485492 : "cannot abort a merge task that's already running" ;
486493 if (verbose ()) {
@@ -509,10 +516,17 @@ void abort() {
509516 }
510517 }
511518
512- long estimatedMergeSize () {
519+ /**
520+ * Before the merge task started running, this returns the estimated required disk space for the merge to complete
521+ * (i.e. the estimated disk space size of the resulting segment following the merge).
522+ * While the merge is running, the returned estimation is updated to take into account the data that's already been written.
523+ * After the merge completes, the estimation returned here should ideally be close to "0".
524+ */
525+ long estimatedRemainingMergeSize () {
513526 // TODO is it possible that `estimatedMergeBytes` be `0` for correctly initialize merges,
514527 // or is it always the case that if `estimatedMergeBytes` is `0` that means that the merge has not yet been initialized?
515- return onGoingMerge .getMerge ().getStoreMergeInfo ().estimatedMergeBytes ();
528+ long estimatedMergeSize = onGoingMerge .getMerge ().getStoreMergeInfo ().estimatedMergeBytes ();
529+ return Math .max (0L , estimatedMergeSize - rateLimiter .getTotalBytesWritten ());
516530 }
517531
518532 public long getMergeMemoryEstimateBytes () {
0 commit comments