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
public ClusterState execute(ClusterState currentState) {
                RoutingTable routingTable = currentState.routingTable();
                final SnapshotsInProgress snapshots = SnapshotsInProgress.get(currentState);
                final SnapshotDeletionsInProgress deletes = SnapshotDeletionsInProgress.get(currentState);
                DiscoveryNodes nodes = currentState.nodes();
                final EnumSet<State> statesToUpdate;
                
                
                
                if (changedNodes) {
                    statesToUpdate = EnumSet.of(State.STARTED, State.ABORTED);
                } else {
                    
                    
                    statesToUpdate = EnumSet.of(State.STARTED);
                }
                
                
                
                
                
                
                SnapshotsInProgress updated = snapshots;
                for (final List<SnapshotsInProgress.Entry> snapshotsInRepo : snapshots.entriesByRepo()) {
                    boolean changed = false;
                    final List<SnapshotsInProgress.Entry> updatedEntriesForRepo = new ArrayList<>();
                    final Map<RepositoryShardId, ShardSnapshotStatus> knownFailures = new HashMap<>();
                    final String repository = snapshotsInRepo.get(0).repository();
                    for (SnapshotsInProgress.Entry snapshot : snapshotsInRepo) {
                        if (statesToUpdate.contains(snapshot.state())) {