@@ -333,23 +333,43 @@ public void onFailure(Exception e) {
333333 if (indexShard .routingEntry ().isSearchable () == false && recoveryState .getPrimary ()) {
334334 assert preExistingRequest == null ;
335335 assert indexShard .indexSettings ().getIndexMetadata ().isSearchableSnapshot () == false ;
336- client .execute (
337- StatelessPrimaryRelocationAction .TYPE ,
338- new StatelessPrimaryRelocationAction .Request (
339- recoveryId ,
340- indexShard .shardId (),
341- transportService .getLocalNode (),
342- indexShard .routingEntry ().allocationId ().getId (),
343- recoveryTarget .clusterStateVersion ()
344- ),
345- cleanupOnly .delegateFailure ((l , unused ) -> {
346- ActionListener .completeWith (l , () -> {
347- onGoingRecoveries .markRecoveryAsDone (recoveryId );
348- return null ;
349- });
350- })
351- );
352- return ;
336+ try (onCompletion ) {
337+ client .execute (
338+ StatelessPrimaryRelocationAction .TYPE ,
339+ new StatelessPrimaryRelocationAction .Request (
340+ recoveryId ,
341+ indexShard .shardId (),
342+ transportService .getLocalNode (),
343+ indexShard .routingEntry ().allocationId ().getId (),
344+ recoveryTarget .clusterStateVersion ()
345+ ),
346+ new ActionListener <>() {
347+ @ Override
348+ public void onResponse (ActionResponse .Empty ignored ) {
349+ onGoingRecoveries .markRecoveryAsDone (recoveryId );
350+ }
351+
352+ @ Override
353+ public void onFailure (Exception e ) {
354+ final var cause = ExceptionsHelper .unwrapCause (e );
355+ final var sendShardFailure =
356+ // these indicate the source shard has already failed, which will independently notify the master and fail
357+ // the target shard
358+ false == (cause instanceof ShardNotFoundException
359+ || cause instanceof IndexNotFoundException
360+ || cause instanceof AlreadyClosedException );
361+
362+ // TODO retries? See RecoveryResponseHandler#handleException
363+ onGoingRecoveries .failRecovery (
364+ recoveryId ,
365+ new RecoveryFailedException (recoveryState , null , e ),
366+ sendShardFailure
367+ );
368+ }
369+ }
370+ );
371+ return ;
372+ }
353373 }
354374
355375 record StartRecoveryRequestToSend (StartRecoveryRequest startRecoveryRequest , String actionName , TransportRequest requestToSend ) {}
0 commit comments