diff options
author | Determinant <[email protected]> | 2018-08-07 17:27:57 -0400 |
---|---|---|
committer | Determinant <[email protected]> | 2018-08-07 17:27:57 -0400 |
commit | 062a1368abaa44585dcc4ea9b11e46708dbb418c (patch) | |
tree | 6ea1955ed1c81c93ee725c650fb4335454971afb | |
parent | 086e37788e16ddf62c0676a223002a3ea1b6d2e0 (diff) |
sticky pace maker seems to work
-rw-r--r-- | include/hotstuff/liveness.h | 31 | ||||
-rw-r--r-- | src/consensus.cpp | 10 | ||||
-rw-r--r-- | src/hotstuff_app.cpp | 2 |
3 files changed, 27 insertions, 16 deletions
diff --git a/include/hotstuff/liveness.h b/include/hotstuff/liveness.h index 3d3137a..3d5a457 100644 --- a/include/hotstuff/liveness.h +++ b/include/hotstuff/liveness.h @@ -209,8 +209,8 @@ class PMStickyProposer: virtual public PaceMaker { void reg_follower_receive_proposal() { pm_wait_receive_proposal.reject(); - pm_wait_receive_proposal = - hsc->async_wait_receive_proposal().then( + (pm_wait_receive_proposal = hsc->async_wait_receive_proposal()) + .then( salticidae::generic_bind( &PMStickyProposer::follower_receive_proposal, this, _1)); } @@ -251,7 +251,7 @@ class PMStickyProposer: virtual public PaceMaker { void reg_proposer_propose() { pm_wait_propose.reject(); - pm_wait_propose = hsc->async_wait_propose().then( + (pm_wait_propose = hsc->async_wait_propose()).then( salticidae::generic_bind( &PMStickyProposer::proposer_propose, this, _1)); } @@ -263,27 +263,34 @@ class PMStickyProposer: virtual public PaceMaker { reg_proposer_propose(); } + void gen() { + DataStream s; + /* FIXME: should extra data be the voter's id? */ + s << hsc->get_id(); + hsc->on_propose(std::vector<command_t>{}, + get_parents(), std::move(s)); + } + void candidate_qc_timeout() { pm_qc_finish.reject(); - hsc->async_wait_propose().then([this](const block_t &blk) { + pm_wait_propose.reject(); + (pm_wait_propose = hsc->async_wait_propose()).then([this](const block_t &blk) { pm_qc_finish.reject(); - pm_qc_finish = hsc->async_qc_finish(blk).then([this]() { + pm_qc_finish = hsc->async_qc_finish(blk).then([this, blk]() { + HOTSTUFF_LOG_INFO("collected QC for %s", std::string(*blk).c_str()); /* managed to collect a QC */ to_proposer(); + gen(); }); }); reset_qc_timer(); - DataStream s; - /* FIXME: should extra data be the voter's id? */ - s << hsc->get_id(); - hsc->on_propose(std::vector<command_t>{}, - get_parents(), std::move(s)); + gen(); } void reg_candidate_receive_proposal() { pm_wait_receive_proposal.reject(); - pm_wait_receive_proposal = - hsc->async_wait_receive_proposal().then( + (pm_wait_receive_proposal = hsc->async_wait_receive_proposal()) + .then( salticidae::generic_bind( &PMStickyProposer::candidate_receive_proposal, this, _1)); } diff --git a/src/consensus.cpp b/src/consensus.cpp index 6505c20..58c0f31 100644 --- a/src/consensus.cpp +++ b/src/consensus.cpp @@ -173,7 +173,7 @@ void HotStuffCore::on_receive_proposal(const Proposal &prop) { #ifdef HOTSTUFF_PROTO_LOG LOG_INFO("now state: %s", std::string(*this).c_str()); #endif - if (bnew->qc_ref) on_qc_finish(bnew); + if (bnew->qc_ref) on_qc_finish(bnew->qc_ref); on_receive_proposal_(prop); do_vote(prop.proposer, Vote(id, @@ -271,11 +271,15 @@ void HotStuffCore::on_qc_finish(const block_t &blk) { } promise_t HotStuffCore::async_wait_propose() { - return propose_waiting; + return propose_waiting.then([](const block_t &blk) { + return blk; + }); } promise_t HotStuffCore::async_wait_receive_proposal() { - return receive_proposal_waiting; + return receive_proposal_waiting.then([](const Proposal &prop) { + return prop; + }); } void HotStuffCore::on_propose_(const block_t &blk) { diff --git a/src/hotstuff_app.cpp b/src/hotstuff_app.cpp index 2b6e0db..3b65649 100644 --- a/src/hotstuff_app.cpp +++ b/src/hotstuff_app.cpp @@ -173,7 +173,7 @@ int main(int argc, char **argv) { auto parent_limit = opt_parent_limit->get(); hotstuff::pacemaker_bt pmaker; if (opt_pace_maker->get() == "sticky") - pmaker = new hotstuff::PaceMakerSticky(parent_limit, 1, ec); + pmaker = new hotstuff::PaceMakerSticky(parent_limit, 5, ec); else pmaker = new hotstuff::PaceMakerDummyFixed(1, parent_limit); |