Ver código fonte

Document that we break ties in favor of smaller SD digest if there are still ties after comparing the published timestamp

svn:r16432
Peter Palfrader 16 anos atrás
pai
commit
0cfb68454e
2 arquivos alterados com 9 adições e 3 exclusões
  1. 3 2
      doc/spec/dir-spec.txt
  2. 6 1
      src/or/dirvote.c

+ 3 - 2
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

+ 6 - 1
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,
   {