mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-13 06:33:44 +01:00
Every 60 seconds, check whether the listeners are still alive, and relaunch the dead ones.
svn:r2581
This commit is contained in:
parent
04ca660b2a
commit
57f09573f5
@ -553,12 +553,47 @@ static void listener_close_if_present(int type) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int retry_listeners(int type, struct config_line_t *cfg,
|
static int retry_listeners(int type, struct config_line_t *cfg,
|
||||||
int port_option, const char *default_addr)
|
int port_option, const char *default_addr,
|
||||||
|
int force)
|
||||||
{
|
{
|
||||||
|
if (!force) {
|
||||||
|
int want, have, n_conn, i;
|
||||||
|
struct config_line_t *c;
|
||||||
|
connection_t *conn;
|
||||||
|
connection_t **carray;
|
||||||
|
/* How many should there be? */
|
||||||
|
if (cfg && port_option) {
|
||||||
|
want = 0;
|
||||||
|
for (c = cfg; c; c = c->next)
|
||||||
|
++want;
|
||||||
|
} else if (port_option) {
|
||||||
|
want = 1;
|
||||||
|
} else {
|
||||||
|
want = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* How many are there actually? */
|
||||||
|
have = 0;
|
||||||
|
get_connection_array(&carray,&n_conn);
|
||||||
|
for(i=0;i<n_conn;i++) {
|
||||||
|
conn = carray[i];
|
||||||
|
if (conn->type == type && !conn->marked_for_close)
|
||||||
|
++have;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we have the right number of listeners, do nothing. */
|
||||||
|
if (have == want)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Otherwise, warn the user and relaunch. */
|
||||||
|
log_fn(LOG_WARN,"We have %d %s(s) open, but we want %d; relaunching.",
|
||||||
|
have, conn_type_to_string[type], want);
|
||||||
|
}
|
||||||
|
|
||||||
listener_close_if_present(type);
|
listener_close_if_present(type);
|
||||||
if (port_option) {
|
if (port_option) {
|
||||||
if (!cfg) {
|
if (!cfg) {
|
||||||
if (connection_create_listener(default_addr, (uint16_t) port_option,
|
if (connection_create_listener(default_addr, (uint16_t) port_option,
|
||||||
type)<0)
|
type)<0)
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
@ -572,18 +607,21 @@ static int retry_listeners(int type, struct config_line_t *cfg,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** (Re)launch listeners for each port you should have open.
|
/** (Re)launch listeners for each port you should have open. If
|
||||||
|
* <b>force</b> is true, close and relaunch all listeners. If <b>force</b>
|
||||||
|
* is false, then only relaunch listeners when we have the wrong number of
|
||||||
|
* connections for a given type.
|
||||||
*/
|
*/
|
||||||
int retry_all_listeners(void) {
|
int retry_all_listeners(int force) {
|
||||||
|
|
||||||
if (retry_listeners(CONN_TYPE_OR_LISTENER, options.ORBindAddress,
|
if (retry_listeners(CONN_TYPE_OR_LISTENER, options.ORBindAddress,
|
||||||
options.ORPort, "0.0.0.0")<0)
|
options.ORPort, "0.0.0.0", force)<0)
|
||||||
return -1;
|
return -1;
|
||||||
if (retry_listeners(CONN_TYPE_DIR_LISTENER, options.DirBindAddress,
|
if (retry_listeners(CONN_TYPE_DIR_LISTENER, options.DirBindAddress,
|
||||||
options.DirPort, "0.0.0.0")<0)
|
options.DirPort, "0.0.0.0", force)<0)
|
||||||
return -1;
|
return -1;
|
||||||
if (retry_listeners(CONN_TYPE_AP_LISTENER, options.SocksBindAddress,
|
if (retry_listeners(CONN_TYPE_AP_LISTENER, options.SocksBindAddress,
|
||||||
options.SocksPort, "127.0.0.1")<0)
|
options.SocksPort, "127.0.0.1", force)<0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -502,6 +502,7 @@ static void run_scheduled_events(time_t now) {
|
|||||||
static long time_to_fetch_directory = 0;
|
static long time_to_fetch_directory = 0;
|
||||||
static time_t last_uploaded_services = 0;
|
static time_t last_uploaded_services = 0;
|
||||||
static time_t last_rotated_certificate = 0;
|
static time_t last_rotated_certificate = 0;
|
||||||
|
static time_t time_to_check_listeners = 0;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/** 0. See if we've been asked to shut down and our timeout has
|
/** 0. See if we've been asked to shut down and our timeout has
|
||||||
@ -596,6 +597,12 @@ static void run_scheduled_events(time_t now) {
|
|||||||
*/
|
*/
|
||||||
connection_expire_held_open();
|
connection_expire_held_open();
|
||||||
|
|
||||||
|
/** 3d. And every 60 secionds, we relaunch listeners if any died. */
|
||||||
|
if (time_to_check_listeners < now) {
|
||||||
|
retry_all_listeners(0); /* 0 means "only if some died." */
|
||||||
|
time_to_check_listeners = now+60;
|
||||||
|
}
|
||||||
|
|
||||||
/** 4. Every second, we try a new circuit if there are no valid
|
/** 4. Every second, we try a new circuit if there are no valid
|
||||||
* circuits. Every NewCircuitPeriod seconds, we expire circuits
|
* circuits. Every NewCircuitPeriod seconds, we expire circuits
|
||||||
* that became dirty more than NewCircuitPeriod seconds ago,
|
* that became dirty more than NewCircuitPeriod seconds ago,
|
||||||
@ -744,7 +751,7 @@ static int do_hup(void) {
|
|||||||
log_fn(LOG_ERR,"Error reloading rendezvous service keys");
|
log_fn(LOG_ERR,"Error reloading rendezvous service keys");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if(retry_all_listeners() < 0) {
|
if(retry_all_listeners(1) < 0) {
|
||||||
log_fn(LOG_ERR,"Failed to bind one of the listener ports.");
|
log_fn(LOG_ERR,"Failed to bind one of the listener ports.");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -808,7 +815,7 @@ static int do_main_loop(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* start up the necessary listeners based on which ports are non-zero. */
|
/* start up the necessary listeners based on which ports are non-zero. */
|
||||||
if(retry_all_listeners() < 0) {
|
if(retry_all_listeners(1) < 0) {
|
||||||
log_fn(LOG_ERR,"Failed to bind one of the listener ports.");
|
log_fn(LOG_ERR,"Failed to bind one of the listener ports.");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1093,7 +1093,7 @@ int _connection_mark_for_close(connection_t *conn);
|
|||||||
void connection_expire_held_open(void);
|
void connection_expire_held_open(void);
|
||||||
|
|
||||||
int connection_connect(connection_t *conn, char *address, uint32_t addr, uint16_t port);
|
int connection_connect(connection_t *conn, char *address, uint32_t addr, uint16_t port);
|
||||||
int retry_all_listeners(void);
|
int retry_all_listeners(int force);
|
||||||
|
|
||||||
void connection_bucket_init(void);
|
void connection_bucket_init(void);
|
||||||
void connection_bucket_refill(struct timeval *now);
|
void connection_bucket_refill(struct timeval *now);
|
||||||
|
Loading…
Reference in New Issue
Block a user