From 6c82496b51148aa54222b090057b63eaf76bf7ef Mon Sep 17 00:00:00 2001 From: clemahieu Date: Sun, 6 May 2018 10:54:34 +0100 Subject: [PATCH] Using a less-than operator instead of greater-than and using vote_info instead of a tuple. --- rai/core_test/ledger.cpp | 12 ++++++------ rai/node/node.cpp | 11 ++++++++--- rai/node/node.hpp | 10 +++++++++- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/rai/core_test/ledger.cpp b/rai/core_test/ledger.cpp index d8f8d979..432aaca0 100644 --- a/rai/core_test/ledger.cpp +++ b/rai/core_test/ledger.cpp @@ -853,18 +853,18 @@ TEST (votes, add_existing) auto votes1 (node1.active.roots.find (send1->root ())->election); auto vote1 (std::make_shared (rai::test_genesis_key.pub, rai::test_genesis_key.prv, 1, send1)); votes1->vote (vote1); - ASSERT_EQ (1, votes1->last_votes[rai::test_genesis_key.pub].second); + ASSERT_EQ (1, votes1->last_votes[rai::test_genesis_key.pub].sequence); rai::keypair key2; auto send2 (std::make_shared (genesis.hash (), key2.pub, 0, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0)); auto vote2 (std::make_shared (rai::test_genesis_key.pub, rai::test_genesis_key.prv, 2, send2)); // Pretend we've waited the timeout - votes1->last_votes[rai::test_genesis_key.pub].first = std::chrono::steady_clock::now () - std::chrono::seconds (20); + votes1->last_votes[rai::test_genesis_key.pub].time = std::chrono::steady_clock::now () - std::chrono::seconds (20); votes1->vote (vote2); - ASSERT_EQ (2, votes1->last_votes[rai::test_genesis_key.pub].second); + ASSERT_EQ (2, votes1->last_votes[rai::test_genesis_key.pub].sequence); // Also resend the old vote, and see if we respect the sequence number - votes1->last_votes[rai::test_genesis_key.pub].first = std::chrono::steady_clock::now () - std::chrono::seconds (20); + votes1->last_votes[rai::test_genesis_key.pub].time = std::chrono::steady_clock::now () - std::chrono::seconds (20); votes1->vote (vote1); - ASSERT_EQ (2, votes1->last_votes[rai::test_genesis_key.pub].second); + ASSERT_EQ (2, votes1->last_votes[rai::test_genesis_key.pub].sequence); ASSERT_EQ (2, votes1->votes.rep_votes.size ()); ASSERT_NE (votes1->votes.rep_votes.end (), votes1->votes.rep_votes.find (rai::test_genesis_key.pub)); ASSERT_EQ (*send2, *votes1->votes.rep_votes[rai::test_genesis_key.pub]); @@ -893,7 +893,7 @@ TEST (votes, add_old) rai::keypair key2; auto send2 (std::make_shared (genesis.hash (), key2.pub, 0, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0)); auto vote2 (std::make_shared (rai::test_genesis_key.pub, rai::test_genesis_key.prv, 1, send2)); - votes1->last_votes[rai::test_genesis_key.pub].first = std::chrono::steady_clock::now () - std::chrono::seconds (20); + votes1->last_votes[rai::test_genesis_key.pub].time = std::chrono::steady_clock::now () - std::chrono::seconds (20); node1.vote_processor.vote (vote2, rai::endpoint ()); ASSERT_EQ (2, votes1->votes.rep_votes.size ()); ASSERT_NE (votes1->votes.rep_votes.end (), votes1->votes.rep_votes.find (rai::test_genesis_key.pub)); diff --git a/rai/node/node.cpp b/rai/node/node.cpp index ee61702d..e62dd093 100644 --- a/rai/node/node.cpp +++ b/rai/node/node.cpp @@ -3027,6 +3027,11 @@ std::shared_ptr rai::node::shared () return shared_from_this (); } +bool rai::vote_info::operator < (rai::vote const & vote_a) const +{ + return sequence < vote_a.sequence || (sequence == vote_a.sequence && hash < vote_a.block->hash ()); +} + rai::election::election (rai::node & node_a, std::shared_ptr block_a, std::function)> const & confirmation_action_a) : confirmation_action (confirmation_action_a), votes (block_a), @@ -3161,9 +3166,9 @@ bool rai::election::vote (std::shared_ptr vote_a) else { auto last_vote (last_vote_it->second); - if (vote_a->sequence > last_vote.second) + if (last_vote < *vote_a) { - if (last_vote.first <= std::chrono::steady_clock::now () - std::chrono::seconds (cooldown)) + if (last_vote.time <= std::chrono::steady_clock::now () - std::chrono::seconds (cooldown)) { should_process = true; } @@ -3175,7 +3180,7 @@ bool rai::election::vote (std::shared_ptr vote_a) } if (should_process) { - last_votes[vote_a->account] = std::make_pair (std::chrono::steady_clock::now (), vote_a->sequence); + last_votes[vote_a->account] = { std::chrono::steady_clock::now (), vote_a->sequence, vote_a->block->hash () }; node.network.republish_vote (vote_a); votes.vote (vote_a); confirm_if_quorum (transaction); diff --git a/rai/node/node.hpp b/rai/node/node.hpp index a4af75f4..b2ac58ec 100644 --- a/rai/node/node.hpp +++ b/rai/node/node.hpp @@ -42,6 +42,14 @@ public: std::shared_ptr winner; rai::amount tally; }; +class vote_info +{ +public: + std::chrono::steady_clock::time_point time; + uint64_t sequence; + rai::block_hash hash; + bool operator < (rai::vote const &) const; +}; class election : public std::enable_shared_from_this { std::function)> confirmation_action; @@ -62,7 +70,7 @@ public: void confirm_cutoff (MDB_txn *); rai::votes votes; rai::node & node; - std::unordered_map> last_votes; + std::unordered_map last_votes; rai::election_status status; std::atomic confirmed; };