Performing any long running task or CPU intensive work on transport_worker threads is problematic. This is typically very bad for cluster stability.

This issue has been filed to examine the usage of transport_worked threads by ESQL, with the intention of "offloading" as much as possible, including deserialising large(ish) amounts of data.
x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/exchange/ExchangeService.java
public ExchangeSourceHandler createSourceHandler(String exchangeId, int maxBufferSize, String fetchExecutor) {
        ExchangeSourceHandler sourceHandler = new ExchangeSourceHandler(maxBufferSize, threadPool.executor(fetchExecutor));
        if (sources.putIfAbsent(exchangeId, sourceHandler) != null) {
            throw new IllegalStateException("source exchanger for id [" + exchangeId + "] already exists");
        }
        sourceHandler.addCompletionListener(ActionListener.releasing(() -> sources.remove(exchangeId)));
        return sourceHandler;
    }
    /**
     * Opens a remote sink handler on the remote node for the given session ID.
     */
    public static void openExchange(
        TransportService transportService,
        DiscoveryNode targetNode,
        String sessionId,
        int exchangeBuffer,
        ActionListener<Void> listener
    ) {
        transportService.sendRequest(
            targetNode,
            OPEN_EXCHANGE_ACTION_NAME,
            new OpenExchangeRequest(sessionId, exchangeBuffer),
            new ActionListenerResponseHandler<>(
                listener.map(unused -> null),
                in -> TransportResponse.Empty.INSTANCE,
                TransportResponseHandler.TRANSPORT_WORKER
            )
        );
    }
    private static class OpenExchangeRequest extends TransportRequest {