elasticsearch源码关于TransportSearchAction【阶段二】4.executeQueryPhase【重点】

1.回顾SearchTransportService

public class SearchTransportService extends AbstractComponent
searchService.executeQueryPhase(request, (SearchTask) task, new ActionListener()
request$ShardSearchTransportRequest

transportService.registerRequestHandler(QUERY_ACTION_NAME, ShardSearchTransportRequest::new, ThreadPool.Names.SAME,
            new TaskAwareTransportRequestHandler<ShardSearchTransportRequest>() {
                @Override
                public void messageReceived(ShardSearchTransportRequest request, TransportChannel channel, Task task) throws Exception {
                    searchService.executeQueryPhase(request, (SearchTask) task, new ActionListener<SearchPhaseResult>() {
                        @Override
                        public void onResponse(SearchPhaseResult searchPhaseResult) {
                            try {
                                channel.sendResponse(searchPhaseResult);
                            } catch (IOException e) {
                                throw new UncheckedIOException(e);
                            }
                        }
                    });
                }
           });

2.SearchService

public class SearchService extends AbstractLifecycleComponent implements IndexEventListener
executeQueryPhase(request, task)
SearchService:方法1

   public void executeQueryPhase(ShardSearchRequest request, SearchTask task, ActionListener<SearchPhaseResult> listener) {
        rewriteShardRequest(request, new ActionListener<ShardSearchRequest>() {
            @Override
            public void onResponse(ShardSearchRequest request) {
                try {
                    if (!Objects.equals(request.shardId().getIndex().getName(), ".kibana")) {
                        System.out.println("监听search之后的结果SearchService#SearchService");
                    }
                    listener.onResponse(executeQueryPhase(request, task));
                } catch (Exception e) {
                    onFailure(e);
                }
            }
        });
    }

SearchService:方法2

 SearchPhaseResult executeQueryPhase(ShardSearchRequest request, SearchTask task) throws IOException {
        final SearchContext context = createAndPutContext(request);
        final SearchOperationListener operationListener = context.indexShard().getSearchOperationListener();
        context.incRef();
        boolean queryPhaseSuccess = false;
        try {
            context.setTask(task);
            operationListener.onPreQueryPhase(context);
            long time = System.nanoTime();
            contextProcessing(context);
            // 节点查询缓存
            loadOrExecuteQueryPhase(request, context);

            if (context.queryResult().hasSearchContext() == false && context.scrollContext() == null) {
                freeContext(context.id());
            } else {
                contextProcessedSuccessfully(context);
            }
            final long afterQueryTime = System.nanoTime();
            queryPhaseSuccess = true;
            operationListener.onQueryPhase(context, afterQueryTime - time);
            if (request.numberOfShards() == 1) {
                return executeFetchPhase(context, operationListener, afterQueryTime);
            }
            return context.queryResult();
        } catch (Exception e) {
        } finally {
            cleanContext(context);
        }
    }

3.SearchExecutionStatsCollector

public final class SearchExecutionStatsCollector implements ActionListener
response接收
listener$InitalSearchphase

 @Override
    public void onResponse(SearchPhaseResult response) {
        QuerySearchResult queryResult = response.queryResult();
        if (nodeId != null && queryResult != null) {
            final long serviceTimeEWMA = queryResult.serviceTimeEWMA();
            final int queueSize = queryResult.nodeQueueSize();
            final long responseDuration = System.nanoTime() - startNanos;
            // EWMA/queue size may be -1 if the query node doesn't support capturing it
            if (serviceTimeEWMA > 0 && queueSize > 0) {
                collector.addNodeStatistics(nodeId, queueSize, responseDuration, serviceTimeEWMA);
            }
        }
        listener.onResponse(response);
    }

4.SearchActionListener

abstract class SearchActionListener implements ActionListener

  @Override
    public final void onResponse(T response) {
        if (response instanceof FetchSearchResult && !Objects.equals(".kibana", response.getSearchShardTarget().getIndex())) {
            System.out.println("SearchActionListener#onResponse->innerOnResponse >>>" + response.getSearchShardTarget().getIndex());
        }
        response.setShardIndex(requestIndex);
        setSearchShardTarget(response);
        innerOnResponse(response);
    }

5.InitialSearchPhase

abstract class InitialSearchPhase extends SearchPhase
onShardResult(result, shardIt)

 private void performPhaseOnShard(final int shardIndex, final SearchShardIterator shardIt, final ShardRouting shard) {
        final Thread thread = Thread.currentThread();
            try {
                executePhaseOnShard(shardIt, shard, new SearchActionListener<FirstResult>(new SearchShardTarget(shard.currentNodeId(),
                    shardIt.shardId(), shardIt.getClusterAlias(), shardIt.getOriginalIndices()), shardIndex) {
                    @Override
                    public void innerOnResponse(FirstResult result) {
                        maybeFork(thread, () -> onShardResult(result, shardIt));
                    }
                });
            } catch (final Exception e) {
         }
    }
 private void maybeFork(final Thread thread, final Runnable runnable) {
        if (thread == Thread.currentThread()) {
            fork(runnable);
        } else {
            runnable.run();
        }
    }

successfulShardExecution

  private void onShardResult(FirstResult result, SearchShardIterator shardIt) {
        assert result.getShardIndex() != -1 : "shard index is not set";
        assert result.getSearchShardTarget() != null : "search shard target must not be null";

        onShardSuccess(result);
        successfulShardExecution(shardIt);
    }

maybeExecuteNext

  private void successfulShardExecution(SearchShardIterator shardsIt) {
        final int remainingOpsOnIterator;
        if (shardsIt.skip()) {
            remainingOpsOnIterator = shardsIt.remaining();
        } else {
            remainingOpsOnIterator = shardsIt.remaining() + 1;
        }
        final int xTotalOps = totalOps.addAndGet(remainingOpsOnIterator);
        if (xTotalOps == expectedTotalOps) {
            onPhaseDone();
        } else if (xTotalOps > expectedTotalOps) {
            throw new AssertionError("unexpected higher total ops [" + xTotalOps + "] compared to expected ["
                + expectedTotalOps + "]");
        } else if (shardsIt.skip() == false) {
            maybeExecuteNext();
        }
    }

maybeExecuteNext,执行下一个分片

 private void maybeExecuteNext() {
        final int index = shardExecutionIndex.getAndIncrement();
        if (index < shardsIts.size()) {
            final SearchShardIterator shardRoutings = shardsIts.get(index);
            performPhaseOnShard(index, shardRoutings, shardRoutings.nextOrNull());
        }
    }

6.TransportService

public class TransportService extends AbstractLifecycleComponent
processResponse(handler, response)

        @Override
        public void sendResponse(final TransportResponse response, TransportResponseOptions options) throws IOException {
            adapter.onResponseSent(requestId, action, response, options);
            final TransportResponseHandler handler = adapter.onResponseReceived(requestId);
            // ignore if its null, the adapter logs it
            if (handler != null) {
                final String executor = handler.executor();
                if (ThreadPool.Names.SAME.equals(executor)) {
                    if (response instanceof QuerySearchResult) {
                        QuerySearchResult querySearchResult = (QuerySearchResult) response;
                        SearchShardTarget searchShardTarget = querySearchResult.getSearchShardTarget();
                        if (!Objects.equals(searchShardTarget.getShardId().getIndexName(),".kibana")){
                            System.out.println("发送响应结果,TransportService#sendResponse ->(QuerySearchResult) response");
                        }
                    }
                    if (response instanceof GetResponse) {
                        GetResponse getResponse = (GetResponse) response;
                        if (!Objects.equals(getResponse.getIndex(),".kibana")){
                            System.out.println("发送响应结果,TransportService#sendResponse ->(GetResponse) response");
                        }
                    }
                    processResponse(handler, response);
                } else {
                    threadPool.executor(executor).execute(() -> processResponse(handler, response));
                }
            }
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值