@@ -1528,6 +1528,10 @@ public Engine.FlushResult flush(FlushRequest request) {
1528
1528
* @param listener to notify after full durability has been achieved
1529
1529
*/
1530
1530
public void flush (FlushRequest request , ActionListener <Engine .FlushResult > listener ) {
1531
+ flush (request , this ::getEngine , listener );
1532
+ }
1533
+
1534
+ protected void flush (FlushRequest request , Supplier <Engine > engine , ActionListener <Engine .FlushResult > listener ) {
1531
1535
final boolean waitIfOngoing = request .waitIfOngoing ();
1532
1536
final boolean force = request .force ();
1533
1537
logger .trace ("flush with {}" , request );
@@ -1539,7 +1543,9 @@ public void flush(FlushRequest request, ActionListener<Engine.FlushResult> liste
1539
1543
*/
1540
1544
verifyNotClosed ();
1541
1545
final long startTime = System .nanoTime ();
1542
- getEngine ().flush (force , waitIfOngoing , ActionListener .runBefore (l , () -> flushMetric .inc (System .nanoTime () - startTime )));
1546
+ assert engine != null : "engine supplier is null" ;
1547
+ assert engine .get () != null : "engine is null" ;
1548
+ engine .get ().flush (force , waitIfOngoing , ActionListener .runBefore (l , () -> flushMetric .inc (System .nanoTime () - startTime )));
1543
1549
});
1544
1550
}
1545
1551
@@ -2545,33 +2551,46 @@ public void addShardFailureCallback(Consumer<ShardFailure> onShardFailure) {
2545
2551
* indexing operation, so we can flush the index.
2546
2552
*/
2547
2553
public void flushOnIdle (long inactiveTimeNS ) {
2548
- Engine engineOrNull = getEngineOrNull ();
2549
- if (engineOrNull != null && System .nanoTime () - engineOrNull .getLastWriteNanos () >= inactiveTimeNS ) {
2550
- boolean wasActive = active .getAndSet (false );
2551
- if (wasActive ) {
2552
- logger .debug ("flushing shard on inactive" );
2553
- threadPool .executor (ThreadPool .Names .FLUSH )
2554
- .execute (() -> flush (new FlushRequest ().waitIfOngoing (false ).force (false ), new ActionListener <>() {
2555
- @ Override
2556
- public void onResponse (Engine .FlushResult flushResult ) {
2557
- if (flushResult .skippedDueToCollision ()) {
2558
- // In case an ongoing flush was detected, revert active flag so that a next flushOnIdle request
2559
- // will retry (#87888)
2554
+ tryWithEngineOrNull (engineOrNull -> {
2555
+ if (engineOrNull != null && System .nanoTime () - engineOrNull .getLastWriteNanos () >= inactiveTimeNS ) {
2556
+ boolean wasActive = active .getAndSet (false );
2557
+ if (wasActive ) {
2558
+ logger .debug ("flushing shard on inactive" );
2559
+ threadPool .executor (ThreadPool .Names .FLUSH ).execute (() -> {
2560
+ tryWithEngineOrNull (engine -> {
2561
+ if (engine == null ) {
2562
+ // Revert active flag so that a next flushOnIdle request will retry
2560
2563
active .set (true );
2561
- }
2562
- periodicFlushMetric .inc ();
2563
- }
2564
+ } else {
2565
+ flush (new FlushRequest ().waitIfOngoing (false ).force (false ), () -> engine , new ActionListener <>() {
2566
+ @ Override
2567
+ public void onResponse (Engine .FlushResult flushResult ) {
2568
+ if (flushResult .skippedDueToCollision ()) {
2569
+ // In case an ongoing flush was detected, revert active flag so that a next flushOnIdle request
2570
+ // will retry (#87888)
2571
+ active .set (true );
2572
+ }
2573
+ periodicFlushMetric .inc ();
2574
+ }
2564
2575
2565
- @ Override
2566
- public void onFailure (Exception e ) {
2567
- if (state != IndexShardState .CLOSED ) {
2568
- active .set (true );
2569
- logger .warn ("failed to flush shard on inactive" , e );
2576
+ @ Override
2577
+ public void onFailure (Exception e ) {
2578
+ if (state != IndexShardState .CLOSED ) {
2579
+ active .set (true );
2580
+ logger .warn ("failed to flush shard on inactive" , e );
2581
+ }
2582
+ }
2583
+ });
2570
2584
}
2571
- }
2572
- }));
2585
+ return null ;
2586
+ });
2587
+ });
2588
+ }
2589
+ } else {
2590
+ logger .trace (() -> "flush on idle skipped as it is either closed, engine being reset, or has been recently written to" );
2573
2591
}
2574
- }
2592
+ return null ;
2593
+ });
2575
2594
}
2576
2595
2577
2596
public boolean isActive () {
0 commit comments