diff options
-rw-r--r-- | doc/spec/dir-spec.txt | 5 | ||||
-rw-r--r-- | src/or/dirvote.c | 7 |
2 files changed, 9 insertions, 3 deletions
diff --git a/doc/spec/dir-spec.txt b/doc/spec/dir-spec.txt index e7f007d6fc..88d406f7e7 100644 --- a/doc/spec/dir-spec.txt +++ b/doc/spec/dir-spec.txt @@ -1145,8 +1145,9 @@ $Id$ * Two router entries are "the same" if they have the same <descriptor digest, published time, nickname, IP, ports> tuple. We choose the tuple for a given router as whichever tuple appears - for that router in the most votes. We break ties in favor of - the more recently published. + for that router in the most votes. We break ties first in favor of + the more recently published, then in favor of smaller server + descriptor digest. * The Named flag appears if it is included for this routerstatus by _any_ authority, and if all authorities that list it list the same diff --git a/src/or/dirvote.c b/src/or/dirvote.c index 6a705bc84f..42710a40d5 100644 --- a/src/or/dirvote.c +++ b/src/or/dirvote.c @@ -337,7 +337,8 @@ _compare_vote_rs(const void **_a, const void **_b) /** Given a list of vote_routerstatus_t, all for the same router identity, * return whichever is most frequent, breaking ties in favor of more - * recently published vote_routerstatus_t. + * recently published vote_routerstatus_t and in case of ties there, + * in favour of smaller descriptor digest. */ static vote_routerstatus_t * compute_routerstatus_consensus(smartlist_t *votes) @@ -346,6 +347,10 @@ compute_routerstatus_consensus(smartlist_t *votes) int most_n = 0, cur_n = 0; time_t most_published = 0; + /* _compare_vote_rs() sorts the items by identity digest (all the same), + * then by SD digest. That way, if we have a tie that the published_on + * date cannot tie, we use the descriptor with the smaller digest. + */ smartlist_sort(votes, _compare_vote_rs); SMARTLIST_FOREACH(votes, vote_routerstatus_t *, rs, { |