in platform/networkstrate/consensus_manager.cpp [163:204]
int ConsensusManager::Process(std::unique_ptr<Context> context,
std::unique_ptr<DataInfo> request_info) {
global_stats_->IncClientCall();
// Decode the whole message, it includes the certificate and data.
ResDBMessage message;
if (!message.ParseFromArray(request_info->buff, request_info->data_len)) {
LOG(ERROR) << "parse data info fail";
return -1;
}
std::unique_ptr<Request> request = std::make_unique<Request>();
if (!request->ParseFromString(message.data())) {
LOG(ERROR) << "parse data info fail";
return -1;
}
if (request->type() == Request::TYPE_HEART_BEAT) {
return Dispatch(std::move(context), std::move(request));
}
// Check if the certificate is valid.
if (message.has_signature() && verifier_) {
bool valid = verifier_->VerifyMessage(message.data(), message.signature());
if (!valid) {
LOG(ERROR) << "request is not valid:"
<< message.signature().DebugString();
LOG(ERROR) << " msg:" << message.data().size()
<< " is recovery:" << request->is_recovery();
return -2;
}
} else {
}
// forward the signature to the request so that it can be included in the
// request/response set if needed.
context->signature = message.signature();
// LOG(ERROR) << "======= server:" << config_.GetSelfInfo().id()
// << " get request type:" << request->type()
// << " from:" << request->sender_id();
return Dispatch(std::move(context), std::move(request));
}