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.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
});
}
}
}
}