diff --git a/src/net.c b/src/net.c index 881c6b64..573d1f2d 100644 --- a/src/net.c +++ b/src/net.c @@ -228,7 +228,7 @@ static void periodic_handler(void *data) { } if (!found) splay_insert(tmp_node_tree, n); - } + } if (tmp_node_tree->count) { int r = rand() % tmp_node_tree->count; @@ -242,11 +242,21 @@ static void periodic_handler(void *data) { logger(DEBUG_CONNECTIONS, LOG_INFO, "Autoconnecting to %s", n->name); outgoing_t *outgoing = xzalloc(sizeof *outgoing); outgoing->name = xstrdup(n->name); + outgoing->is_alive = true; list_insert_tail(outgoing_list, outgoing); setup_outgoing_connection(outgoing); } } else { logger(DEBUG_ALWAYS, LOG_INFO, "No more nodes available for autoconnect!"); + for list_each(outgoing_t, outgoing, outgoing_list) { + /* + It looks like this connection "died" bacause of missing hostname->addr lookup. + Remove it and try again. + */ + if (!outgoing->is_alive) { + list_delete(outgoing_list, outgoing); + } + } } splay_delete_tree(tmp_node_tree); } else if(nc > 3) { diff --git a/src/net.h b/src/net.h index 3f9bc40c..956240ef 100644 --- a/src/net.h +++ b/src/net.h @@ -123,6 +123,7 @@ typedef struct listen_socket_t { typedef struct outgoing_t { char *name; bool keep_it; + bool is_alive; int timeout; splay_tree_t *config_tree; struct config_t *cfg; diff --git a/src/net_socket.c b/src/net_socket.c index 290f42e4..081626a9 100644 --- a/src/net_socket.c +++ b/src/net_socket.c @@ -620,6 +620,8 @@ void setup_outgoing_connection(outgoing_t *outgoing) { outgoing->aip = outgoing->ai = get_known_addresses(n); if(!outgoing->ai) { logger(DEBUG_ALWAYS, LOG_DEBUG, "No address known for %s", outgoing->name); + retry_outgoing(outgoing); + outgoing->is_alive = false; return; } }