I've seen three builds fail now witht he same error and this started happening on Nov 7 so it's likely we've introduced something here:

https://gradle-enterprise.elastic.co/scans/failures?failures.failureClassification=all_failures&failures.failureMessage=Execution%20failed%20for%20task%20%27:x-pack:qa:rolling-upgrade-multi-cluster:v8.6.0%23follower%23oneThirdUpgradedTest%27.%0A%3E%20%60cluster%7B:x-pack:qa:rolling-upgrade-multi-cluster:v8.6.0-follower%7D%60%20failed%20to%20wait%20for%20cluster%20health%20yellow%20after%2040%20SECONDS%0A%20%20%20%20IO%20error%20while%20waiting%20cluster%0A%20%20%20%20%20%20503%20Service%20Unavailable&search.relativeStartTime=P28D&search.timeZoneId=America/Los_Angeles#

```
* What went wrong:
Execution failed for task ':x-pack:qa:rolling-upgrade-multi-cluster:v8.6.0#follower#oneThirdUpgradedTest'.
> `cluster{:x-pack:qa:rolling-upgrade-multi-cluster:v8.6.0-follower}` failed to wait for cluster health yellow after 40 SECONDS
    IO error while waiting cluster
      503 Service Unavailable
```

It seems the follower cluster is having issues coming back up after upgrade.
server/src/main/java/org/elasticsearch/cluster/routing/allocation/allocator/DesiredBalanceReconciler.java
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.BiFunction;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
/**
 * Given the current allocation of shards and the desired balance, performs the next (legal) shard movements towards the goal.
 */
public class DesiredBalanceReconciler {
    private static final Logger logger = LogManager.getLogger(DesiredBalanceReconciler.class);
    private final DesiredBalance desiredBalance;
    private final RoutingAllocation allocation; 
    private final RoutingNodes routingNodes;
    private final NodeAllocationOrdering allocationOrdering;
    DesiredBalanceReconciler(
        DesiredBalance desiredBalance,
        RoutingAllocation routingAllocation,
        NodeAllocationOrdering allocationOrdering
    ) {
        this.desiredBalance = desiredBalance;
        this.allocation = routingAllocation;
        this.routingNodes = routingAllocation.routingNodes();
        this.allocationOrdering = allocationOrdering;
    }
    void run() {
        logger.debug("Reconciling desired balance for [{}]", desiredBalance.lastConvergedIndex());
        if (routingNodes.size() == 0) {
            
            failAllocationOfNewPrimaries(allocation);
            logger.trace("no nodes available, nothing to reconcile");