diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/ComputeService.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/ComputeService.java
index 36d6938644534..293be0eb3c2b0 100644
--- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/ComputeService.java
+++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plugin/ComputeService.java
@@ -68,7 +68,45 @@
import static org.elasticsearch.xpack.esql.plugin.EsqlPlugin.ESQL_WORKER_THREAD_POOL_NAME;
/**
- * Computes the result of a {@link PhysicalPlan}.
+ * Once query is parsed and validated it is scheduled for execution by {@code org.elasticsearch.xpack.esql.plugin.ComputeService#execute}
+ * This method is responsible for splitting physical plan into coordinator and data node plans.
+ *
+ * Coordinator plan is immediately executed locally (using {@code org.elasticsearch.xpack.esql.plugin.ComputeService#runCompute})
+ * and is prepared to collect and merge pages from data nodes into the final query result.
+ *
+ * Data node plan is passed to {@code org.elasticsearch.xpack.esql.plugin.DataNodeComputeHandler#startComputeOnDataNodes}
+ * that is responsible for
+ *
+ * -
+ * Determining list of nodes that contain shards referenced by the query with
+ * {@code org.elasticsearch.xpack.esql.plugin.DataNodeRequestSender#searchShards}
+ *
+ * -
+ * Each node in the list processed in
+ * {@code org.elasticsearch.xpack.esql.plugin.DataNodeComputeHandler#startComputeOnDataNodes}
+ * in order to
+ *
+ * -
+ * Open ExchangeSink on the target data node and link it with local ExchangeSource for the query
+ * using `internal:data/read/esql/open_exchange` transport request.
+ * {@see org.elasticsearch.compute.operator.exchange.ExchangeService#openExchange}
+ *
+ * -
+ * Start data node plan execution on the target data node
+ * using `indices:data/read/esql/data` transport request
+ * {@see org.elasticsearch.xpack.esql.plugin.DataNodeComputeHandler#messageReceived}
+ * {@see org.elasticsearch.xpack.esql.plugin.DataNodeComputeHandler#runComputeOnDataNode}
+ *
+ * -
+ * While coordinator plan executor is running it will read data from ExchangeSource that will poll pages
+ * from linked ExchangeSink on target data nodes or notify them that data set is already completed
+ * (for example when running FROM * | LIMIT 10 type of query) or query is canceled
+ * using `internal:data/read/esql/exchange` transport requests.
+ * {@see org.elasticsearch.compute.operator.exchange.ExchangeService.ExchangeTransportAction#messageReceived}
+ *
+ *
+ *
+ *
*/
public class ComputeService {
public static final String DATA_ACTION_NAME = EsqlQueryAction.NAME + "/data";