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.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
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user