code: protected void queueReconnect(final MemcachedNode node) {
      if (shutDown) {
        return;
      }
      getLogger().warn("Closing, and reopening %s, attempt %d.", node,
        node.getReconnectCount());
  
      if (node.getSk() != null) {
        node.getSk().cancel();
        assert !node.getSk().isValid() : "Cancelled selection key is valid";
      }
      node.reconnecting();
  
      try {
        if (node.getChannel() != null && node.getChannel().socket() != null) {
          node.getChannel().socket().close();
        } else {
          getLogger().info("The channel or socket was null for %s", node);
        }
      } catch (IOException e) {
        getLogger().warn("IOException trying to close a socket", e);
      }
      node.setChannel(null);
  
      long delay = (long) Math.min(maxDelay, Math.pow(2,
          node.getReconnectCount()) * 1000);
      long reconnectTime = System.currentTimeMillis() + delay;
      while (reconnectQueue.containsKey(reconnectTime)) {
        reconnectTime++;
      }
  
      reconnectQueue.put(reconnectTime, node);
      metrics.incrementCounter(RECON_QUEUE_METRIC);
  
      node.setupResend();
      if (failureMode == FailureMode.Redistribute) {
        redistributeOperations(node.destroyInputQueue());
      } else if (failureMode == FailureMode.Cancel) {
        cancelOperations(node.destroyInputQueue());
      }
    }
docs: Enqueue the given {@link MemcachedNode} for reconnect.
  
  @param node the node to reconnect.