**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
.<RetentionLease>andThen(
                    (createRetentionLeaseListener, ignored) -> createRetentionLease(
                        shardRecoveryPlan.getStartingSeqNo(),
                        createRetentionLeaseListener
                    )
                )
                
                .<Void>andThen((finalRecoveryPlanListener, retentionLease) -> {
                    final Store.MetadataSnapshot recoverySourceMetadata = shardRecoveryPlan.getSourceMetadataSnapshot();
                    final long lastKnownGlobalCheckpoint = shard.getLastKnownGlobalCheckpoint();
                    assert retentionLease == null || retentionLease.retainingSequenceNumber() - 1 <= lastKnownGlobalCheckpoint
                        : retentionLease + " vs " + lastKnownGlobalCheckpoint;
                    
                    
                    
                    
                    cleanFiles(store, recoverySourceMetadata, () -> translogOps, lastKnownGlobalCheckpoint, finalRecoveryPlanListener);
                })
                
                .<SendFileResult>andThen((resultListener, ignored) -> {
                    final TimeValue took = stopWatch.totalTime();
                    logger.trace("recovery [phase1]: took [{}]", took);
                    resultListener.onResponse(
                        new SendFileResult(
                            shardRecoveryPlan.getFilesToRecoverNames(),
                            shardRecoveryPlan.getFilesToRecoverSizes(),
                            shardRecoveryPlan.getTotalSize(),
                            shardRecoveryPlan.getFilesPresentInTargetNames(),
                            shardRecoveryPlan.getFilesPresentInTargetSizes(),
                            shardRecoveryPlan.getExistingSize(),