From 9031bbd4d86b4222af8e487a2f8204c334e410a5 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Sun, 29 Jul 2007 05:32:03 +0000 Subject: [PATCH] r13982@catbus: nickm | 2007-07-29 01:31:53 -0400 Actually, we missed a rule about what routers to prefer: first prefer authority to non-authority, *then* running, *then* bandwidth. svn:r10969 --- doc/spec/dir-spec-v2.txt | 10 +++++----- doc/spec/dir-spec.txt | 10 +++++----- src/or/dirserv.c | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/doc/spec/dir-spec-v2.txt b/doc/spec/dir-spec-v2.txt index 553e565cc5..7f71f8f071 100644 --- a/doc/spec/dir-spec-v2.txt +++ b/doc/spec/dir-spec-v2.txt @@ -482,11 +482,11 @@ $Id$ Directory server administrators may label some servers or IPs as blacklisted, and elect not to include them in their network-status lists. - Authorities SHOULD 'disable' any servers in excess of 3 on any single - IP. When there are more than 3 to choose from, authorities should first - prefer Running to non-Running, and then prefer high-bandwidth to - low-bandwidth. To 'disable' a server, the authority *should* advertise - it without the Running or Valid flag. + Authorities SHOULD 'disable' any servers in excess of 3 on any single IP. + When there are more than 3 to choose from, authorities should first prefer + authorities to non-authorities, then prefer Running to non-Running, and + then prefer high-bandwidth to low-bandwidth. To 'disable' a server, the + authority *should* advertise it without the Running or Valid flag. Thus, the network-status list includes all non-blacklisted, non-expired, non-superseded descriptors. diff --git a/doc/spec/dir-spec.txt b/doc/spec/dir-spec.txt index 1900fe3716..a7b2e5d803 100644 --- a/doc/spec/dir-spec.txt +++ b/doc/spec/dir-spec.txt @@ -968,11 +968,11 @@ $Id$ Directory server administrators may label some servers or IPs as blacklisted, and elect not to include them in their network-status lists. - Authorities SHOULD 'disable' any servers in excess of 3 on any single - IP. When there are more than 3 to choose from, authorities should first - prefer Running to non-Running, and then prefer high-bandwidth to - low-bandwidth. To 'disable' a server, the authority *should* advertise - it without the Running or Valid flag. + Authorities SHOULD 'disable' any servers in excess of 3 on any single IP. + When there are more than 3 to choose from, authorities should first prefer + authorities to non-authorities, then prefer Running to non-Running, and + then prefer high-bandwidth to low-bandwidth. To 'disable' a server, the + authority *should* advertise it without the Running or Valid flag. Thus, the network-status vote includes all non-blacklisted, non-expired, non-superseded descriptors. diff --git a/src/or/dirserv.c b/src/or/dirserv.c index 0a7a5f01af..bf818d01eb 100644 --- a/src/or/dirserv.c +++ b/src/or/dirserv.c @@ -1727,16 +1727,30 @@ static int _compare_routerinfo_by_ip_and_bw(const void **a, const void **b) { routerinfo_t *first = *(routerinfo_t **)a, *second = *(routerinfo_t **)b; + int first_is_auth, second_is_auth; + /* we return -1 if first should appear before second... that is, * if first is a better router. */ if (first->addr < second->addr) return -1; else if (first->addr > second->addr) return 1; + + first_is_auth = + router_digest_is_trusted_dir(first->cache_info.identity_digest); + second_is_auth = + router_digest_is_trusted_dir(second->cache_info.identity_digest); + + if (first_is_auth && !second_is_auth) + return -1; + else if (!first_is_auth && second_is_auth) + return 1; + else if (first->is_running && !second->is_running) return -1; else if (!first->is_running && second->is_running) return 1; + else if (first->bandwidthrate > second->bandwidthrate) return -1; else if (first->bandwidthrate < second->bandwidthrate)