|
16 | 16 | import org.elasticsearch.action.admin.cluster.allocation.TransportGetAllocationStatsAction; |
17 | 17 | import org.elasticsearch.action.admin.cluster.node.stats.NodesStatsRequestParameters.Metric; |
18 | 18 | import org.elasticsearch.action.support.ActionFilters; |
| 19 | +import org.elasticsearch.action.support.SubscribableListener; |
19 | 20 | import org.elasticsearch.action.support.nodes.TransportNodesAction; |
| 21 | +import org.elasticsearch.client.internal.ParentTaskAssigningClient; |
20 | 22 | import org.elasticsearch.client.internal.node.NodeClient; |
21 | 23 | import org.elasticsearch.cluster.node.DiscoveryNode; |
22 | 24 | import org.elasticsearch.cluster.routing.allocation.DiskThresholdSettings; |
@@ -47,7 +49,7 @@ public class TransportNodesStatsAction extends TransportNodesAction< |
47 | 49 | NodesStatsResponse, |
48 | 50 | TransportNodesStatsAction.NodeStatsRequest, |
49 | 51 | NodeStats, |
50 | | - Void> { |
| 52 | + SubscribableListener<TransportGetAllocationStatsAction.Response>> { |
51 | 53 |
|
52 | 54 | public static final ActionType<NodesStatsResponse> TYPE = new ActionType<>("cluster:monitor/nodes/stats"); |
53 | 55 |
|
@@ -77,37 +79,55 @@ public TransportNodesStatsAction( |
77 | 79 |
|
78 | 80 | @Override |
79 | 81 | protected NodesStatsResponse newResponse(NodesStatsRequest request, List<NodeStats> responses, List<FailedNodeException> failures) { |
80 | | - return new NodesStatsResponse(clusterService.getClusterName(), responses, failures); |
| 82 | + assert false; |
| 83 | + throw new UnsupportedOperationException("use newResponseAsync instead"); |
| 84 | + } |
| 85 | + |
| 86 | + @Override |
| 87 | + protected SubscribableListener<TransportGetAllocationStatsAction.Response> createActionContext(Task task, NodesStatsRequest request) { |
| 88 | + return SubscribableListener.newForked(l -> { |
| 89 | + var metrics = request.getNodesStatsRequestParameters().requestedMetrics(); |
| 90 | + if (metrics.contains(Metric.FS) || metrics.contains(Metric.ALLOCATIONS)) { |
| 91 | + new ParentTaskAssigningClient(client, clusterService.localNode(), task).execute( |
| 92 | + TransportGetAllocationStatsAction.TYPE, |
| 93 | + new TransportGetAllocationStatsAction.Request( |
| 94 | + Objects.requireNonNullElse(request.timeout(), RestUtils.REST_MASTER_TIMEOUT_DEFAULT), |
| 95 | + new TaskId(clusterService.localNode().getId(), task.getId()), |
| 96 | + metrics |
| 97 | + ), |
| 98 | + l |
| 99 | + ); |
| 100 | + } else { |
| 101 | + l.onResponse(null); |
| 102 | + } |
| 103 | + }); |
81 | 104 | } |
82 | 105 |
|
83 | 106 | @Override |
84 | 107 | protected void newResponseAsync( |
85 | 108 | Task task, |
86 | 109 | NodesStatsRequest request, |
87 | | - Void actionContext, |
| 110 | + SubscribableListener<TransportGetAllocationStatsAction.Response> actionContext, |
88 | 111 | List<NodeStats> responses, |
89 | 112 | List<FailedNodeException> failures, |
90 | 113 | ActionListener<NodesStatsResponse> listener |
91 | 114 | ) { |
92 | | - var metrics = request.getNodesStatsRequestParameters().requestedMetrics(); |
93 | | - if (metrics.contains(Metric.FS) || metrics.contains(Metric.ALLOCATIONS)) { |
94 | | - client.execute( |
95 | | - TransportGetAllocationStatsAction.TYPE, |
96 | | - new TransportGetAllocationStatsAction.Request( |
97 | | - Objects.requireNonNullElse(request.timeout(), RestUtils.REST_MASTER_TIMEOUT_DEFAULT), |
98 | | - new TaskId(clusterService.localNode().getId(), task.getId()), |
99 | | - metrics |
100 | | - ), |
101 | | - listener.delegateFailure( |
102 | | - (l, r) -> ActionListener.respondAndRelease( |
103 | | - l, |
104 | | - newResponse(request, merge(responses, r.getNodeAllocationStats(), r.getDiskThresholdSettings()), failures) |
105 | | - ) |
| 115 | + actionContext |
| 116 | + // merge in the stats from the master, if available |
| 117 | + .andThenApply( |
| 118 | + getAllocationStatsResponse -> new NodesStatsResponse( |
| 119 | + clusterService.getClusterName(), |
| 120 | + getAllocationStatsResponse == null |
| 121 | + ? responses |
| 122 | + : merge( |
| 123 | + responses, |
| 124 | + getAllocationStatsResponse.getNodeAllocationStats(), |
| 125 | + getAllocationStatsResponse.getDiskThresholdSettings() |
| 126 | + ), |
| 127 | + failures |
106 | 128 | ) |
107 | | - ); |
108 | | - } else { |
109 | | - ActionListener.run(listener, l -> ActionListener.respondAndRelease(l, newResponse(request, responses, failures))); |
110 | | - } |
| 129 | + ) |
| 130 | + .addListener(listener); |
111 | 131 | } |
112 | 132 |
|
113 | 133 | private static List<NodeStats> merge( |
|
0 commit comments