This is a [known issue](https://github.com/elastic/elasticsearch/issues/97916) around rest actions. They execute transport actions in the current thread instead of the thread that the action is registered for with the transport service in code like:

```java
return channel -> client.execute(GetRollupIndexCapsAction.INSTANCE, request, new RestToXContentListener<>(channel));
```

This is normally not an issue since the expensive actions that also have a REST endpoint are `TransportMasterNodeAction`s. In the case of `RestGetRollupCapsAction` and `RestGetRollupIndexCapsAction` which aren't, this breaks the fix in #89803 if the action is used via the REST layer.

-> I think until we figure out if we want to change the way threading works with the client in the above code, we should manually fork to the management pool in these actions to fix the slow action blocking transport threads.
x-pack/plugin/rollup/src/main/java/org/elasticsearch/xpack/rollup/action/TransportGetRollupCapsAction.java
indexCaps.add(jobCap);
                    allCaps.put(pattern, indexCaps);
                });
            });
        }
        
        return allCaps.entrySet()
            .stream()
            .collect(Collectors.toMap(Map.Entry::getKey, e -> new RollableIndexCaps(e.getKey(), e.getValue())));
    }
    static Optional<RollupIndexCaps> findRollupIndexCaps(String indexName, IndexMetadata indexMetadata) {
        if (indexMetadata == null) {
            return Optional.empty();
        }
        MappingMetadata rollupMapping = indexMetadata.mapping();
        if (rollupMapping == null) {
            return Optional.empty();
        }
        Object objMeta = rollupMapping.getSourceAsMap().get("_meta");
        if (objMeta == null) {
            return Optional.empty();
        }
        RollupIndexCaps caps = RollupIndexCaps.parseMetadataXContent(rollupMapping.source().uncompressed(), indexName);
        if (caps.hasCaps()) {
            return Optional.of(caps);
        }
        return Optional.empty();
    }
}