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
* Clear all state associated with running snapshots. To be used on master-failover if the current node stops
         * being master.
         */
        synchronized void clear() {
            snapshotsToFinalize.clear();
            runningDeletions.clear();
            latestKnownMetaData = null;
        }
        synchronized boolean isEmpty() {
            return snapshotsToFinalize.isEmpty();
        }
        synchronized boolean assertNotQueued(Snapshot snapshot) {
            if (snapshotsToFinalize.getOrDefault(snapshot.getRepository(), new LinkedList<>())
                .stream()
                .anyMatch(entry -> entry.equals(snapshot))) {
                final var assertionError = new AssertionError("[" + snapshot + "] should not be in " + snapshotsToFinalize);
                logger.error("assertNotQueued failure", assertionError);
                throw assertionError;
            }
            return true;
        }
        synchronized boolean assertConsistent() {
            assert (latestKnownMetaData == null && snapshotsToFinalize.isEmpty())
                || (latestKnownMetaData != null && snapshotsToFinalize.isEmpty() == false)
                : "Should not hold on to metadata if there are no more queued snapshots";
            assert snapshotsToFinalize.values().stream().noneMatch(Collection::isEmpty) : "Found empty queue in " + snapshotsToFinalize;
            return true;
        }
    }
    interface SnapshotTask extends ClusterStateTaskListener {}