|
@@ -24,6 +24,7 @@ import org.apache.logging.log4j.Logger;
|
|
|
import org.apache.logging.log4j.message.ParameterizedMessage;
|
|
|
import org.elasticsearch.Version;
|
|
|
import org.elasticsearch.action.ActionListener;
|
|
|
+import org.elasticsearch.action.ActionRunnable;
|
|
|
import org.elasticsearch.action.NotifyOnceListener;
|
|
|
import org.elasticsearch.cluster.node.DiscoveryNode;
|
|
|
import org.elasticsearch.common.Randomness;
|
|
@@ -37,7 +38,6 @@ import org.elasticsearch.core.internal.io.IOUtils;
|
|
|
import org.elasticsearch.discovery.PeerFinder.TransportAddressConnector;
|
|
|
import org.elasticsearch.transport.ConnectTransportException;
|
|
|
import org.elasticsearch.transport.ConnectionProfile;
|
|
|
-import org.elasticsearch.transport.Transport.Connection;
|
|
|
import org.elasticsearch.transport.TransportRequestOptions.Type;
|
|
|
import org.elasticsearch.transport.TransportService;
|
|
|
|
|
@@ -69,7 +69,7 @@ public class HandshakingTransportAddressConnector implements TransportAddressCon
|
|
|
|
|
|
@Override
|
|
|
public void connectToRemoteMasterNode(TransportAddress transportAddress, ActionListener<DiscoveryNode> listener) {
|
|
|
- transportService.getThreadPool().generic().execute(new AbstractRunnable() {
|
|
|
+ transportService.getThreadPool().generic().execute(new ActionRunnable<>(listener) {
|
|
|
private final AbstractRunnable thisConnectionAttempt = this;
|
|
|
|
|
|
@Override
|
|
@@ -84,71 +84,52 @@ public class HandshakingTransportAddressConnector implements TransportAddressCon
|
|
|
logger.trace("[{}] opening probe connection", thisConnectionAttempt);
|
|
|
transportService.openConnection(targetNode,
|
|
|
ConnectionProfile.buildSingleChannelProfile(Type.REG, probeConnectTimeout, probeHandshakeTimeout,
|
|
|
- TimeValue.MINUS_ONE, null), new ActionListener<>() {
|
|
|
- @Override
|
|
|
- public void onResponse(Connection connection) {
|
|
|
- logger.trace("[{}] opened probe connection", thisConnectionAttempt);
|
|
|
-
|
|
|
- // use NotifyOnceListener to make sure the following line does not result in onFailure being called when
|
|
|
- // the connection is closed in the onResponse handler
|
|
|
- transportService.handshake(connection, probeHandshakeTimeout.millis(), new NotifyOnceListener<DiscoveryNode>() {
|
|
|
-
|
|
|
- @Override
|
|
|
- protected void innerOnResponse(DiscoveryNode remoteNode) {
|
|
|
- try {
|
|
|
- // success means (amongst other things) that the cluster names match
|
|
|
- logger.trace("[{}] handshake successful: {}", thisConnectionAttempt, remoteNode);
|
|
|
- IOUtils.closeWhileHandlingException(connection);
|
|
|
-
|
|
|
- if (remoteNode.equals(transportService.getLocalNode())) {
|
|
|
- // TODO cache this result for some time? forever?
|
|
|
- listener.onFailure(new ConnectTransportException(remoteNode, "local node found"));
|
|
|
- } else if (remoteNode.isMasterNode() == false) {
|
|
|
- // TODO cache this result for some time?
|
|
|
- listener.onFailure(new ConnectTransportException(remoteNode, "non-master-eligible node found"));
|
|
|
- } else {
|
|
|
- transportService.connectToNode(remoteNode, new ActionListener<Void>() {
|
|
|
- @Override
|
|
|
- public void onResponse(Void ignored) {
|
|
|
- logger.trace("[{}] full connection successful: {}", thisConnectionAttempt, remoteNode);
|
|
|
- listener.onResponse(remoteNode);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void onFailure(Exception e) {
|
|
|
- listener.onFailure(e);
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
- } catch (Exception e) {
|
|
|
- listener.onFailure(e);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- protected void innerOnFailure(Exception e) {
|
|
|
- // we opened a connection and successfully performed a low-level handshake, so we were definitely
|
|
|
- // talking to an Elasticsearch node, but the high-level handshake failed indicating some kind of
|
|
|
- // mismatched configurations (e.g. cluster name) that the user should address
|
|
|
- logger.warn(new ParameterizedMessage("handshake failed for [{}]", thisConnectionAttempt), e);
|
|
|
+ TimeValue.MINUS_ONE, null), ActionListener.delegateFailure(listener, (l, connection) -> {
|
|
|
+ logger.trace("[{}] opened probe connection", thisConnectionAttempt);
|
|
|
+
|
|
|
+ // use NotifyOnceListener to make sure the following line does not result in onFailure being called when
|
|
|
+ // the connection is closed in the onResponse handler
|
|
|
+ transportService.handshake(connection, probeHandshakeTimeout.millis(), new NotifyOnceListener<>() {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void innerOnResponse(DiscoveryNode remoteNode) {
|
|
|
+ try {
|
|
|
+ // success means (amongst other things) that the cluster names match
|
|
|
+ logger.trace("[{}] handshake successful: {}", thisConnectionAttempt, remoteNode);
|
|
|
IOUtils.closeWhileHandlingException(connection);
|
|
|
+
|
|
|
+ if (remoteNode.equals(transportService.getLocalNode())) {
|
|
|
+ // TODO cache this result for some time? forever?
|
|
|
+ listener.onFailure(new ConnectTransportException(remoteNode, "local node found"));
|
|
|
+ } else if (remoteNode.isMasterNode() == false) {
|
|
|
+ // TODO cache this result for some time?
|
|
|
+ listener.onFailure(new ConnectTransportException(remoteNode, "non-master-eligible node found"));
|
|
|
+ } else {
|
|
|
+ transportService.connectToNode(remoteNode, ActionListener.delegateFailure(listener,
|
|
|
+ (l, ignored) -> {
|
|
|
+ logger.trace("[{}] full connection successful: {}", thisConnectionAttempt, remoteNode);
|
|
|
+ listener.onResponse(remoteNode);
|
|
|
+ }));
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
listener.onFailure(e);
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- });
|
|
|
+ @Override
|
|
|
+ protected void innerOnFailure(Exception e) {
|
|
|
+ // we opened a connection and successfully performed a low-level handshake, so we were definitely
|
|
|
+ // talking to an Elasticsearch node, but the high-level handshake failed indicating some kind of
|
|
|
+ // mismatched configurations (e.g. cluster name) that the user should address
|
|
|
+ logger.warn(new ParameterizedMessage("handshake failed for [{}]", thisConnectionAttempt), e);
|
|
|
+ IOUtils.closeWhileHandlingException(connection);
|
|
|
+ listener.onFailure(e);
|
|
|
+ }
|
|
|
|
|
|
- }
|
|
|
+ });
|
|
|
|
|
|
- @Override
|
|
|
- public void onFailure(Exception e) {
|
|
|
- listener.onFailure(e);
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
+ }));
|
|
|
|
|
|
- @Override
|
|
|
- public void onFailure(Exception e) {
|
|
|
- listener.onFailure(e);
|
|
|
}
|
|
|
|
|
|
@Override
|