22#include <glog/logging.h>
29 std::unique_ptr<GeoGlobalExecutor> global_executor,
30 const ResDBConfig& config, std::unique_ptr<SystemInfo> system_info,
32 : global_executor_(std::move(global_executor)),
40 std::thread(&GeoPBFTCommitment::PostProcessExecutedMsg,
this);
45 if (executed_thread_.joinable()) {
46 executed_thread_.join();
50bool GeoPBFTCommitment::VerifyCerts(
const BatchUserRequest& request,
51 const std::string& raw_data) {
53 std::string hash = request.hash();
54 for (
const auto& sig : request.committed_certs().committed_certs()) {
57 LOG(ERROR) <<
"sign is not valid:" << sig.DebugString();
65bool GeoPBFTCommitment::AddNewReq(uint64_t seq, uint32_t sender_region) {
66 std::lock_guard<std::mutex> lk(mutex_);
71 auto ret = checklist_[seq % (1 << 20)].insert(sender_region);
75void GeoPBFTCommitment::UpdateSeq(uint64_t seq) {
76 std::lock_guard<std::mutex> lk(mutex_);
83 std::unique_ptr<Request> request) {
84 int sender_region_id = request->region_info().region_id();
85 if (!AddNewReq(request->seq(), sender_region_id)) {
94 BatchUserRequest batch_request;
95 if (!batch_request.ParseFromString(request->data())) {
96 LOG(ERROR) <<
"[GeoGlobalExecutor] parse data fail!";
100 if (!batch_request.has_committed_certs() ||
101 !VerifyCerts(batch_request, request->data())) {
103 LOG(ERROR) <<
"no certs";
109 int self_region_id = config_data.self_region_id();
112 if (sender_region_id != self_region_id) {
113 std::unique_ptr<Request> broadcast_geo_req =
118 replica_communicator_->
BroadCast(*broadcast_geo_req);
120 return global_executor_->OrderGeoRequest(std::move(request));
123int GeoPBFTCommitment::PostProcessExecutedMsg() {
125 auto batch_resp = global_executor_->GetResponseMsg();
126 if (batch_resp ==
nullptr) {
130 request.set_seq(batch_resp->seq());
131 request.set_type(Request::TYPE_RESPONSE);
133 request.set_current_view(batch_resp->current_view());
134 request.set_proxy_id(batch_resp->proxy_id());
135 UpdateSeq(batch_resp->seq());
136 batch_resp->SerializeToString(request.mutable_data());
137 replica_communicator_->
SendMessage(request, request.proxy_id());
MockReplicaCommunicator replica_communicator_
int GeoProcessCcm(std::unique_ptr< Context > context, std::unique_ptr< Request > request)
GeoPBFTCommitment(std::unique_ptr< GeoGlobalExecutor > global_executor, const ResDBConfig &config, std::unique_ptr< SystemInfo > system_info_, ReplicaCommunicator *replica_communicator_, SignatureVerifier *verifier)
virtual void BroadCast(const google::protobuf::Message &message)
virtual int SendMessage(const google::protobuf::Message &message)
ResConfigData GetConfigData() const
const ReplicaInfo & GetSelfInfo() const
virtual bool VerifyMessage(const std::string &message, const SignatureInfo &sign)
static Stats * GetGlobalStats(int sleep_seconds=5)
MockSignatureVerifier verifier_
std::unique_ptr< Request > NewRequest(Request::Type type, const Request &request, int sender_id)
std::unique_ptr< ResDBConfig > config_