in platform/consensus/ordering/pbft/consensus_manager_pbft.cpp [139:184]
int ConsensusManagerPBFT::ConsensusCommit(std::unique_ptr<Context> context,
std::unique_ptr<Request> request) {
// LOG(INFO) << "recv impl type:" << request->type() << " "
// << "sender id:" << request->sender_id();
// If it is in viewchange, push the request to the queue
// for the requests from the new view which come before
// the local new view done.
recovery_->AddRequest(context.get(), request.get());
if (config_.GetConfigData().enable_viewchange()) {
view_change_manager_->MayStart();
if (view_change_manager_->IsInViewChange()) {
switch (request->type()) {
case Request::TYPE_NEW_TXNS:
case Request::TYPE_PRE_PREPARE:
case Request::TYPE_PREPARE:
case Request::TYPE_COMMIT:
AddPendingRequest(std::move(context), std::move(request));
return 0;
}
} else {
while (true) {
auto new_request = PopPendingRequest();
if (!new_request.ok()) {
break;
}
InternalConsensusCommit(std::move((*new_request).first),
std::move((*new_request).second));
}
}
}
int ret = InternalConsensusCommit(std::move(context), std::move(request));
if (config_.GetConfigData().enable_viewchange()) {
if (ret == -4) {
while (true) {
auto new_request = PopComplainedRequest();
if (!new_request.ok()) {
break;
}
// LOG(ERROR) << "[POP COMPLAINED REQUEST]";
InternalConsensusCommit(std::move((*new_request).first),
std::move((*new_request).second));
}
}
}
return ret;
}