protected ClickHouseNode suggest(ClickHouseNodes manager, ClickHouseNode server, Throwable failure) {
        if (manager == null || server == null || !(failure instanceof ClickHouseException)) {
            return server;
        }

        ClickHouseException exp = (ClickHouseException) failure;
        // only connection errors at this point
        if (exp.getErrorCode() == ClickHouseException.ERROR_NETWORK
                || ClickHouseException.isConnectTimedOut(exp.getCause())) {
            ClickHouseNodeSelector selector = manager.getNodeSelector();
            for (ClickHouseNode node : manager.nodes) {
                if (selector.match(node) && !node.isSameEndpoint(server)) {
                    return node;
                }
            }
        }
        return server;
    }
Sugguests a new node as replacement of the given one in order to recover from
the failure, which is usually a connection error.

@param manager non-null manager for finding suitable node
@param server  non-null server to replace
@param failure non-null recoverable exception
@return new server, or the exact same server from input when running out of
        options
clickhouse-client/src/main/java/com/clickhouse/client/ClickHouseLoadBalancingPolicy.java