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/RecoveryTarget.java
public long recoveryId() {
        return recoveryId;
    }
    public ShardId shardId() {
        return shardId;
    }
    public IndexShard indexShard() {
        ensureRefCount();
        return indexShard;
    }
    public DiscoveryNode sourceNode() {
        return this.sourceNode;
    }
    public RecoveryState state() {
        return indexShard.recoveryState();
    }
    public CancellableThreads cancellableThreads() {
        return cancellableThreads;
    }
    public boolean hasPermitToDownloadSnapshotFiles() {
        return snapshotFileDownloadsPermit != null;
    }
    
    public long lastAccessTime() {
        if (recoveryMonitorBlocks.get() == 0) {
            return lastAccessTime;
        }
        return System.nanoTime();
    }