From 51bb9025d0f736c319f99db14a1f483b97218d0d Mon Sep 17 00:00:00 2001 From: theoreticalbts Date: Mon, 29 Jun 2015 15:24:22 -0400 Subject: [PATCH] db_maint.cpp: Avoid stdlib implementation-defined ordering when workers tie for votes --- libraries/chain/db_maint.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/libraries/chain/db_maint.cpp b/libraries/chain/db_maint.cpp index 3840b705..8d9d7c47 100644 --- a/libraries/chain/db_maint.cpp +++ b/libraries/chain/db_maint.cpp @@ -70,8 +70,14 @@ void database::pay_workers( share_type& budget ) active_workers.emplace_back(w); }); + // worker with more votes is preferred + // if two workers exactly tie for votes, worker with lower ID is preferred std::sort(active_workers.begin(), active_workers.end(), [this](const worker_object& wa, const worker_object& wb) { - return wa.approving_stake(_vote_tally_buffer) > wb.approving_stake(_vote_tally_buffer); + share_type wa_vote = wa.approving_stake(_vote_tally_buffer); + share_type wb_vote = wb.approving_stake(_vote_tally_buffer); + if( wa_vote != wb_vote ) + return wa_vote > wb_vote; + return wa.id < wb.id; }); for( int i = 0; i < active_workers.size() && budget > 0; ++i )