**Build scan:**
https://gradle-enterprise.elastic.co/s/dxnvahurwubcu/tests/:server:internalClusterTest/org.elasticsearch.action.admin.indices.create.CreateIndexIT/testCreateAndDeleteIndexConcurrently

**Reproduction line:**
```
./gradlew ':server:internalClusterTest' --tests "org.elasticsearch.action.admin.indices.create.CreateIndexIT.testCreateAndDeleteIndexConcurrently" -Dtests.seed=3ED3285ADA7A0152 -Dtests.locale=is -Dtests.timezone=Africa/Tunis -Druntime.java=20
```

**Applicable branches:**
main, 8.8

**Reproduces locally?:**
No

**Failure history:**
https://gradle-enterprise.elastic.co/scans/tests?tests.container=org.elasticsearch.action.admin.indices.create.CreateIndexIT&tests.test=testCreateAndDeleteIndexConcurrently

**Failure excerpt:**
```
java.lang.Exception: Test abandoned because suite timeout was reached.

  at __randomizedtesting.SeedInfo.seed([3ED3285ADA7A0152]:0)

```
server/src/main/java/org/elasticsearch/indices/recovery/RecoverySourceHandler.java
cancellableThreads.checkForCancel();
                SubscribableListener
                    
                    .<ShardRecoveryPlan>newForked(
                        l -> recoveryPlannerService.computeRecoveryPlan(
                            shard.shardId(),
                            shardStateIdentifier,
                            recoverySourceMetadata,
                            request.metadataSnapshot(),
                            startingSeqNo,
                            translogOps.getAsInt(),
                            getRequest().targetNode().getMaxIndexVersion(),
                            canUseSnapshots(),
                            request.isPrimaryRelocation(),
                            l
                        )
                    )
                    
                    .<SendFileResult>andThen((l, plan) -> recoverFilesFromSourceAndSnapshot(plan, store, stopWatch, l))
                    
                    .addListener(listener);
            } else {
                logger.trace("skipping [phase1] since source and target have identical sync id [{}]", recoverySourceMetadata.getSyncId());
                SubscribableListener
                    
                    .<RetentionLease>newForked(leaseListener -> createRetentionLease(startingSeqNo, leaseListener))
                    
                    .<SendFileResult>andThen((l, ignored) -> {
                        final TimeValue took = stopWatch.totalTime();
                        logger.trace("recovery [phase1]: took [{}]", took);