transportService.registerRequestHandler(QUERY_ACTION_NAME, ThreadPool.Names.SAME, ShardSearchRequest::new,
(request, channel, task) -> {
searchService.executeQueryPhase(request, (SearchShardTask) task,
new ChannelActionListener<>(channel, QUERY_ACTION_NAME, request));
});
以上为query阶段的处理类
searchContext = new DefaultSearchContext(idGenerator.incrementAndGet(), request, shardTarget,
searcher, clusterService, indexService, indexShard, bigArrays, threadPool::relativeTimeInMillis, timeout,
fetchPhase, clusterService.state().nodes().getMinNodeVersion());
会初始化一个searchContext, id是searchService的idGenerator自增生成。
this.queryResult = new QuerySearchResult(id, shardTarget);
queryResult被初始化,其中第一个参数id就是searchContext的id
SearchPhaseResult会被作为query阶段的返回结果返回给协调节点。
ShardFetchSearchRequest fetchSearchRequest = createFetchRequest(queryResult.queryResult().getRequestId(), i, entry,
lastEmittedDocPerShard, searchShardTarget.getOriginalIndices());
executeFetch(i, searchShardTarget, counter, fetchSearchRequest, queryResult.queryResult(),
connection);
协调节点在组装第二阶段fetch阶段的请求参数时将query阶段结果中的id作为请求id发给数据节点。 数据节点获取到请求后就可以拿到这个id获取到query阶段创建的searchContext了。
this.asyncSender = interceptor.interceptSender(this::sendRequestInternal);
异步调用方法使用了装饰模式。
同步获取数据的封装。 返回了future
public <T extends TransportResponse> TransportFuture<T> submitRequest(DiscoveryNode node, String action, TransportRequest request,
TransportRequestOptions options,
TransportResponseHandler<T> handler) throws TransportException {
PlainTransportFuture<T> futureHandler = new PlainTransportFuture<>(handler);
try {
Transport.Connection connection = getConnection(node);
sendRequest(connection, action, request, options, futureHandler);
} catch (NodeNotConnectedException ex) {
// the caller might not handle this so we invoke the handler
futureHandler.handleException(ex);
}
return futureHandler;
}