Merge remote-tracking branch 'asn/feature19036'

This commit is contained in:
Nick Mathewson 2016-05-27 10:37:11 -04:00
commit 437cbb17c2
2 changed files with 41 additions and 20 deletions

4
changes/feature19036 Normal file
View File

@ -0,0 +1,4 @@
o Minor features:
- Make directory authorities write the v3-status-votes file out
to disk earlier in the consensus process, so we have the votes
even if we abort the consensus process below. Resolves ticket 19036.

View File

@ -3021,6 +3021,30 @@ dirvote_add_vote(const char *vote_body, const char **msg_out, int *status_out)
return any_failed ? NULL : pending_vote; return any_failed ? NULL : pending_vote;
} }
/* Write the votes in <b>pending_vote_list</b> to disk. */
static void
write_v3_votes_to_disk(const smartlist_t *pending_vote_list)
{
smartlist_t *votestrings = smartlist_new();
char *votefile = NULL;
SMARTLIST_FOREACH(pending_vote_list, pending_vote_t *, v,
{
sized_chunk_t *c = tor_malloc(sizeof(sized_chunk_t));
c->bytes = v->vote_body->dir;
c->len = v->vote_body->dir_len;
smartlist_add(votestrings, c); /* collect strings to write to disk */
});
votefile = get_datadir_fname("v3-status-votes");
write_chunks_to_file(votefile, votestrings, 0, 0);
log_debug(LD_DIR, "Wrote votes to disk (%s)!", votefile);
tor_free(votefile);
SMARTLIST_FOREACH(votestrings, sized_chunk_t *, c, tor_free(c));
smartlist_free(votestrings);
}
/** Try to compute a v3 networkstatus consensus from the currently pending /** Try to compute a v3 networkstatus consensus from the currently pending
* votes. Return 0 on success, -1 on failure. Store the consensus in * votes. Return 0 on success, -1 on failure. Store the consensus in
* pending_consensus: it won't be ready to be published until we have * pending_consensus: it won't be ready to be published until we have
@ -3030,8 +3054,8 @@ dirvote_compute_consensuses(void)
{ {
/* Have we got enough votes to try? */ /* Have we got enough votes to try? */
int n_votes, n_voters, n_vote_running = 0; int n_votes, n_voters, n_vote_running = 0;
smartlist_t *votes = NULL, *votestrings = NULL; smartlist_t *votes = NULL;
char *consensus_body = NULL, *signatures = NULL, *votefile; char *consensus_body = NULL, *signatures = NULL;
networkstatus_t *consensus = NULL; networkstatus_t *consensus = NULL;
authority_cert_t *my_cert; authority_cert_t *my_cert;
pending_consensus_t pending[N_CONSENSUS_FLAVORS]; pending_consensus_t pending[N_CONSENSUS_FLAVORS];
@ -3042,6 +3066,17 @@ dirvote_compute_consensuses(void)
if (!pending_vote_list) if (!pending_vote_list)
pending_vote_list = smartlist_new(); pending_vote_list = smartlist_new();
/* Write votes to disk */
write_v3_votes_to_disk(pending_vote_list);
/* Setup votes smartlist */
votes = smartlist_new();
SMARTLIST_FOREACH(pending_vote_list, pending_vote_t *, v,
{
smartlist_add(votes, v->vote); /* collect votes to compute consensus */
});
/* See if consensus managed to achieve majority */
n_voters = get_n_authorities(V3_DIRINFO); n_voters = get_n_authorities(V3_DIRINFO);
n_votes = smartlist_len(pending_vote_list); n_votes = smartlist_len(pending_vote_list);
if (n_votes <= n_voters/2) { if (n_votes <= n_voters/2) {
@ -3068,24 +3103,6 @@ dirvote_compute_consensuses(void)
goto err; goto err;
} }
votes = smartlist_new();
votestrings = smartlist_new();
SMARTLIST_FOREACH(pending_vote_list, pending_vote_t *, v,
{
sized_chunk_t *c = tor_malloc(sizeof(sized_chunk_t));
c->bytes = v->vote_body->dir;
c->len = v->vote_body->dir_len;
smartlist_add(votestrings, c); /* collect strings to write to disk */
smartlist_add(votes, v->vote); /* collect votes to compute consensus */
});
votefile = get_datadir_fname("v3-status-votes");
write_chunks_to_file(votefile, votestrings, 0, 0);
tor_free(votefile);
SMARTLIST_FOREACH(votestrings, sized_chunk_t *, c, tor_free(c));
smartlist_free(votestrings);
{ {
char legacy_dbuf[DIGEST_LEN]; char legacy_dbuf[DIGEST_LEN];
crypto_pk_t *legacy_sign=NULL; crypto_pk_t *legacy_sign=NULL;