Introduce inner class AsyncSingleAction to store state used across retry invocations

This commit is contained in:
Yannick Welsch 2015-10-20 10:47:54 +02:00
parent af3b126a15
commit c6b41bc704

View File

@ -32,6 +32,7 @@ import org.elasticsearch.cluster.ClusterStateObserver;
import org.elasticsearch.cluster.block.ClusterBlockException; import org.elasticsearch.cluster.block.ClusterBlockException;
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
import org.elasticsearch.cluster.node.DiscoveryNodes; import org.elasticsearch.cluster.node.DiscoveryNodes;
import org.elasticsearch.cluster.routing.ShardIterator;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.discovery.MasterNotDiscoveredException; import org.elasticsearch.discovery.MasterNotDiscoveredException;
@ -81,14 +82,30 @@ public abstract class TransportMasterNodeAction<Request extends MasterNodeReques
@Override @Override
protected void doExecute(final Request request, ActionListener<Response> listener) { 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 // TODO do we really need to wrap it in a listener? the handlers should be cheap
if ((listener instanceof ThreadedActionListener) == false) { if ((listener instanceof ThreadedActionListener) == false) {
listener = new ThreadedActionListener<>(logger, threadPool, ThreadPool.Names.LISTENER, listener); 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 ClusterState clusterState = observer.observedState();
final DiscoveryNodes nodes = clusterState.nodes(); final DiscoveryNodes nodes = clusterState.nodes();
if (nodes.localNodeMaster() || localExecute(request)) { if (nodes.localNodeMaster() || localExecute(request)) {
@ -104,7 +121,7 @@ public abstract class TransportMasterNodeAction<Request extends MasterNodeReques
new ClusterStateObserver.Listener() { new ClusterStateObserver.Listener() {
@Override @Override
public void onNewClusterState(ClusterState state) { public void onNewClusterState(ClusterState state) {
innerExecute(request, listener, observer, false); doStart(false);
} }
@Override @Override
@ -143,7 +160,7 @@ public abstract class TransportMasterNodeAction<Request extends MasterNodeReques
new ClusterStateObserver.Listener() { new ClusterStateObserver.Listener() {
@Override @Override
public void onNewClusterState(ClusterState state) { public void onNewClusterState(ClusterState state) {
innerExecute(request, listener, observer, true); doStart(true);
} }
@Override @Override
@ -197,7 +214,7 @@ public abstract class TransportMasterNodeAction<Request extends MasterNodeReques
observer.waitForNextChange(new ClusterStateObserver.Listener() { observer.waitForNextChange(new ClusterStateObserver.Listener() {
@Override @Override
public void onNewClusterState(ClusterState state) { public void onNewClusterState(ClusterState state) {
innerExecute(request, listener, observer, false); doStart(false);
} }
@Override @Override
@ -223,4 +240,5 @@ public abstract class TransportMasterNodeAction<Request extends MasterNodeReques
}); });
} }
} }
}
} }