An incomplete shard snapshot will prevent a shard from moving away from a node (see `SnapshotInProgressAllocationDecider`). That means that when a shard snapshot completes it may become possible to perform some shard movements that previously were not possible, so we should trigger a reroute to start those movements. AFAICT we do not trigger such a reroute today.
server/src/main/java/org/elasticsearch/snapshots/SnapshotsService.java
executor.execute(ActionRunnable.supply(shardCountListener, () -> {
                            final IndexMetadata metadata = repository.getSnapshotIndexMetaData(repositoryData, sourceSnapshot, index);
                            return Tuple.tuple(index, metadata.getNumberOfShards());
                        }));
                    }
                }, onFailure)
            );
        }, onFailure));
        
        allShardCountsListener.addListener(
            ActionListener.wrap(counts -> executeConsistentStateUpdate(repository, repoData -> new ClusterStateUpdateTask() {
                private SnapshotsInProgress.Entry updatedEntry;
                @Override
                public ClusterState execute(ClusterState currentState) {
                    final SnapshotsInProgress snapshotsInProgress = SnapshotsInProgress.get(currentState);
                    final String repoName = cloneEntry.repository();
                    final List<SnapshotsInProgress.Entry> existingEntries = snapshotsInProgress.forRepo(repoName);
                    final List<SnapshotsInProgress.Entry> updatedEntries = new ArrayList<>(existingEntries.size());
                    final String localNodeId = currentState.nodes().getLocalNodeId();
                    final ShardGenerations shardGenerations = repoData.shardGenerations();
                    for (SnapshotsInProgress.Entry existing : existingEntries) {
                        if (cloneEntry.snapshot().getSnapshotId().equals(existing.snapshot().getSnapshotId())) {
                            final ImmutableOpenMap.Builder<RepositoryShardId, ShardSnapshotStatus> clonesBuilder = ImmutableOpenMap
                                .builder();
                            final boolean readyToExecute = SnapshotDeletionsInProgress.get(currentState)
                                .hasExecutingDeletion(repoName) == false;
                            final InFlightShardSnapshotStates inFlightShardStates;
                            if (readyToExecute) {
                                inFlightShardStates = InFlightShardSnapshotStates.forEntries(snapshotsInProgress.forRepo(repoName));
                            } else {