private void onDebouncedTopologyEvent()

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