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
getFallbackNodeIds(shard, isThrottled)
                    )) {
                        for (final var desiredNodeId : nodeIdIterator) {
                            final var routingNode = routingNodes.node(desiredNodeId);
                            if (routingNode == null) {
                                
                                continue;
                            }
                            final var decision = allocation.deciders().canAllocate(shard, routingNode, allocation);
                            switch (decision.type()) {
                                case YES -> {
                                    if (logger.isTraceEnabled()) {
                                        logger.trace("Assigned shard [{}] to [{}]", shard, desiredNodeId);
                                    }
                                    final long shardSize = DiskThresholdDecider.getExpectedShardSize(
                                        shard,
                                        ShardRouting.UNAVAILABLE_EXPECTED_SHARD_SIZE,
                                        allocation.clusterInfo(),
                                        allocation.snapshotShardSizeInfo(),
                                        allocation.metadata(),
                                        allocation.routingTable()
                                    );
                                    routingNodes.initializeShard(shard, desiredNodeId, null, shardSize, allocation.changes());
                                    allocationOrdering.recordAllocation(desiredNodeId);
                                    if (shard.primary() == false) {
                                        
                                        
                                        while (i < primaryLength - 1 && comparator.compare(primary[i], primary[i + 1]) == 0) {
                                            secondary[secondaryLength++] = primary[++i];
                                        }