docs: public synchronized boolean addNode(final NodeConfig config, final Balancer.BalancerBuilder balancerConfig, final XnioIoThread ioThread, final ByteBufferPool bufferPool) {
  
          final String jvmRoute = config.getJvmRoute();
          final Node existing = nodes.get(jvmRoute);
          if (existing != null) {
              if (config.getConnectionURI().equals(existing.getNodeConfig().getConnectionURI())) {
                  // TODO better check if they are the same
                  existing.resetState();
                  return true;
              } else {
                  existing.markRemoved();
                  removeNode(existing);
                  if (!existing.isInErrorState()) {
                      return false; // replies with MNODERM error
                  }
              }
          }
  
          final String balancerRef = config.getBalancer();
          Balancer balancer = balancers.get(balancerRef);
          if (balancer != null) {
              UndertowLogger.ROOT_LOGGER.debugf("Balancer %s already exists, replacing", balancerRef);
          }
          balancer = balancerConfig.build();
          balancers.put(balancerRef, balancer);
  
          final Node node = new Node(config, balancer, ioThread, bufferPool, this);
          nodes.put(jvmRoute, node);
          // Schedule the health check
          scheduleHealthCheck(node, ioThread);
          // Reset the load factor periodically
          if (updateLoadTask.cancelKey == null) {
              updateLoadTask.cancelKey = ioThread.executeAtInterval(updateLoadTask, modCluster.getHealthCheckInterval(), TimeUnit.MILLISECONDS);
          }
          // Remove from the failover groups
          failoverDomains.remove(node.getJvmRoute());
          UndertowLogger.ROOT_LOGGER.registeringNode(jvmRoute, config.getConnectionURI());
          return true;
      }