Today we deserialize and handle all responses from remote clusters on the transport thread. Some of these responses can be sizeable, or require nontrivial work to handle, so we need to move this work to different threads. https://github.com/elastic/elasticsearch/pull/97922 introduces a facility for doing so, and forks some work, but in that PR we could not decide whether to handle CCS-related responses on the `SEARCH` or `SEARCH_COORDINATION` pool. In order to make progress we left this work on the transport worker for now, but we think this is a bug and this computation should be forked elsewhere. Opening this issue to track that followup work.

Once it's decided where to run this work, here's the only bit that needs changing:

https://github.com/elastic/elasticsearch/blob/f4e3113ad00541f084b69664c6476c8fcf737386/server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java#L470-L471

server/src/main/java/org/elasticsearch/action/search/TransportSearchAction.java
return indices.entrySet()
            .stream()
            .collect(Collectors.toMap(Map.Entry::getKey, e -> new OriginalIndices(e.getValue().toArray(String[]::new), indicesOptions)));
    }
    static List<SearchShardIterator> getLocalLocalShardsIteratorFromPointInTime(
        ClusterState clusterState,
        OriginalIndices originalIndices,
        String localClusterAlias,
        SearchContextId searchContext,
        TimeValue keepAlive,
        boolean allowPartialSearchResults
    ) {
        final List<SearchShardIterator> iterators = new ArrayList<>(searchContext.shards().size());
        for (Map.Entry<ShardId, SearchContextIdForNode> entry : searchContext.shards().entrySet()) {
            final SearchContextIdForNode perNode = entry.getValue();
            if (Strings.isEmpty(perNode.getClusterAlias())) {
                final ShardId shardId = entry.getKey();
                final List<String> targetNodes = new ArrayList<>(2);
                
                if (clusterState.nodes().nodeExists(perNode.getNode())) {
                    targetNodes.add(perNode.getNode());
                }
                try {
                    final ShardIterator shards = OperationRouting.getShards(clusterState, shardId);
                    if (perNode.getSearchContextId().getSearcherId() != null) {
                        for (ShardRouting shard : shards) {
                            if (shard.currentNodeId().equals(perNode.getNode()) == false) {
                                targetNodes.add(shard.currentNodeId());
                            }
                        }