70 std::unique_ptr<Request> request,
const SignatureInfo& signature,
73 std::atomic<TransactionStatue>* status,
bool force)>
75 if (request ==
nullptr) {
76 LOG(ERROR) <<
"request empty";
80 int32_t sender_id = request->sender_id();
81 std::string hash = request->hash();
82 int type = request->type();
83 uint64_t seq = request->seq();
84 uint64_t view = request->current_view();
92 if (seq_ !=
static_cast<uint64_t
>(request->seq())) {
98 if (is_main_request) {
99 auto request_info = std::make_unique<RequestInfo>();
100 request_info->signature = signature;
101 request_info->request = std::move(request);
103 if (view_ && view_ < view && !is_prepared_) {
105 atomic_mian_request_.Clear();
107 int ret = atomic_mian_request_.Set(request_info);
109 other_main_request_.insert(std::move(request_info));
110 LOG(ERROR) <<
"set main request fail: data existed:" << seq
114 auto main_request = atomic_mian_request_.Reference();
115 if (main_request->request ==
nullptr) {
116 LOG(ERROR) <<
"set main request data fail";
120 call_back(*main_request->request.get(), 1,
nullptr, &status_, force);
123 if (enable_viewchange_) {
124 if (type == Request::TYPE_PREPARE) {
126 auto request_info = std::make_unique<RequestInfo>();
127 request_info->signature = signature;
128 request_info->request = std::make_unique<Request>(*request);
129 std::lock_guard<std::mutex> lk(mutex_);
133 prepared_proof_.push_back(std::move(request_info));
134 if (senders_[type].count(hash) == 0) {
135 senders_[type].insert(std::make_pair(hash, std::bitset<128>()));
137 senders_[type][hash][sender_id] = 1;
138 call_back(*request, senders_[type][hash].count(),
nullptr, &status_,
142 if (atomic_mian_request_.Reference() !=
nullptr &&
143 atomic_mian_request_.Reference()->request->hash() != hash) {
144 atomic_mian_request_.Clear();
145 for (
auto it = other_main_request_.begin();
146 it != other_main_request_.end(); it++) {
147 if ((*it)->request->hash() == hash) {
148 auto request_info = std::make_unique<RequestInfo>();
149 request_info->signature = (*it)->signature;
150 request_info->request = std::move((*it)->request);
151 atomic_mian_request_.Set(request_info);
155 other_main_request_.clear();
158 for (
size_t i = 0; i < prepared_proof_.size(); i++) {
159 if (prepared_proof_[i]->request->hash() == hash) {
160 prepared_proof_[pos++] = std::move(prepared_proof_[i]);
163 prepared_proof_.erase(prepared_proof_.begin() + pos,
164 prepared_proof_.end());
170 if (request->type() == Request::TYPE_COMMIT) {
171 if (request->has_data_signature() &&
172 request->data_signature().node_id() > 0) {
173 std::lock_guard<std::mutex> lk(mutex_);
174 LOG(ERROR) <<
"add qc signature";
175 commit_certs_.push_back(request->data_signature());
180 std::lock_guard<std::mutex> lk(mutex_);
181 if (senders_[type].count(hash) == 0) {
182 senders_[type].insert(std::make_pair(hash, std::bitset<128>()));
184 senders_[type][hash][sender_id] = 1;
185 call_back(*request, senders_[type][hash].count(),
nullptr, &status_,