Really retry outgoing connections immediately if requested.
The retry() function would only abort connections that were in progress of being made, it wouldn't reschedule the outgoing connections that had been sleeping.
This commit is contained in:
parent
1e7d1cd3c7
commit
f3a2bed063
1 changed files with 16 additions and 11 deletions
27
src/net.c
27
src/net.c
|
@ -41,6 +41,8 @@ int contradicting_add_edge = 0;
|
||||||
int contradicting_del_edge = 0;
|
int contradicting_del_edge = 0;
|
||||||
static int sleeptime = 10;
|
static int sleeptime = 10;
|
||||||
time_t last_config_check = 0;
|
time_t last_config_check = 0;
|
||||||
|
static timeout_t pingtimer;
|
||||||
|
static timeout_t periodictimer;
|
||||||
|
|
||||||
/* Purge edges and subnets of unreachable nodes. Use carefully. */
|
/* Purge edges and subnets of unreachable nodes. Use carefully. */
|
||||||
|
|
||||||
|
@ -412,24 +414,27 @@ int reload_configuration(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void retry(void) {
|
void retry(void) {
|
||||||
for list_each(connection_t, c, connection_list) {
|
/* Reset the reconnection timers for all outgoing connections */
|
||||||
if(c->outgoing && !c->node) {
|
for list_each(outgoing_t, outgoing, outgoing_list) {
|
||||||
timeout_del(&c->outgoing->ev);
|
outgoing->timeout = 0;
|
||||||
if(c->status.connecting)
|
if(outgoing->ev.cb)
|
||||||
close(c->socket);
|
timeout_set(&outgoing->ev, &(struct timeval){0, 0});
|
||||||
c->outgoing->timeout = 0;
|
|
||||||
terminate_connection(c, c->status.active);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check for outgoing connections that are in progress, and reset their ping timers */
|
||||||
|
for list_each(connection_t, c, connection_list) {
|
||||||
|
if(c->outgoing && !c->node)
|
||||||
|
c->last_ping_time = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Kick the ping timeout handler */
|
||||||
|
timeout_set(&pingtimer, &(struct timeval){0, 0});
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
this is where it all happens...
|
this is where it all happens...
|
||||||
*/
|
*/
|
||||||
int main_loop(void) {
|
int main_loop(void) {
|
||||||
timeout_t pingtimer = {{0}};
|
|
||||||
timeout_t periodictimer = {{0}};
|
|
||||||
|
|
||||||
timeout_add(&pingtimer, timeout_handler, &pingtimer, &(struct timeval){pingtimeout, rand() % 100000});
|
timeout_add(&pingtimer, timeout_handler, &pingtimer, &(struct timeval){pingtimeout, rand() % 100000});
|
||||||
timeout_add(&periodictimer, periodic_handler, &periodictimer, &(struct timeval){pingtimeout, rand() % 100000});
|
timeout_add(&periodictimer, periodic_handler, &periodictimer, &(struct timeval){pingtimeout, rand() % 100000});
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue