in core/src/main/java/com/datastax/oss/driver/internal/core/metadata/NodeStateManager.java [172:262]
private void onDebouncedTopologyEvent(TopologyEvent event) {
assert adminExecutor.inEventLoop();
if (closeWasCalled) {
return;
}
LOG.debug("[{}] Processing {}", logPrefix, event);
Optional<Node> maybeNode = metadataManager.getMetadata().findNode(event.broadcastRpcAddress);
switch (event.type) {
case SUGGEST_UP:
if (maybeNode.isPresent()) {
DefaultNode node = (DefaultNode) maybeNode.get();
if (node.state == NodeState.FORCED_DOWN) {
LOG.debug("[{}] Not setting {} UP because it is FORCED_DOWN", logPrefix, node);
} else if (node.distance == NodeDistance.IGNORED) {
setState(node, NodeState.UP, "it is IGNORED and an UP topology event was received");
}
} else {
LOG.debug(
"[{}] Received UP event for unknown node {}, refreshing node list",
logPrefix,
event.broadcastRpcAddress);
metadataManager.refreshNodes();
}
break;
case SUGGEST_DOWN:
if (maybeNode.isPresent()) {
DefaultNode node = (DefaultNode) maybeNode.get();
if (node.openConnections > 0) {
LOG.debug(
"[{}] Not setting {} DOWN because it still has active connections",
logPrefix,
node);
} else if (node.state == NodeState.FORCED_DOWN) {
LOG.debug("[{}] Not setting {} DOWN because it is FORCED_DOWN", logPrefix, node);
} else if (node.distance == NodeDistance.IGNORED) {
setState(
node, NodeState.DOWN, "it is IGNORED and a DOWN topology event was received");
}
} else {
LOG.debug(
"[{}] Received DOWN event for unknown node {}, ignoring it",
logPrefix,
event.broadcastRpcAddress);
}
break;
case FORCE_UP:
if (maybeNode.isPresent()) {
DefaultNode node = (DefaultNode) maybeNode.get();
setState(node, NodeState.UP, "a FORCE_UP topology event was received");
} else {
LOG.debug(
"[{}] Received FORCE_UP event for unknown node {}, adding it",
logPrefix,
event.broadcastRpcAddress);
metadataManager.addNode(event.broadcastRpcAddress);
}
break;
case FORCE_DOWN:
if (maybeNode.isPresent()) {
DefaultNode node = (DefaultNode) maybeNode.get();
setState(node, NodeState.FORCED_DOWN, "a FORCE_DOWN topology event was received");
} else {
LOG.debug(
"[{}] Received FORCE_DOWN event for unknown node {}, ignoring it",
logPrefix,
event.broadcastRpcAddress);
}
break;
case SUGGEST_ADDED:
if (maybeNode.isPresent()) {
DefaultNode node = (DefaultNode) maybeNode.get();
LOG.debug(
"[{}] Received ADDED event for {} but it is already in our metadata, ignoring",
logPrefix,
node);
} else {
metadataManager.addNode(event.broadcastRpcAddress);
}
break;
case SUGGEST_REMOVED:
if (maybeNode.isPresent()) {
metadataManager.removeNode(event.broadcastRpcAddress);
} else {
LOG.debug(
"[{}] Received REMOVED event for {} but it is not in our metadata, ignoring",
logPrefix,
event.broadcastRpcAddress);
}
break;
}
}