From 53a9fa0b2b91e67f697f3722a501c3de062d10da Mon Sep 17 00:00:00 2001 From: paularchard <42632062+paularchard@users.noreply.github.com> Date: Fri, 14 Dec 2018 08:49:21 -0800 Subject: [PATCH] KEP-901: Request forwarded to dead primary causes endless viewchange loop (#198) --- pbft/pbft_failure_detector.cpp | 7 ++++++- pbft/test/pbft_failure_detector_test.cpp | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/pbft/pbft_failure_detector.cpp b/pbft/pbft_failure_detector.cpp index f5ff35da..f9c4c3c4 100644 --- a/pbft/pbft_failure_detector.cpp +++ b/pbft/pbft_failure_detector.cpp @@ -42,7 +42,12 @@ pbft_failure_detector::handle_timeout(boost::system::error_code /*ec*/) if (this->completed_requests.count(this->ordered_requests.front()) == 0) { LOG(error) << "Failure detector detected unexecuted request " << this->ordered_requests.front() << '\n'; - this->start_timer(); + this->ordered_requests.pop_front(); + if (this->ordered_requests.size() > 0) + { + this->start_timer(); + } + this->io_context->post(std::bind(this->failure_handler)); return; } diff --git a/pbft/test/pbft_failure_detector_test.cpp b/pbft/test/pbft_failure_detector_test.cpp index f9c0ee12..8c5193d9 100644 --- a/pbft/test/pbft_failure_detector_test.cpp +++ b/pbft/test/pbft_failure_detector_test.cpp @@ -125,9 +125,9 @@ namespace ASSERT_TRUE(this->failure_detected); } - TEST_F(pbft_failure_detector_test, timeout_restarts_timer) + TEST_F(pbft_failure_detector_test, timeout_doesnt_restart_timer) { - EXPECT_CALL(*(this->request_timer), expires_from_now(_)).Times(Exactly(2)); + EXPECT_CALL(*(this->request_timer), expires_from_now(_)).Times(Exactly(1)); this->build_failure_detector(); this->failure_detector->request_seen(req_a);