org.elasticsearch.indices.recovery.RecoveryTarget#restoreFileFromSnapshot does not check for cancellation during the download of a file. This means that if a recovery is cancelled mid-way, we will still not release the store/shard-lock until the file is fully downloaded.
For large files or slow downloads this can lead to problems when the shard is (re-)allocated to a node that is still executing such an interrupted recovery.

-> we need to add some checks for cancellation here like we have for other recovery modes.
server/src/main/java/org/elasticsearch/indices/recovery/PeerRecoveryTargetService.java
listener.delegateFailure((l, r) -> {
                            Releasable reenableMonitor = target.disableRecoveryMonitor();
                            target.indexShard().afterCleanFiles(() -> {
                                reenableMonitor.close();
                                l.onResponse(null);
                            });
                        })
                    );
                }
            }
        );
        transportService.registerRequestHandler(
            Actions.PREPARE_TRANSLOG,
            ThreadPool.Names.GENERIC,
            RecoveryPrepareForTranslogOperationsRequest::new,
            new RecoveryRequestHandler<>() {
                @Override
                protected void handleRequest(
                    RecoveryPrepareForTranslogOperationsRequest request,
                    RecoveryTarget target,
                    ActionListener<Void> listener
                ) {
                    target.prepareForTranslogOperations(request.totalTranslogOps(), listener);
                }
            }
        );
        transportService.registerRequestHandler(
            Actions.TRANSLOG_OPS,
            ThreadPool.Names.GENERIC,
            RecoveryTranslogOperationsRequest::new,