aboutsummaryrefslogtreecommitdiff
path: root/include/hotstuff
diff options
context:
space:
mode:
Diffstat (limited to 'include/hotstuff')
-rw-r--r--include/hotstuff/liveness.h37
1 files changed, 15 insertions, 22 deletions
diff --git a/include/hotstuff/liveness.h b/include/hotstuff/liveness.h
index 77d4232..404972d 100644
--- a/include/hotstuff/liveness.h
+++ b/include/hotstuff/liveness.h
@@ -235,6 +235,7 @@ class PMStickyProposer: virtual public PaceMaker {
EventContext ec;
/** QC timer or randomized timeout */
Event timer;
+ Event ev_imp;
block_t last_proposed;
/** the proposer it believes */
ReplicaID proposer;
@@ -250,12 +251,6 @@ class PMStickyProposer: virtual public PaceMaker {
promise_t pm_wait_propose;
promise_t pm_qc_finish;
- void reset_qc_timer() {
- timer.del();
- timer.add_with_timeout(qc_timeout);
- HOTSTUFF_LOG_INFO("QC timer reset");
- }
-
void clear_promises() {
pm_wait_receive_proposal.reject();
pm_wait_propose.reject();
@@ -285,9 +280,8 @@ class PMStickyProposer: virtual public PaceMaker {
to_candidate(); /* proposer misbehave */
return;
}
- HOTSTUFF_LOG_INFO("proposer emits new QC");
+ HOTSTUFF_LOG_PROTO("proposer emits new QC");
last_proposed = prop.blk;
- //reset_qc_timer();
}
reg_follower_receive_proposal();
}
@@ -304,6 +298,8 @@ class PMStickyProposer: virtual public PaceMaker {
.then([this, pm]() {
timer.del();
pm.resolve(proposer);
+ timer.add_with_timeout(qc_timeout);
+ HOTSTUFF_LOG_PROTO("QC timer reset");
});
locked = true;
}
@@ -317,7 +313,6 @@ class PMStickyProposer: virtual public PaceMaker {
}
void proposer_propose(const Proposal &prop) {
- reset_qc_timer();
last_proposed = prop.blk;
locked = false;
proposer_schedule_next();
@@ -354,23 +349,24 @@ class PMStickyProposer: virtual public PaceMaker {
propose_elect_block();
}
- void reg_candidate_receive_proposal() {
+ void reg_cp_receive_proposal() {
pm_wait_receive_proposal.reject();
(pm_wait_receive_proposal = hsc->async_wait_receive_proposal())
.then(
salticidae::generic_bind(
- &PMStickyProposer::candidate_receive_proposal, this, _1));
+ &PMStickyProposer::cp_receive_proposal, this, _1));
}
- void candidate_receive_proposal(const Proposal &prop) {
+ void cp_receive_proposal(const Proposal &prop) {
auto _proposer = prop.proposer;
auto &p = last_proposed_by[_proposer];
HOTSTUFF_LOG_PROTO("got block %s from %d", std::string(*prop.blk).c_str(), _proposer);
p.reject();
- (p = hsc->async_qc_finish(prop.blk)).then([this, _proposer]() {
- to_follower(_proposer);
+ (p = hsc->async_qc_finish(prop.blk)).then([this, blk=prop.blk, _proposer]() {
+ if (hsc->get_bqc()->get_qc_ref() == blk)
+ to_follower(_proposer);
});
- reg_candidate_receive_proposal();
+ reg_cp_receive_proposal();
}
/* role transitions */
@@ -383,10 +379,6 @@ class PMStickyProposer: virtual public PaceMaker {
last_proposed = nullptr;
hsc->set_neg_vote(false);
timer.clear();
- //timer = Event(ec, -1, 0, [this](int, short) {
- // /* unable to get a QC in time */
- // to_candidate();
- //});
/* redirect all pending cmds to the new proposer */
while (!pending_beats.empty())
{
@@ -407,6 +399,7 @@ class PMStickyProposer: virtual public PaceMaker {
/* proposer unable to get a QC in time */
to_candidate();
});
+ reg_cp_receive_proposal();
proposer_propose(Proposal(-1, uint256_t(), hsc->get_genesis(), nullptr));
}
@@ -421,17 +414,17 @@ class PMStickyProposer: virtual public PaceMaker {
candidate_qc_timeout();
});
candidate_timeout = qc_timeout;
- reg_candidate_receive_proposal();
+ reg_cp_receive_proposal();
candidate_qc_timeout();
}
protected:
void impeach() override {
if (role == CANDIDATE) return;
- timer = Event(ec, -1, 0, [this](int, short) {
+ ev_imp = Event(ec, -1, 0, [this](int, short) {
to_candidate();
});
- timer.add_with_timeout(0);
+ ev_imp.add_with_timeout(0);
HOTSTUFF_LOG_INFO("schedule to impeach the proposer");
}