mirror of
https://github.com/honeymoose/OpenSearch.git
synced 2025-03-03 17:39:15 +00:00
Introduce inner class AsyncSingleAction to store state used across retry invocations
This commit is contained in:
parent
af3b126a15
commit
c6b41bc704
@ -32,6 +32,7 @@ import org.elasticsearch.cluster.ClusterStateObserver;
|
||||
import org.elasticsearch.cluster.block.ClusterBlockException;
|
||||
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
|
||||
import org.elasticsearch.cluster.node.DiscoveryNodes;
|
||||
import org.elasticsearch.cluster.routing.ShardIterator;
|
||||
import org.elasticsearch.common.settings.Settings;
|
||||
import org.elasticsearch.common.unit.TimeValue;
|
||||
import org.elasticsearch.discovery.MasterNotDiscoveredException;
|
||||
@ -81,14 +82,30 @@ public abstract class TransportMasterNodeAction<Request extends MasterNodeReques
|
||||
|
||||
@Override
|
||||
protected void doExecute(final Request request, ActionListener<Response> listener) {
|
||||
new AsyncSingleAction(request, listener).start();
|
||||
}
|
||||
|
||||
class AsyncSingleAction {
|
||||
|
||||
private final ActionListener<Response> listener;
|
||||
private final Request request;
|
||||
private volatile ClusterStateObserver observer;
|
||||
|
||||
AsyncSingleAction(Request request, ActionListener<Response> listener) {
|
||||
this.request = request;
|
||||
// TODO do we really need to wrap it in a listener? the handlers should be cheap
|
||||
if ((listener instanceof ThreadedActionListener) == false) {
|
||||
listener = new ThreadedActionListener<>(logger, threadPool, ThreadPool.Names.LISTENER, listener);
|
||||
}
|
||||
innerExecute(request, listener, new ClusterStateObserver(clusterService, request.masterNodeTimeout(), logger), false);
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
private void innerExecute(final Request request, final ActionListener<Response> listener, final ClusterStateObserver observer, final boolean retrying) {
|
||||
public void start() {
|
||||
this.observer = new ClusterStateObserver(clusterService, request.masterNodeTimeout(), logger);
|
||||
doStart(false);
|
||||
}
|
||||
|
||||
protected void doStart(boolean retrying) {
|
||||
final ClusterState clusterState = observer.observedState();
|
||||
final DiscoveryNodes nodes = clusterState.nodes();
|
||||
if (nodes.localNodeMaster() || localExecute(request)) {
|
||||
@ -104,7 +121,7 @@ public abstract class TransportMasterNodeAction<Request extends MasterNodeReques
|
||||
new ClusterStateObserver.Listener() {
|
||||
@Override
|
||||
public void onNewClusterState(ClusterState state) {
|
||||
innerExecute(request, listener, observer, false);
|
||||
doStart(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -143,7 +160,7 @@ public abstract class TransportMasterNodeAction<Request extends MasterNodeReques
|
||||
new ClusterStateObserver.Listener() {
|
||||
@Override
|
||||
public void onNewClusterState(ClusterState state) {
|
||||
innerExecute(request, listener, observer, true);
|
||||
doStart(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -197,7 +214,7 @@ public abstract class TransportMasterNodeAction<Request extends MasterNodeReques
|
||||
observer.waitForNextChange(new ClusterStateObserver.Listener() {
|
||||
@Override
|
||||
public void onNewClusterState(ClusterState state) {
|
||||
innerExecute(request, listener, observer, false);
|
||||
doStart(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -223,4 +240,5 @@ public abstract class TransportMasterNodeAction<Request extends MasterNodeReques
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user