From b33d2f17abb4bb607fa81806bd4240f45259dfdd Mon Sep 17 00:00:00 2001 From: Julien Clement Date: Wed, 6 May 2020 21:03:24 +0200 Subject: [PATCH] Fix a possible case when president receive a last vote after receiving a voted from someone else for the same ballot --- src/legislator/legislator.cc | 7 ++++--- src/legislator/legislator.hh | 2 ++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/legislator/legislator.cc b/src/legislator/legislator.cc index 94ca9b0..a35497e 100644 --- a/src/legislator/legislator.cc +++ b/src/legislator/legislator.cc @@ -10,13 +10,14 @@ namespace paxos { Legislator::Legislator(const LegislatorConfig& config) - : config_(config), ledger(config.name) + : config_(config), ledger(config.name), has_started(false) { log("created legislator " + config.name, blue); } void Legislator::initiate_ballot() { + has_started = false; quorum_previous_votes.clear(); int new_ballot_number = ledger.last_tried() + 1; ledger.set_last_tried(new_ballot_number); @@ -92,8 +93,7 @@ namespace paxos int vote_decree = std::stoi(*message.get_header("decree")); unsigned int nb_legislators = legislators.size(); - if (ballot != ledger.last_tried() - || quorum_previous_votes.size() > nb_legislators / 2) + if (ballot != ledger.last_tried() || has_started) { log("but it was discarded because ballot " + std::to_string(ballot) + " is outdated, it is either no longer in treatment or already started" @@ -117,6 +117,7 @@ namespace paxos void Legislator::receive_enough_last_vote() { + has_started = true; int ballot = ledger.last_tried(); std::string ballot_str = std::to_string(ballot); diff --git a/src/legislator/legislator.hh b/src/legislator/legislator.hh index f4c6dad..8586170 100644 --- a/src/legislator/legislator.hh +++ b/src/legislator/legislator.hh @@ -40,8 +40,10 @@ namespace paxos void handle_message(Message message); + private: Ledger ledger; std::unordered_map quorum_previous_votes; + bool has_started; }; using shared_legislator = std::shared_ptr;