diff --git a/src/or/directory.c b/src/or/directory.c index 2bbd4deabd..eb3f8ee584 100644 --- a/src/or/directory.c +++ b/src/or/directory.c @@ -30,8 +30,7 @@ const char directory_c_id[] = * - connection_dir_finished_connecting(), called from * connection_finished_connecting() in connection.c */ -static void -directory_send_command(dir_connection_t *conn, +static void directory_send_command(dir_connection_t *conn, int purpose, int direct, const char *resource, const char *payload, size_t payload_len); static int directory_handle_command(dir_connection_t *conn); diff --git a/src/or/dirserv.c b/src/or/dirserv.c index 546873bf3b..33b3efd9a8 100644 --- a/src/or/dirserv.c +++ b/src/or/dirserv.c @@ -12,7 +12,7 @@ const char dirserv_c_id[] = * \file dirserv.c * \brief Directory server core implementation. Manages directory * contents and generates directories. - **/ + */ /** How far in the future do we allow a router to get? (seconds) */ #define ROUTER_ALLOW_SKEW (60*60*12) @@ -772,11 +772,26 @@ void directory_set_dirty(void) { time_t now = time(NULL); + int set_v1_dirty; - if (!the_directory_is_dirty) - the_directory_is_dirty = now; - if (!runningrouters_is_dirty) - runningrouters_is_dirty = now; +#ifdef FULL_V1_DIRECTORIES + set_v1_dirty = 1; +#else + /* Regenerate stubs only every 8 hours. XXXX020 */ +#define STUB_REGENERATE_INTERVAL (8*60*60) + if (!the_directory || !the_runningrouters.dir) + set_v1_dirty = 1; + else if (the_directory->published < now - STUB_REGENERATE_INTERVAL || + the_runningrouters.published < now - STUB_REGENERATE_INTERVAL) + set_v1_dirty = 1; +#endif + + if (set_v1_dirty) { + if (!the_directory_is_dirty) + the_directory_is_dirty = now; + if (!runningrouters_is_dirty) + runningrouters_is_dirty = now; + } if (!the_v2_networkstatus_is_dirty) the_v2_networkstatus_is_dirty = now; } @@ -953,8 +968,12 @@ dirserv_dump_directory_to_string(char **dir_out, tor_assert(dir_out); *dir_out = NULL; +#ifdef FULL_V1_DIRECTORIES if (list_server_status(rl->routers, &router_status, 0)) return -1; +#else + router_status = tor_strdup(""); +#endif if (crypto_pk_write_public_key_to_string(private_key,&identity_pkey, &identity_pkey_len)<0) { @@ -969,9 +988,11 @@ dirserv_dump_directory_to_string(char **dir_out, buf_len = 2048+strlen(recommended_versions)+ strlen(router_status); +#ifdef FULL_V1_DIRECTORIES SMARTLIST_FOREACH(rl->routers, routerinfo_t *, ri, if (complete || router_is_active(ri, now)) buf_len += ri->cache_info.signed_descriptor_len+1); +#endif buf = tor_malloc(buf_len); /* We'll be comparing against buf_len throughout the rest of the function, though strictly speaking we shouldn't be able to exceed @@ -992,6 +1013,7 @@ dirserv_dump_directory_to_string(char **dir_out, tor_free(identity_pkey); cp = buf + strlen(buf); +#ifdef FULL_V1_DIRECTORIES SMARTLIST_FOREACH(rl->routers, routerinfo_t *, ri, { size_t len = ri->cache_info.signed_descriptor_len; @@ -1006,6 +1028,7 @@ dirserv_dump_directory_to_string(char **dir_out, *cp++ = '\n'; /* add an extra newline in case somebody was depending on * it. */ }); +#endif *cp = '\0'; /* These multiple strlcat calls are inefficient, but dwarfed by the RSA @@ -1360,9 +1383,13 @@ generate_runningrouters(void) size_t identity_pkey_len; routerlist_t *rl = router_get_routerlist(); +#ifdef FULL_V1_DIRECTORIES if (list_server_status(rl->routers, &router_status, 0)) { goto err; } +#else + router_status = tor_strdup(""); +#endif if (crypto_pk_write_public_key_to_string(private_key,&identity_pkey, &identity_pkey_len)<0) { log_warn(LD_BUG,"write identity_pkey to string failed!"); diff --git a/src/or/main.c b/src/or/main.c index d0c466dba9..6e449e0ef9 100644 --- a/src/or/main.c +++ b/src/or/main.c @@ -954,7 +954,11 @@ run_scheduled_events(time_t now) ROUTER_PURPOSE_GENERAL, NULL, 1); } /** How often do we (as a cache) fetch a new V1 runningrouters document? */ +#ifdef FULL_V1_DIRECTORIES #define V1_RUNNINGROUTERS_FETCH_PERIOD (30*60) +#else +#define V1_RUNNINGROUTERS_FETCH_PERIOD (6*60*60) +#endif time_to_fetch_running_routers = now + V1_RUNNINGROUTERS_FETCH_PERIOD; /* Also, take this chance to remove old information from rephist diff --git a/src/or/or.h b/src/or/or.h index 7a1ac31170..2d2b5fad46 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -154,6 +154,9 @@ #define cell_t tor_cell_t #endif +/** Undefine this when it's time to stop generating v1 directories. */ +#define FULL_V1_DIRECTORIES + /** Length of longest allowable configured nickname. */ #define MAX_NICKNAME_LEN 19 /** Length of a router identity encoded as a hexadecimal digest, plus