22#include <glog/logging.h>
53 std::function<
bool(
const Request& request)> func) {
62 std::unique_ptr<Request> user_request) {
63 if (context ==
nullptr || context->signature.signature().empty()) {
64 LOG(ERROR) <<
"user request doesn't contain signature, reject";
70 LOG(ERROR) <<
"This request is already executed with seq: " << seq;
71 user_request->set_seq(seq);
84 std::lock_guard<std::mutex> lk(
rc_mutex_);
86 std::make_pair(std::move(context), std::move(user_request)));
101 user_request->data_signature());
103 LOG(ERROR) <<
"request is not valid:"
104 << user_request->data_signature().DebugString();
105 LOG(ERROR) <<
" msg:" << user_request->data().size();
110 LOG(ERROR) <<
" check by the user func fail";
116 LOG(ERROR) <<
"duplicate check fail:";
127 request.set_type(Request::TYPE_RESPONSE);
129 request.set_proxy_id(user_request->proxy_id());
131 request.set_hash(user_request->hash());
137 user_request->set_type(Request::TYPE_PRE_PREPARE);
139 user_request->set_seq(*seq);
151 std::unique_ptr<Request> request) {
152 if (context ==
nullptr || context->signature.signature().empty()) {
153 LOG(ERROR) <<
"user request doesn't contain signature, reject";
156 if (request->is_recovery()) {
157 if (
static_cast<int64_t
>(request->seq()) >=
166 LOG(ERROR) <<
"the request is not from primary. sender:"
167 << request->sender_id() <<
" seq:" << request->seq();
181 LOG(ERROR) <<
" check by the user func fail";
184 BatchUserRequest batch_request;
185 batch_request.ParseFromString(request->data());
186 batch_request.clear_createtime();
188 batch_request.SerializeToString(&
data);
193 LOG(ERROR) <<
"request is not valid:"
194 << request->data_signature().DebugString();
195 LOG(ERROR) <<
" msg:" << request->data().size();
199 LOG(INFO) <<
"The request is already proposed, reject";
207 prepare_request->clear_data();
222 std::unique_ptr<Request> request) {
223 if (context ==
nullptr || context->signature.signature().empty()) {
224 LOG(ERROR) <<
"user request doesn't contain signature, reject";
227 if (request->is_recovery()) {
234 commit_request->mutable_data_signature()->Clear();
238 uint64_t seq_ = request->seq();
248 if (!signature_or.ok()) {
249 LOG(ERROR) <<
"Sign message fail";
252 *commit_request->mutable_data_signature() = *signature_or;
263 std::unique_ptr<Request> request) {
264 if (context ==
nullptr || context->signature.signature().empty()) {
265 LOG(ERROR) <<
"user request doesn't contain signature, reject"
266 <<
" context:" << (context ==
nullptr);
269 if (request->is_recovery()) {
287 if (batch_resp ==
nullptr) {
291 request.set_hash(batch_resp->hash());
292 request.set_seq(batch_resp->seq());
293 request.set_type(Request::TYPE_RESPONSE);
295 request.set_current_view(batch_resp->current_view());
296 request.set_proxy_id(batch_resp->proxy_id());
297 request.set_primary_id(batch_resp->primary_id());
299 batch_resp->SerializeToString(request.mutable_data());
MockReplicaCommunicator replica_communicator_
MessageManager * message_manager_
std::thread executed_thread_
ReplicaCommunicator * replica_communicator_
virtual int ProcessCommitMsg(std::unique_ptr< Context > context, std::unique_ptr< Request > request)
std::atomic< bool > stop_
DuplicateManager * GetDuplicateManager()
virtual int PostProcessExecutedMsg()
Commitment(const ResDBConfig &config, MessageManager *message_manager, ReplicaCommunicator *replica_communicator, SignatureVerifier *verifier)
virtual int ProcessNewRequest(std::unique_ptr< Context > context, std::unique_ptr< Request > user_request)
SignatureVerifier * verifier_
virtual int ProcessProposeMsg(std::unique_ptr< Context > context, std::unique_ptr< Request > request)
void SetPreVerifyFunc(std::function< bool(const Request &request)> func)
std::function< bool(const Request &request)> pre_verify_func_
std::queue< std::pair< std::unique_ptr< Context >, std::unique_ptr< Request > > > request_complained_
virtual int ProcessPrepareMsg(std::unique_ptr< Context > context, std::unique_ptr< Request > request)
void SetNeedCommitQC(bool need_qc)
std::unique_ptr< DuplicateManager > duplicate_manager_
void SetDuplicateManager(DuplicateManager *manager)
absl::StatusOr< uint64_t > AssignNextSeq()
uint64_t GetHighestPreparedSeq()
void SendResponse(std::unique_ptr< Request > request)
uint64_t GetCurrentView() const
void SetHighestPreparedSeq(uint64_t seq)
CollectorResultCode AddConsensusMsg(const SignatureInfo &signature, std::unique_ptr< Request > request)
int64_t GetCurrentPrimary() const
std::unique_ptr< BatchUserResponse > GetResponseMsg()
void SetNextSeq(uint64_t seq)
virtual void BroadCast(const google::protobuf::Message &message)
virtual int SendMessage(const google::protobuf::Message &message)
const ReplicaInfo & GetSelfInfo() const
virtual absl::StatusOr< SignatureInfo > SignMessage(const std::string &message)
virtual bool VerifyMessage(const std::string &message, const SignatureInfo &sign)
static Stats * GetGlobalStats(int sleep_seconds=5)
std::unique_ptr< MessageManager > message_manager_
MockSignatureVerifier verifier_
std::unique_ptr< Request > NewRequest(Request::Type type, const Request &request, int sender_id)
std::unique_ptr< ResDBConfig > config_