Skip to content

Commit a65b18f

Browse files
rjernsts1monw
andcommitted
Core: Remove plain execute method on TransportAction (#30998)
TransportAction has many variants of execute. One of those variants executes by returning a future, which is then often blocked on by calling get(). This commit removes this variant of execute, instead using a helper method for tests that want to block, or having tests pass in a PlainActionFuture directly as a listener. Co-authored-by: Simon Willnauer <[email protected]>
1 parent 1f6e874 commit a65b18f

File tree

9 files changed

+110
-70
lines changed

9 files changed

+110
-70
lines changed

server/src/main/java/org/elasticsearch/action/support/TransportAction.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,6 @@ protected TransportAction(Settings settings, String actionName, ThreadPool threa
5555
this.taskManager = taskManager;
5656
}
5757

58-
public final ActionFuture<Response> execute(Request request) {
59-
PlainActionFuture<Response> future = newFuture();
60-
execute(request, future);
61-
return future;
62-
}
63-
6458
/**
6559
* Use this method when the transport action call should result in creation of a new task associated with the call.
6660
*

server/src/main/java/org/elasticsearch/gateway/TransportNodesListGatewayMetaState.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.elasticsearch.action.ActionFuture;
2424
import org.elasticsearch.action.FailedNodeException;
2525
import org.elasticsearch.action.support.ActionFilters;
26+
import org.elasticsearch.action.support.PlainActionFuture;
2627
import org.elasticsearch.action.support.nodes.BaseNodeRequest;
2728
import org.elasticsearch.action.support.nodes.BaseNodeResponse;
2829
import org.elasticsearch.action.support.nodes.BaseNodesRequest;
@@ -65,7 +66,9 @@ public TransportNodesListGatewayMetaState(Settings settings, ThreadPool threadPo
6566
}
6667

6768
public ActionFuture<NodesGatewayMetaState> list(String[] nodesIds, @Nullable TimeValue timeout) {
68-
return execute(new Request(nodesIds).timeout(timeout));
69+
PlainActionFuture<NodesGatewayMetaState> future = PlainActionFuture.newFuture();
70+
execute(new Request(nodesIds).timeout(timeout), future);
71+
return future;
6972
}
7073

7174
@Override

server/src/test/java/org/elasticsearch/action/admin/cluster/node/tasks/CancellableTasksTests.java

Lines changed: 20 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.elasticsearch.action.admin.cluster.node.tasks.cancel.CancelTasksResponse;
2626
import org.elasticsearch.action.admin.cluster.node.tasks.list.ListTasksRequest;
2727
import org.elasticsearch.action.admin.cluster.node.tasks.list.ListTasksResponse;
28+
import org.elasticsearch.action.support.ActionTestUtils;
2829
import org.elasticsearch.action.support.nodes.BaseNodeRequest;
2930
import org.elasticsearch.action.support.nodes.BaseNodesRequest;
3031
import org.elasticsearch.action.support.replication.ClusterStateCreationUtils;
@@ -254,8 +255,8 @@ public void onFailure(Exception e) {
254255
request.setReason("Testing Cancellation");
255256
request.setTaskId(new TaskId(testNodes[0].getNodeId(), mainTask.getId()));
256257
// And send the cancellation request to a random node
257-
CancelTasksResponse response = testNodes[randomIntBetween(0, testNodes.length - 1)].transportCancelTasksAction.execute(request)
258-
.get();
258+
CancelTasksResponse response = ActionTestUtils.executeBlocking(
259+
testNodes[randomIntBetween(0, testNodes.length - 1)].transportCancelTasksAction, request);
259260

260261
// Awaiting for the main task to finish
261262
responseLatch.await();
@@ -287,9 +288,9 @@ public void onFailure(Exception e) {
287288
}
288289

289290
// Make sure that tasks are no longer running
290-
ListTasksResponse listTasksResponse = testNodes[randomIntBetween(0, testNodes.length - 1)]
291-
.transportListTasksAction.execute(new ListTasksRequest().setTaskId(
292-
new TaskId(testNodes[0].getNodeId(), mainTask.getId()))).get();
291+
ListTasksResponse listTasksResponse = ActionTestUtils.executeBlocking(
292+
testNodes[randomIntBetween(0, testNodes.length - 1)].transportListTasksAction,
293+
new ListTasksRequest().setTaskId(new TaskId(testNodes[0].getNodeId(), mainTask.getId())));
293294
assertEquals(0, listTasksResponse.getTasks().size());
294295

295296
// Make sure that there are no leftover bans, the ban removal is async, so we might return from the cancellation
@@ -326,8 +327,8 @@ public void onFailure(Exception e) {
326327
request.setReason("Testing Cancellation");
327328
request.setParentTaskId(new TaskId(testNodes[0].getNodeId(), mainTask.getId()));
328329
// And send the cancellation request to a random node
329-
CancelTasksResponse response = testNodes[randomIntBetween(1, testNodes.length - 1)].transportCancelTasksAction.execute(request)
330-
.get();
330+
CancelTasksResponse response = ActionTestUtils.executeBlocking(
331+
testNodes[randomIntBetween(1, testNodes.length - 1)].transportCancelTasksAction, request);
331332

332333
// Awaiting for the main task to finish
333334
responseLatch.await();
@@ -336,16 +337,11 @@ public void onFailure(Exception e) {
336337
assertThat(response.getTasks().size(), equalTo(testNodes.length));
337338

338339
assertBusy(() -> {
339-
try {
340340
// Make sure that main task is no longer running
341-
ListTasksResponse listTasksResponse = testNodes[randomIntBetween(0, testNodes.length - 1)]
342-
.transportListTasksAction.execute(new ListTasksRequest().setTaskId(
343-
new TaskId(testNodes[0].getNodeId(), mainTask.getId()))).get();
344-
assertEquals(0, listTasksResponse.getTasks().size());
345-
346-
} catch (ExecutionException | InterruptedException ex) {
347-
throw new RuntimeException(ex);
348-
}
341+
ListTasksResponse listTasksResponse = ActionTestUtils.executeBlocking(
342+
testNodes[randomIntBetween(0, testNodes.length - 1)].transportListTasksAction,
343+
new ListTasksRequest().setTaskId(new TaskId(testNodes[0].getNodeId(), mainTask.getId())));
344+
assertEquals(0, listTasksResponse.getTasks().size());
349345
});
350346
}
351347

@@ -378,8 +374,9 @@ public void onFailure(Exception e) {
378374
String mainNode = testNodes[0].getNodeId();
379375

380376
// Make sure that tasks are running
381-
ListTasksResponse listTasksResponse = testNodes[randomIntBetween(0, testNodes.length - 1)]
382-
.transportListTasksAction.execute(new ListTasksRequest().setParentTaskId(new TaskId(mainNode, mainTask.getId()))).get();
377+
ListTasksResponse listTasksResponse = ActionTestUtils.executeBlocking(
378+
testNodes[randomIntBetween(0, testNodes.length - 1)].transportListTasksAction,
379+
new ListTasksRequest().setParentTaskId(new TaskId(mainNode, mainTask.getId())));
383380
assertThat(listTasksResponse.getTasks().size(), greaterThanOrEqualTo(blockOnNodes.size()));
384381

385382
// Simulate the coordinating node leaving the cluster
@@ -400,7 +397,7 @@ public void onFailure(Exception e) {
400397
request.setReason("Testing Cancellation");
401398
request.setTaskId(new TaskId(testNodes[0].getNodeId(), mainTask.getId()));
402399
// And send the cancellation request to a random node
403-
CancelTasksResponse response = testNodes[0].transportCancelTasksAction.execute(request).get();
400+
CancelTasksResponse response = ActionTestUtils.executeBlocking(testNodes[0].transportCancelTasksAction, request);
404401
logger.info("--> Done simulating issuing cancel request on the node that is about to leave the cluster");
405402
// This node still thinks that's part of the cluster, so cancelling should look successful
406403
if (response.getTasks().size() == 0) {
@@ -420,15 +417,10 @@ public void onFailure(Exception e) {
420417

421418
assertBusy(() -> {
422419
// Make sure that tasks are no longer running
423-
try {
424-
ListTasksResponse listTasksResponse1 = testNodes[randomIntBetween(1, testNodes.length - 1)]
425-
.transportListTasksAction.execute(new ListTasksRequest().setTaskId(new TaskId(mainNode, mainTask.getId()))).get();
426-
assertEquals(0, listTasksResponse1.getTasks().size());
427-
} catch (InterruptedException ex) {
428-
Thread.currentThread().interrupt();
429-
} catch (ExecutionException ex2) {
430-
fail("shouldn't be here");
431-
}
420+
ListTasksResponse listTasksResponse1 = ActionTestUtils.executeBlocking(
421+
testNodes[randomIntBetween(1, testNodes.length - 1)].transportListTasksAction,
422+
new ListTasksRequest().setTaskId(new TaskId(mainNode, mainTask.getId())));
423+
assertEquals(0, listTasksResponse1.getTasks().size());
432424
});
433425

434426
// Wait for clean up

server/src/test/java/org/elasticsearch/action/admin/cluster/node/tasks/TransportTasksActionTests.java

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919
package org.elasticsearch.action.admin.cluster.node.tasks;
2020

21+
import org.elasticsearch.action.Action;
2122
import org.elasticsearch.action.ActionFuture;
2223
import org.elasticsearch.action.ActionListener;
2324
import org.elasticsearch.action.FailedNodeException;
@@ -29,6 +30,7 @@
2930
import org.elasticsearch.action.admin.cluster.node.tasks.list.ListTasksResponse;
3031
import org.elasticsearch.action.admin.cluster.node.tasks.list.TaskGroup;
3132
import org.elasticsearch.action.support.ActionFilters;
33+
import org.elasticsearch.action.support.ActionTestUtils;
3234
import org.elasticsearch.action.support.PlainActionFuture;
3335
import org.elasticsearch.action.support.nodes.BaseNodeRequest;
3436
import org.elasticsearch.action.support.nodes.BaseNodesRequest;
@@ -363,7 +365,7 @@ public void onFailure(Exception e) {
363365
ListTasksRequest listTasksRequest = new ListTasksRequest();
364366
listTasksRequest.setActions("testAction*"); // pick all test actions
365367
logger.info("Listing currently running tasks using node [{}]", testNodeNum);
366-
ListTasksResponse response = testNode.transportListTasksAction.execute(listTasksRequest).get();
368+
ListTasksResponse response = ActionTestUtils.executeBlocking(testNode.transportListTasksAction, listTasksRequest);
367369
logger.info("Checking currently running tasks");
368370
assertEquals(testNodes.length, response.getPerNodeTasks().size());
369371

@@ -382,7 +384,7 @@ public void onFailure(Exception e) {
382384
testNode = testNodes[randomIntBetween(0, testNodes.length - 1)];
383385
listTasksRequest = new ListTasksRequest();
384386
listTasksRequest.setActions("testAction[n]"); // only pick node actions
385-
response = testNode.transportListTasksAction.execute(listTasksRequest).get();
387+
response = ActionTestUtils.executeBlocking(testNode.transportListTasksAction, listTasksRequest);
386388
assertEquals(testNodes.length, response.getPerNodeTasks().size());
387389
for (Map.Entry<String, List<TaskInfo>> entry : response.getPerNodeTasks().entrySet()) {
388390
assertEquals(1, entry.getValue().size());
@@ -396,7 +398,7 @@ public void onFailure(Exception e) {
396398

397399
// Check task counts using transport with detailed description
398400
listTasksRequest.setDetailed(true); // same request only with detailed description
399-
response = testNode.transportListTasksAction.execute(listTasksRequest).get();
401+
response = ActionTestUtils.executeBlocking(testNode.transportListTasksAction, listTasksRequest);
400402
assertEquals(testNodes.length, response.getPerNodeTasks().size());
401403
for (Map.Entry<String, List<TaskInfo>> entry : response.getPerNodeTasks().entrySet()) {
402404
assertEquals(1, entry.getValue().size());
@@ -405,7 +407,7 @@ public void onFailure(Exception e) {
405407

406408
// Make sure that the main task on coordinating node is the task that was returned to us by execute()
407409
listTasksRequest.setActions("testAction"); // only pick the main task
408-
response = testNode.transportListTasksAction.execute(listTasksRequest).get();
410+
response = ActionTestUtils.executeBlocking(testNode.transportListTasksAction, listTasksRequest);
409411
assertEquals(1, response.getTasks().size());
410412
assertEquals(mainTask.getId(), response.getTasks().get(0).getId());
411413

@@ -433,15 +435,15 @@ public void testFindChildTasks() throws Exception {
433435
// Get the parent task
434436
ListTasksRequest listTasksRequest = new ListTasksRequest();
435437
listTasksRequest.setActions("testAction");
436-
ListTasksResponse response = testNode.transportListTasksAction.execute(listTasksRequest).get();
438+
ListTasksResponse response = ActionTestUtils.executeBlocking(testNode.transportListTasksAction, listTasksRequest);
437439
assertEquals(1, response.getTasks().size());
438440
String parentNode = response.getTasks().get(0).getTaskId().getNodeId();
439441
long parentTaskId = response.getTasks().get(0).getId();
440442

441443
// Find tasks with common parent
442444
listTasksRequest = new ListTasksRequest();
443445
listTasksRequest.setParentTaskId(new TaskId(parentNode, parentTaskId));
444-
response = testNode.transportListTasksAction.execute(listTasksRequest).get();
446+
response = ActionTestUtils.executeBlocking(testNode.transportListTasksAction, listTasksRequest);
445447
assertEquals(testNodes.length, response.getTasks().size());
446448
for (TaskInfo task : response.getTasks()) {
447449
assertEquals("testAction[n]", task.getAction());
@@ -467,7 +469,7 @@ public void testTaskManagementOptOut() throws Exception {
467469
// Get the parent task
468470
ListTasksRequest listTasksRequest = new ListTasksRequest();
469471
listTasksRequest.setActions("testAction*");
470-
ListTasksResponse response = testNode.transportListTasksAction.execute(listTasksRequest).get();
472+
ListTasksResponse response = ActionTestUtils.executeBlocking(testNode.transportListTasksAction, listTasksRequest);
471473
assertEquals(0, response.getTasks().size());
472474

473475
// Release all tasks and wait for response
@@ -488,7 +490,7 @@ public void testTasksDescriptions() throws Exception {
488490
TestNode testNode = testNodes[randomIntBetween(0, testNodes.length - 1)];
489491
ListTasksRequest listTasksRequest = new ListTasksRequest();
490492
listTasksRequest.setActions("testAction[n]"); // only pick node actions
491-
ListTasksResponse response = testNode.transportListTasksAction.execute(listTasksRequest).get();
493+
ListTasksResponse response = ActionTestUtils.executeBlocking(testNode.transportListTasksAction, listTasksRequest);
492494
assertEquals(testNodes.length, response.getPerNodeTasks().size());
493495
for (Map.Entry<String, List<TaskInfo>> entry : response.getPerNodeTasks().entrySet()) {
494496
assertEquals(1, entry.getValue().size());
@@ -498,7 +500,7 @@ public void testTasksDescriptions() throws Exception {
498500
// Check task counts using transport with detailed description
499501
long minimalDurationNanos = System.nanoTime() - maximumStartTimeNanos;
500502
listTasksRequest.setDetailed(true); // same request only with detailed description
501-
response = testNode.transportListTasksAction.execute(listTasksRequest).get();
503+
response = ActionTestUtils.executeBlocking(testNode.transportListTasksAction, listTasksRequest);
502504
assertEquals(testNodes.length, response.getPerNodeTasks().size());
503505
for (Map.Entry<String, List<TaskInfo>> entry : response.getPerNodeTasks().entrySet()) {
504506
assertEquals(1, entry.getValue().size());
@@ -536,8 +538,8 @@ public void onFailure(Exception e) {
536538
request.setNodes(testNodes[0].getNodeId());
537539
request.setReason("Testing Cancellation");
538540
request.setActions(actionName);
539-
CancelTasksResponse response = testNodes[randomIntBetween(0, testNodes.length - 1)].transportCancelTasksAction.execute(request)
540-
.get();
541+
CancelTasksResponse response = ActionTestUtils.executeBlocking(
542+
testNodes[randomIntBetween(0, testNodes.length - 1)].transportCancelTasksAction, request);
541543

542544
// Shouldn't match any tasks since testAction doesn't support cancellation
543545
assertEquals(0, response.getTasks().size());
@@ -549,7 +551,8 @@ public void onFailure(Exception e) {
549551
request = new CancelTasksRequest();
550552
request.setReason("Testing Cancellation");
551553
request.setTaskId(new TaskId(testNodes[0].getNodeId(), task.getId()));
552-
response = testNodes[randomIntBetween(0, testNodes.length - 1)].transportCancelTasksAction.execute(request).get();
554+
response = ActionTestUtils.executeBlocking(
555+
testNodes[randomIntBetween(0, testNodes.length - 1)].transportCancelTasksAction, request);
553556

554557
// Shouldn't match any tasks since testAction doesn't support cancellation
555558
assertEquals(0, response.getTasks().size());
@@ -560,8 +563,8 @@ public void onFailure(Exception e) {
560563
// Make sure that task is still running
561564
ListTasksRequest listTasksRequest = new ListTasksRequest();
562565
listTasksRequest.setActions(actionName);
563-
ListTasksResponse listResponse = testNodes[randomIntBetween(0, testNodes.length - 1)].transportListTasksAction.execute
564-
(listTasksRequest).get();
566+
ListTasksResponse listResponse = ActionTestUtils.executeBlocking(
567+
testNodes[randomIntBetween(0, testNodes.length - 1)].transportListTasksAction, listTasksRequest);
565568
assertEquals(1, listResponse.getPerNodeTasks().size());
566569
// Verify that tasks are marked as non-cancellable
567570
for (TaskInfo taskInfo : listResponse.getTasks()) {
@@ -595,7 +598,7 @@ protected NodeResponse nodeOperation(NodeRequest request) {
595598
assertEquals(0, testNode.transportService.getTaskManager().getTasks().size());
596599
}
597600
NodesRequest request = new NodesRequest("Test Request");
598-
NodesResponse responses = actions[0].execute(request).get();
601+
NodesResponse responses = ActionTestUtils.executeBlocking(actions[0], request);
599602
assertEquals(nodesCount, responses.failureCount());
600603

601604
// Make sure that actions are still registered in the task manager on all nodes
@@ -660,7 +663,7 @@ protected void taskOperation(TestTasksRequest request, Task task, ActionListener
660663
// should be successful on all nodes except one
661664
TestTasksRequest testTasksRequest = new TestTasksRequest();
662665
testTasksRequest.setActions("testAction[n]"); // pick all test actions
663-
TestTasksResponse response = tasksActions[0].execute(testTasksRequest).get();
666+
TestTasksResponse response = ActionTestUtils.executeBlocking(tasksActions[0], testTasksRequest);
664667
assertThat(response.getTaskFailures(), hasSize(1)); // one task failed
665668
assertThat(response.getTaskFailures().get(0).getReason(), containsString("Task level failure"));
666669
// Get successful responses from all nodes except one
@@ -730,7 +733,7 @@ protected void taskOperation(TestTasksRequest request, Task task, ActionListener
730733
// should be successful on all nodes except nodes that we filtered out
731734
TestTasksRequest testTasksRequest = new TestTasksRequest();
732735
testTasksRequest.setActions("testAction[n]"); // pick all test actions
733-
TestTasksResponse response = tasksActions[randomIntBetween(0, nodesCount - 1)].execute(testTasksRequest).get();
736+
TestTasksResponse response = ActionTestUtils.executeBlocking(tasksActions[randomIntBetween(0, nodesCount - 1)], testTasksRequest);
734737

735738
// Get successful responses from all nodes except nodes that we filtered out
736739
assertEquals(testNodes.length - filterNodes.size(), response.tasks.size());
@@ -757,7 +760,7 @@ public void testTasksToXContentGrouping() throws Exception {
757760
// Get the parent task
758761
ListTasksRequest listTasksRequest = new ListTasksRequest();
759762
listTasksRequest.setActions(ListTasksAction.NAME + "*");
760-
ListTasksResponse response = testNodes[0].transportListTasksAction.execute(listTasksRequest).get();
763+
ListTasksResponse response = ActionTestUtils.executeBlocking(testNodes[0].transportListTasksAction, listTasksRequest);
761764
assertEquals(testNodes.length + 1, response.getTasks().size());
762765

763766
Map<String, Object> byNodes = serialize(response, true);

server/src/test/java/org/elasticsearch/action/search/TransportMultiSearchActionTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.elasticsearch.action.ActionListener;
2424
import org.elasticsearch.action.support.ActionFilter;
2525
import org.elasticsearch.action.support.ActionFilters;
26+
import org.elasticsearch.action.support.ActionTestUtils;
2627
import org.elasticsearch.action.support.TransportAction;
2728
import org.elasticsearch.cluster.ClusterName;
2829
import org.elasticsearch.cluster.ClusterState;
@@ -141,7 +142,7 @@ protected void doExecute(SearchRequest request, ActionListener<SearchResponse> l
141142
multiSearchRequest.add(new SearchRequest());
142143
}
143144

144-
MultiSearchResponse response = action.execute(multiSearchRequest).actionGet();
145+
MultiSearchResponse response = ActionTestUtils.executeBlocking(action, multiSearchRequest);
145146
assertThat(response.getResponses().length, equalTo(numSearchRequests));
146147
assertThat(requests.size(), equalTo(numSearchRequests));
147148
assertThat(errorHolder.get(), nullValue());

0 commit comments

Comments
 (0)