mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-01 08:03:31 +01:00
when a client asks us for a dir mirror and we don't have one,
launch an attempt to get a fresh one. svn:r3609
This commit is contained in:
parent
1ebebff1a0
commit
37ca621301
@ -1256,6 +1256,23 @@ connection_t *connection_get_by_type_state(int type, int state) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Return a connection of type <b>type</b> that has purpose <b>purpose</b>,
|
||||||
|
* and that is not marked for close.
|
||||||
|
*/
|
||||||
|
connection_t *connection_get_by_type_purpose(int type, int purpose) {
|
||||||
|
int i, n;
|
||||||
|
connection_t *conn;
|
||||||
|
connection_t **carray;
|
||||||
|
|
||||||
|
get_connection_array(&carray,&n);
|
||||||
|
for (i=0;i<n;i++) {
|
||||||
|
conn = carray[i];
|
||||||
|
if (conn->type == type && conn->purpose == purpose && !conn->marked_for_close)
|
||||||
|
return conn;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/** Return the connection of type <b>type</b> that is in state
|
/** Return the connection of type <b>type</b> that is in state
|
||||||
* <b>state</b>, that was written to least recently, and that is not
|
* <b>state</b>, that was written to least recently, and that is not
|
||||||
* marked for close.
|
* marked for close.
|
||||||
|
@ -876,6 +876,9 @@ directory_handle_command_get(connection_t *conn, char *headers,
|
|||||||
if (dlen == 0) {
|
if (dlen == 0) {
|
||||||
log_fn(LOG_NOTICE,"Client asked for the mirrored directory, but we don't have a good one yet. Sending 503 Dir not available.");
|
log_fn(LOG_NOTICE,"Client asked for the mirrored directory, but we don't have a good one yet. Sending 503 Dir not available.");
|
||||||
write_http_status_line(conn, 503, "Directory unavailable");
|
write_http_status_line(conn, 503, "Directory unavailable");
|
||||||
|
/* try to get a new one now */
|
||||||
|
if (!connection_get_by_type_purpose(CONN_TYPE_DIR, DIR_PURPOSE_FETCH_DIR))
|
||||||
|
directory_get_from_dirserver(DIR_PURPOSE_FETCH_DIR, NULL, 1);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -898,6 +901,10 @@ directory_handle_command_get(connection_t *conn, char *headers,
|
|||||||
dlen = dirserv_get_runningrouters(&cp, deflated);
|
dlen = dirserv_get_runningrouters(&cp, deflated);
|
||||||
if (!dlen) { /* we failed to create/cache cp */
|
if (!dlen) { /* we failed to create/cache cp */
|
||||||
write_http_status_line(conn, 503, "Directory unavailable");
|
write_http_status_line(conn, 503, "Directory unavailable");
|
||||||
|
/* try to get a new one now */
|
||||||
|
if (!connection_get_by_type_purpose(CONN_TYPE_DIR,
|
||||||
|
DIR_PURPOSE_FETCH_RUNNING_LIST))
|
||||||
|
directory_get_from_dirserver(DIR_PURPOSE_FETCH_RUNNING_LIST, NULL, 1);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user