Three interrelated issues here:

- [ ] `TransportBroadcastByNodeAction` derivatives are typically executed via `NodeClient` which bypasses the `TransportService` and therefore does not respect (or even know about) the `executor` parameter which would fork. This means that the coordination work, including grouping all the shards by node, happens on the calling thread. When executed from the REST layer, that's a transport worker. This is #97916, but until that's fixed we need a workaround.

- [ ] The node-level responses are deserialised and processed on the receiving transport worker too.

- [ ] Several of these actions use `SAME` for their executor, bypassing the forking that _does_ exist today.

Relates #77466 
server/src/main/java/org/elasticsearch/action/support/broadcast/node/TransportBroadcastByNodeAction.java
final ShardsIterator shardIt = shards(clusterState, request, concreteIndices);
        final Map<String, List<ShardRouting>> shardsByNodeId = new HashMap<>();
        final var nodes = clusterState.nodes();
        int unavailableShardCount = 0;
        int availableShardCount = 0;
        for (final var shard : shardIt) {
            
            
            
            
            
            
            final var nodeId = shard.currentNodeId();
            if (nodeId != null && nodes.get(nodeId) != null) {
                shardsByNodeId.computeIfAbsent(nodeId, n -> new ArrayList<>()).add(shard);
                availableShardCount += 1;
            } else {
                unavailableShardCount++;
            }
        }
        executeAsCoordinatingNode(
            task,
            request,
            shardsByNodeId,
            unavailableShardCount,
            availableShardCount,
            nodes,
            getResponseFactory(request, clusterState),
            listener
        );