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/admin/indices/stats/ShardStats.java
);
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        ShardStats that = (ShardStats) o;
        return Objects.equals(shardRouting, that.shardRouting)
            && Objects.equals(dataPath, that.dataPath)
            && Objects.equals(statePath, that.statePath)
            && isCustomDataPath == that.isCustomDataPath
            && Objects.equals(commitStats, that.commitStats)
            && Objects.equals(commonStats, that.commonStats)
            && Objects.equals(seqNoStats, that.seqNoStats)
            && Objects.equals(retentionLeaseStats, that.retentionLeaseStats)
            && Objects.equals(isSearchIdle, that.isSearchIdle)
            && Objects.equals(searchIdleTime, that.searchIdleTime);
    }
    @Override
    public int hashCode() {
        return Objects.hash(
            shardRouting,
            dataPath,
            statePath,
            isCustomDataPath,
            commitStats,
            commonStats,
            seqNoStats,
            retentionLeaseStats,
            isSearchIdle,