A preview call can be quite expensive and cause timeout in a cluster. As a short term fix we identified 2 (hopefully) small fixes:

- make the call cancellable, the main issue here seems to be that preview calls search without using a parent task id(see this fix for data feeds: https://github.com/elastic/elasticsearch/pull/88142/files#diff-aba58244cb8f9dfa3ac3b6efeb02259e3d5956576f56c1ff5e243dd2aac27381)
- pass the timeout parameter of the preview call to the search call, currently a timeout can be specified, but is ignored for the inner search call, which is executed with no timeout (see https://www.elastic.co/guide/en/elasticsearch/reference/master/search-search.html#search-search-api-query-params).

Both changes are bugs and shall be relatively simple to implement and considered for backport to the 7.17 branch.

@przemekwitek can you have a look at this?

related: #88010
x-pack/plugin/transform/src/main/java/org/elasticsearch/xpack/transform/action/TransportPreviewTransformAction.java
src.put("_source", doc);
                    src.put("_id", id);
                    src.put("_index", dest);
                    return src;
                }).collect(Collectors.toList());
                try (XContentBuilder builder = jsonBuilder()) {
                    builder.startObject();
                    builder.field("docs", results);
                    builder.endObject();
                    var pipelineRequest = new SimulatePipelineRequest(BytesReference.bytes(builder), XContentType.JSON);
                    pipelineRequest.setId(pipeline);
                    client.execute(SimulatePipelineAction.INSTANCE, pipelineRequest, pipelineResponseActionListener);
                }
            }
        }, listener::onFailure);
        ActionListener<Map<String, String>> deduceMappingsListener = ActionListener.wrap(deducedMappings -> {
            mappings.set(deducedMappings);
            function.preview(
                client,
                ClientHelper.getPersistableSafeSecurityHeaders(threadPool.getThreadContext(), clusterService.state()),
                source,
                deducedMappings,
                NUMBER_OF_PREVIEW_BUCKETS,
                previewListener
            );
        }, listener::onFailure);
        function.deduceMappings(client, source, deduceMappingsListener);
    }
}