Skip to content

Commit 94e60dd

Browse files
author
Andrey Ershov
committed
Use GroupedActionListener
1 parent c2e24f2 commit 94e60dd

File tree

1 file changed

+38
-27
lines changed

1 file changed

+38
-27
lines changed

server/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/get/TransportGetSnapshotsAction.java

Lines changed: 38 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020
package org.elasticsearch.action.admin.cluster.snapshots.get;
2121

22-
import org.apache.logging.log4j.core.util.Throwables;
2322
import org.apache.lucene.util.CollectionUtil;
2423
import org.elasticsearch.ElasticsearchException;
2524
import org.elasticsearch.action.ActionListener;
@@ -28,13 +27,15 @@
2827
import org.elasticsearch.action.admin.cluster.repositories.get.GetRepositoriesRequest;
2928
import org.elasticsearch.action.admin.cluster.repositories.get.GetRepositoriesResponse;
3029
import org.elasticsearch.action.support.ActionFilters;
30+
import org.elasticsearch.action.support.GroupedActionListener;
3131
import org.elasticsearch.action.support.master.TransportMasterNodeAction;
3232
import org.elasticsearch.cluster.ClusterState;
3333
import org.elasticsearch.cluster.block.ClusterBlockException;
3434
import org.elasticsearch.cluster.block.ClusterBlockLevel;
3535
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
3636
import org.elasticsearch.cluster.metadata.RepositoryMetaData;
3737
import org.elasticsearch.cluster.service.ClusterService;
38+
import org.elasticsearch.common.collect.Tuple;
3839
import org.elasticsearch.common.inject.Inject;
3940
import org.elasticsearch.common.regex.Regex;
4041
import org.elasticsearch.repositories.IndexId;
@@ -50,11 +51,10 @@
5051
import java.util.Collections;
5152
import java.util.HashMap;
5253
import java.util.HashSet;
54+
import java.util.Iterator;
5355
import java.util.List;
5456
import java.util.Map;
5557
import java.util.Set;
56-
import java.util.concurrent.ExecutionException;
57-
import java.util.concurrent.Future;
5858
import java.util.stream.Collectors;
5959

6060
/**
@@ -106,34 +106,45 @@ protected void masterOperation(final GetSnapshotsRequest request, final ClusterS
106106

107107
private void getMultipleReposSnapshotInfo(List<RepositoryMetaData> repos, String[] snapshots, boolean ignoreUnavailable,
108108
boolean verbose, ActionListener<GetSnapshotsResponse> listener) {
109-
List<Future<List<SnapshotInfo>>> futures = new ArrayList<>(repos.size());
109+
GroupedActionListener<Tuple<String, Tuple<List<SnapshotInfo>, ElasticsearchException>>> groupedActionListener =
110+
new GroupedActionListener<>(
111+
ActionListener.map(listener, responses -> {
112+
assert repos.size() == responses.size();
113+
114+
Map<String, List<SnapshotInfo>> successfulResponses = new HashMap<>();
115+
Map<String, ElasticsearchException> failedResponses = new HashMap<>();
116+
117+
Iterator<Tuple<String, Tuple<List<SnapshotInfo>, ElasticsearchException>>> it = responses.iterator();
118+
119+
while (it.hasNext()) {
120+
Tuple<String, Tuple<List<SnapshotInfo>, ElasticsearchException>> response = it.next();
121+
String repo = response.v1();
122+
Tuple<List<SnapshotInfo>, ElasticsearchException> result = response.v2();
123+
if (result.v1() != null) {
124+
assert result.v2() == null;
125+
successfulResponses.put(repo, result.v1());
126+
} else {
127+
assert result.v2() != null;
128+
failedResponses.put(repo, result.v2());
129+
}
130+
}
131+
132+
return new GetSnapshotsResponse(successfulResponses, failedResponses);
133+
}), repos.size());
110134

111135
// run concurrently for all repos on GENERIC thread pool
112136
for (final RepositoryMetaData repo : repos) {
113-
futures.add(threadPool.executor(ThreadPool.Names.GENERIC).submit(
114-
() -> getSingleRepoSnapshotInfo(repo.name(), snapshots, ignoreUnavailable, verbose)));
115-
}
116-
assert repos.size() == futures.size();
117-
118-
Map<String, List<SnapshotInfo>> successfulResponses = new HashMap<>();
119-
Map<String, ElasticsearchException> failedResponses = new HashMap<>();
120-
121-
for (int i = 0; i < repos.size(); i++) {
122-
final String repo = repos.get(i).name();
123-
try {
124-
successfulResponses.put(repo, futures.get(i).get());
125-
} catch (InterruptedException e) {
126-
Throwables.rethrow(e);
127-
} catch (ExecutionException e) {
128-
if (e.getCause() instanceof ElasticsearchException) {
129-
failedResponses.put(repo, (ElasticsearchException) e.getCause());
130-
} else {
131-
Throwables.rethrow(e);
132-
}
133-
}
137+
threadPool.executor(ThreadPool.Names.GENERIC).execute(
138+
() -> {
139+
// Unfortunately, there is no Either in Java, so we use Tuple with only one value set
140+
try {
141+
groupedActionListener.onResponse(Tuple.tuple(repo.name(),
142+
Tuple.tuple(getSingleRepoSnapshotInfo(repo.name(), snapshots, ignoreUnavailable, verbose), null)));
143+
} catch (ElasticsearchException e) {
144+
groupedActionListener.onResponse(Tuple.tuple(repo.name(), Tuple.tuple(null, e)));
145+
}
146+
});
134147
}
135-
136-
listener.onResponse(new GetSnapshotsResponse(successfulResponses, failedResponses));
137148
}
138149

139150
private List<SnapshotInfo> getSingleRepoSnapshotInfo(String repo, String[] snapshots, boolean ignoreUnavailable, boolean verbose) {

0 commit comments

Comments
 (0)