mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-11 05:33:47 +01:00
Merge branch 'ticket16762_squashed'
This commit is contained in:
commit
23fb084cb2
4
changes/decouple_dir_all_unreachable
Normal file
4
changes/decouple_dir_all_unreachable
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
o Code simplification and refactoring:
|
||||||
|
- Simply the control graph further by deferring the inner body of
|
||||||
|
directory_all_unreachable() into a callback. Closes ticket
|
||||||
|
16762.
|
@ -982,19 +982,18 @@ conn_close_if_marked(int i)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** We've just tried every dirserver we know about, and none of
|
/** Implementation for directory_all_unreachable. This is done in a callback,
|
||||||
* them were reachable. Assume the network is down. Change state
|
* since otherwise it would complicate Tor's control-flow graph beyond all
|
||||||
* so next time an application connection arrives we'll delay it
|
* reason.
|
||||||
* and try another directory fetch. Kill off all the circuit_wait
|
|
||||||
* streams that are waiting now, since they will all timeout anyway.
|
|
||||||
*/
|
*/
|
||||||
void
|
static void
|
||||||
directory_all_unreachable(time_t now)
|
directory_all_unreachable_cb(evutil_socket_t fd, short event, void *arg)
|
||||||
{
|
{
|
||||||
connection_t *conn;
|
(void)fd;
|
||||||
(void)now;
|
(void)event;
|
||||||
|
(void)arg;
|
||||||
|
|
||||||
stats_n_seconds_working=0; /* reset it */
|
connection_t *conn;
|
||||||
|
|
||||||
while ((conn = connection_get_by_type_state(CONN_TYPE_AP,
|
while ((conn = connection_get_by_type_state(CONN_TYPE_AP,
|
||||||
AP_CONN_STATE_CIRCUIT_WAIT))) {
|
AP_CONN_STATE_CIRCUIT_WAIT))) {
|
||||||
@ -1010,6 +1009,31 @@ directory_all_unreachable(time_t now)
|
|||||||
control_event_general_status(LOG_ERR, "DIR_ALL_UNREACHABLE");
|
control_event_general_status(LOG_ERR, "DIR_ALL_UNREACHABLE");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct event *directory_all_unreachable_cb_event = NULL;
|
||||||
|
|
||||||
|
/** We've just tried every dirserver we know about, and none of
|
||||||
|
* them were reachable. Assume the network is down. Change state
|
||||||
|
* so next time an application connection arrives we'll delay it
|
||||||
|
* and try another directory fetch. Kill off all the circuit_wait
|
||||||
|
* streams that are waiting now, since they will all timeout anyway.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
directory_all_unreachable(time_t now)
|
||||||
|
{
|
||||||
|
(void)now;
|
||||||
|
|
||||||
|
stats_n_seconds_working=0; /* reset it */
|
||||||
|
|
||||||
|
if (!directory_all_unreachable_cb_event) {
|
||||||
|
directory_all_unreachable_cb_event =
|
||||||
|
tor_event_new(tor_libevent_get_base(),
|
||||||
|
-1, EV_READ, directory_all_unreachable_cb, NULL);
|
||||||
|
tor_assert(directory_all_unreachable_cb_event);
|
||||||
|
}
|
||||||
|
|
||||||
|
event_active(directory_all_unreachable_cb_event, EV_READ, 1);
|
||||||
|
}
|
||||||
|
|
||||||
/** This function is called whenever we successfully pull down some new
|
/** This function is called whenever we successfully pull down some new
|
||||||
* network statuses or server descriptors. */
|
* network statuses or server descriptors. */
|
||||||
void
|
void
|
||||||
|
Loading…
Reference in New Issue
Block a user