in modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java [5782:5933]
private void processStatusCheckMessage(final TcpDiscoveryStatusCheckMessage msg) {
assert msg != null;
UUID locNodeId = getLocalNodeId();
if (msg.failedNodeId() != null) {
if (locNodeId.equals(msg.failedNodeId())) {
if (log.isDebugEnabled())
log.debug("Status check message discarded (suspect node is local node).");
return;
}
if (locNodeId.equals(msg.creatorNodeId()) && msg.senderNodeId() != null) {
if (log.isDebugEnabled())
log.debug("Status check message discarded (local node is the sender of the status message).");
return;
}
if (isLocalNodeCoordinator() && ring.node(msg.creatorNodeId()) == null) {
if (log.isDebugEnabled())
log.debug("Status check message discarded (creator node is not in topology).");
return;
}
}
else {
if (isLocalNodeCoordinator() && !locNodeId.equals(msg.creatorNodeId())) {
// Local node is real coordinator, it should respond and discard message.
if (ring.node(msg.creatorNodeId()) != null) {
// Sender is in topology, send message via ring.
msg.status(STATUS_OK);
sendMessageAcrossRing(msg);
}
else {
// Sender is not in topology, it should reconnect.
msg.status(STATUS_RECON);
utilityPool.execute(new Runnable() {
@Override public void run() {
synchronized (mux) {
if (spiState == DISCONNECTED) {
if (log.isDebugEnabled())
log.debug("Ignoring status check request, SPI is already disconnected: " + msg);
return;
}
}
TcpDiscoveryStatusCheckMessage msg0 = msg;
if (F.contains(msg.failedNodes(), msg.creatorNodeId())) {
msg0 = createTcpDiscoveryStatusCheckMessage(
msg.creatorNode(),
msg.creatorNodeId(),
msg.failedNodeId());
if (msg0 == null) {
log.debug("Status check message discarded (creator node is not in topology).");
return;
}
msg0.failedNodes(null);
for (UUID failedNodeId : msg.failedNodes()) {
if (!failedNodeId.equals(msg.creatorNodeId()))
msg0.addFailedNode(failedNodeId);
}
}
try {
trySendMessageDirectly(msg0.creatorNodeAddrs(), msg0.creatorNodeId(), msg0);
if (log.isDebugEnabled())
log.debug("Responded to status check message " +
"[recipient=" + msg0.creatorNodeId() + ", status=" + msg0.status() + ']');
}
catch (IgniteSpiException e) {
if (e.hasCause(SocketException.class)) {
if (log.isDebugEnabled())
log.debug("Failed to respond to status check message (connection " +
"refused) [recipient=" + msg0.creatorNodeId() + ", status=" +
msg0.status() + ']');
onException("Failed to respond to status check message (connection refused) " +
"[recipient=" + msg0.creatorNodeId() + ", status=" + msg0.status() + ']', e);
}
else if (!spi.isNodeStopping0()) {
if (pingNode(msg0.creatorNodeId())) {
// Node exists and accepts incoming connections.
U.error(log, "Failed to respond to status check message [recipient=" +
msg0.creatorNodeId() + ", status=" + msg0.status() + ']', e);
}
else if (log.isDebugEnabled()) {
log.debug("Failed to respond to status check message (did the node stop?)" +
"[recipient=" + msg0.creatorNodeId() +
", status=" + msg0.status() + ']');
}
}
}
}
});
}
return;
}
if (locNodeId.equals(msg.creatorNodeId()) && msg.senderNodeId() == null &&
U.millisSinceNanos(locNode.lastUpdateTimeNanos()) < spi.metricsUpdateFreq) {
if (log.isDebugEnabled())
log.debug("Status check message discarded (local node receives updates).");
return;
}
if (locNodeId.equals(msg.creatorNodeId()) && msg.senderNodeId() == null &&
spiStateCopy() != CONNECTED) {
if (log.isDebugEnabled())
log.debug("Status check message discarded (local node is not connected to topology).");
return;
}
if (locNodeId.equals(msg.creatorNodeId()) && msg.senderNodeId() != null) {
if (spiStateCopy() != CONNECTED)
return;
if (msg.status() == STATUS_OK) {
if (log.isDebugEnabled())
log.debug("Received OK status response from coordinator: " + msg);
}
else if (msg.status() == STATUS_RECON) {
U.warn(log, "Node is out of topology (probably, due to short-time network problems).");
notifyDiscovery(EVT_NODE_SEGMENTED, ring.topologyVersion(), locNode);
return;
}
else if (log.isDebugEnabled())
log.debug("Status value was not updated in status response: " + msg);
// Discard the message.
return;
}
}
if (sendMessageToRemotes(msg))
sendMessageAcrossRing(msg);
}