aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/or/routerlist.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/src/or/routerlist.c b/src/or/routerlist.c
index 94c3cb491..71baf6ea8 100644
--- a/src/or/routerlist.c
+++ b/src/or/routerlist.c
@@ -3232,7 +3232,6 @@ routerlist_remove_old_routers(void)
int caches = directory_caches_dir_info(get_options());
const networkstatus_t *consensus = networkstatus_get_latest_consensus();
const smartlist_t *networkstatus_v2_list = networkstatus_get_v2_list();
- int n_expected_retain = 0;
trusted_dirs_remove_old_certs();
@@ -3241,17 +3240,25 @@ routerlist_remove_old_routers(void)
// routerlist_assert_ok(routerlist);
- n_expected_retain = smartlist_len(consensus->routerstatus_list);
- if (caches &&
- networkstatus_v2_list && smartlist_len(networkstatus_v2_list)) {
- SMARTLIST_FOREACH(networkstatus_v2_list, networkstatus_v2_t *, ns,
- n_expected_retain += smartlist_len(ns->entries));
- /* DOCDOC XXX021 too much magic. */
- n_expected_retain /= (smartlist_len(networkstatus_v2_list)/2+1);
+ /* We need to guess how many router descriptors we will wind up wanting to
+ retain, so that we can be sure to allocate a large enough Bloom filter
+ to hold the digest set. Overestimating is fine; underestimating is bad.
+ */
+ {
+ /* We'll probably retain everything in the consensus. */
+ int n_max_retain = smartlist_len(consensus->routerstatus_list);
+ if (caches && networkstatus_v2_list) {
+ /* If we care about v2 statuses, we'll retain at most as many as are
+ listed any of the v2 statues. This will be at least the length of
+ the largest v2 networstatus, and in the worst case, this set will be
+ equal to the sum of the lengths of all v2 consensuses. Take the
+ worst case.
+ */
+ SMARTLIST_FOREACH(networkstatus_v2_list, networkstatus_v2_t *, ns,
+ n_max_retain += smartlist_len(ns->entries));
+ }
+ retain = digestset_new(n_max_retain);
}
- //log_notice(LD_DIR,"n_expected_retain=%d",n_expected_retain);
-
- retain = digestset_new(n_expected_retain);
cutoff = now - OLD_ROUTER_DESC_MAX_AGE;
/* Build a list of all the descriptors that _anybody_ lists. */