|
14 | 14 | import org.apache.lucene.index.MergeRateLimiter; |
15 | 15 | import org.apache.lucene.index.MergeScheduler; |
16 | 16 | import org.apache.lucene.index.MergeTrigger; |
| 17 | +import org.apache.lucene.store.AlreadyClosedException; |
17 | 18 | import org.apache.lucene.store.Directory; |
18 | 19 | import org.apache.lucene.store.FilterDirectory; |
19 | 20 | import org.apache.lucene.store.IOContext; |
@@ -210,16 +211,19 @@ private synchronized boolean runNowOrBacklog(MergeTask mergeTask) { |
210 | 211 | } |
211 | 212 |
|
212 | 213 | private void mergeDone(MergeTask mergeTask) { |
213 | | - synchronized (this) { |
214 | | - boolean removed = currentlyRunningMergeTasks.remove(mergeTask.onGoingMerge.getMerge()) != null; |
215 | | - assert removed : "completed merge task [" + mergeTask + "] not registered as running"; |
216 | | - // when one merge is done, maybe a backlogged one can now execute |
217 | | - enqueueBackloggedTasks(); |
218 | | - // signal here, because, when closing, we wait for all currently running merges to finish |
219 | | - maybeSignalAllMergesDoneAfterClose(); |
| 214 | + try { |
| 215 | + synchronized (this) { |
| 216 | + boolean removed = currentlyRunningMergeTasks.remove(mergeTask.onGoingMerge.getMerge()) != null; |
| 217 | + assert removed : "completed merge task [" + mergeTask + "] not registered as running"; |
| 218 | + // when one merge is done, maybe a backlogged one can now execute |
| 219 | + enqueueBackloggedTasks(); |
| 220 | + // signal here, because, when closing, we wait for all currently running merges to finish |
| 221 | + maybeSignalAllMergesDoneAfterClose(); |
| 222 | + } |
| 223 | + } finally { |
| 224 | + doneMergeTaskCount.incrementAndGet(); |
| 225 | + checkMergeTaskThrottling(); |
220 | 226 | } |
221 | | - doneMergeTaskCount.incrementAndGet(); |
222 | | - checkMergeTaskThrottling(); |
223 | 227 | } |
224 | 228 |
|
225 | 229 | private synchronized void maybeSignalAllMergesDoneAfterClose() { |
@@ -374,8 +378,12 @@ public void run() { |
374 | 378 | message(String.format(Locale.ROOT, "merge task %s end", this)); |
375 | 379 | } |
376 | 380 | mergeDone(this); |
377 | | - // kick-off next merge, if any |
378 | | - merge(mergeSource, MergeTrigger.MERGE_FINISHED); |
| 381 | + try { |
| 382 | + // kick-off next merge, if any |
| 383 | + merge(mergeSource, MergeTrigger.MERGE_FINISHED); |
| 384 | + } catch (@SuppressWarnings("unused") AlreadyClosedException ace) { |
| 385 | + // OK, this is what the {@code ConcurrentMergeScheduler} does |
| 386 | + } |
379 | 387 | } |
380 | 388 | } |
381 | 389 |
|
|
0 commit comments