diff options
-rw-r--r-- | src/or/hs_service.c | 7 | ||||
-rw-r--r-- | src/or/nodelist.c | 21 | ||||
-rw-r--r-- | src/or/nodelist.h | 2 |
3 files changed, 30 insertions, 0 deletions
diff --git a/src/or/hs_service.c b/src/or/hs_service.c index e213efe06a..31776c8b5e 100644 --- a/src/or/hs_service.c +++ b/src/or/hs_service.c @@ -1739,6 +1739,13 @@ rotate_all_descriptors(time_t now) * it in order to make sure we don't rotate at next check. */ service->state.in_overlap_period = 1; + /* We just entered overlap period: recompute all HSDir indices. We need to + * do this otherwise nodes can get stuck with old HSDir indices until we + * fetch a new consensus, and we might need to reupload our desc before + * that. */ + /* XXX find a better place than rotate_all_descriptors() to do this */ + nodelist_recompute_all_hsdir_indices(); + /* If we have a next descriptor lined up, rotate the descriptors so that it * becomes current. */ if (service->desc_next) { diff --git a/src/or/nodelist.c b/src/or/nodelist.c index d75b386e01..6acc87f967 100644 --- a/src/or/nodelist.c +++ b/src/or/nodelist.c @@ -238,6 +238,27 @@ node_set_hsdir_index(node_t *node, const networkstatus_t *ns) return; } +/** Recompute all node hsdir indices. */ +void +nodelist_recompute_all_hsdir_indices(void) +{ + networkstatus_t *consensus; + if (!the_nodelist) { + return; + } + + /* Get a live consensus. Abort if not found */ + consensus = networkstatus_get_live_consensus(approx_time()); + if (!consensus) { + return; + } + + /* Recompute all hsdir indices */ + SMARTLIST_FOREACH_BEGIN(the_nodelist->nodes, node_t *, node) { + node_set_hsdir_index(node, consensus); + } SMARTLIST_FOREACH_END(node); +} + /** Called when a node's address changes. */ static void node_addrs_changed(node_t *node) diff --git a/src/or/nodelist.h b/src/or/nodelist.h index 06a08a288c..d16cf0ecf7 100644 --- a/src/or/nodelist.h +++ b/src/or/nodelist.h @@ -28,6 +28,8 @@ void nodelist_remove_routerinfo(routerinfo_t *ri); void nodelist_purge(void); smartlist_t *nodelist_find_nodes_with_microdesc(const microdesc_t *md); +void nodelist_recompute_all_hsdir_indices(void); + void nodelist_free_all(void); void nodelist_assert_ok(void); |