22#include <glog/logging.h>
25#include "platform/proto/broadcast.pb.h"
31bool ReplicaExisted(
const ReplicaInfo& replica_info,
32 const std::vector<ReplicaInfo>& replicas) {
33 for (
auto& rep : replicas) {
34 if (rep.id() == replica_info.id()) {
46 verifier_ = std::make_unique<SignatureVerifier>(
62 return bc_client_.get();
73 if (heartbeat_thread_.joinable()) {
74 heartbeat_thread_.join();
82 std::thread(&ConsensusManager::HeartBeat,
this);
87void ConsensusManager::HeartBeat() {
88 LOG(INFO) <<
"heart beat start";
91 std::condition_variable cv;
96 LOG(ERROR) <<
"all replicas:" << replicas.size();
98 HeartBeatInfo hb_info;
99 for (
const auto& key :
keys) {
100 *hb_info.add_public_keys() = key;
102 for (
const auto& client : client_replicas) {
103 replicas.push_back(client);
106 if (client ==
nullptr) {
114 .type() == CertificateKeyInfo::REPLICA) {
119 <<
" is ready:" << is_ready_
120 <<
" client size:" << client_replicas.size()
121 <<
" svr size:" << replicas.size();
124 request.set_type(Request::TYPE_HEART_BEAT);
125 request.mutable_region_info()->set_region_id(
127 hb_info.SerializeToString(request.mutable_data());
129 int ret = client->SendHeartBeat(request);
132 <<
" sends HB fail:" << ret;
134 std::unique_lock<std::mutex> lk(mutex);
135 cv.wait_for(lk, std::chrono::microseconds(sleep_time * 1000000),
152 std::unique_ptr<DataInfo> request_info) {
155 ResDBMessage message;
156 if (!message.ParseFromArray(request_info->buff, request_info->data_len)) {
157 LOG(ERROR) <<
"parse data info fail";
162 if (message.has_signature() &&
verifier_) {
163 bool valid =
verifier_->VerifyMessage(message.data(), message.signature());
165 LOG(ERROR) <<
"request is not valid:"
166 << message.signature().DebugString();
167 LOG(ERROR) <<
" msg:" << message.data().size();
173 std::unique_ptr<Request> request = std::make_unique<Request>();
174 if (!request->ParseFromString(message.data())) {
175 LOG(ERROR) <<
"parse data info fail";
180 if (!request->SerializeToString(&tmp)) {
186 context->signature = message.signature();
190 return Dispatch(std::move(context), std::move(request));
196 std::unique_ptr<Request> request) {
197 if (request->type() == Request::TYPE_HEART_BEAT) {
204 std::unique_ptr<Request> request) {
206 HeartBeatInfo hb_info;
207 if (!hb_info.ParseFromString(request->data())) {
208 LOG(ERROR) <<
"parse replica info fail\n";
212 LOG(INFO) <<
"receive public size:" << hb_info.public_keys().size()
213 <<
" primary:" << hb_info.primary()
214 <<
" version:" << hb_info.version()
215 <<
" from region:" << request->region_info().region_id();
217 if (request->region_info().region_id() ==
222 .type() == CertificateKeyInfo::CLIENT) {
224 SetPrimary(hb_info.primary(), hb_info.version());
230 for (
const auto& public_key : hb_info.public_keys()) {
232 LOG(ERROR) <<
"set public key fail from:"
233 << public_key.public_key_info().node_id();
236 if (request->region_info().region_id() !=
244 info.set_ip(public_key.public_key_info().ip());
245 info.set_port(public_key.public_key_info().port());
246 info.set_id(public_key.public_key_info().node_id());
247 if (info.ip().empty()) {
248 LOG(ERROR) <<
"public doesn't have ip, skip";
253 if (public_key.public_key_info().type() == CertificateKeyInfo::REPLICA) {
255 if (!ReplicaExisted(info, replicas)) {
259 if (!ReplicaExisted(info, clients_)) {
267 "=====================";
274 std::unique_ptr<Request> request) {
284 std::vector<ReplicaInfo> ret;
285 for (
const auto& r : config_data.region()) {
286 for (
const auto& replica : r.replica_info()) {
287 ret.push_back(replica);
294 int ret = bc_client_->SendMessage(request);
296 LOG(ERROR) <<
"broadcast request fail:";
303 ReplicaInfo target_replica;
304 for (
const auto& replica : replicas) {
305 if (replica.id() == node_id) {
306 target_replica = replica;
311 if (target_replica.ip().empty()) {
315 int ret = bc_client_->SendMessage(message, target_replica);
317 LOG(ERROR) <<
"broadcast request fail:";
322 const std::vector<ReplicaInfo>& replicas,
bool is_use_long_conn) {
323 return std::make_unique<ReplicaCommunicator>(
334 clients_.push_back(info);
335 bc_client_->UpdateClientReplicas(clients_);
virtual int Process(std::unique_ptr< Context > context, std::unique_ptr< DataInfo > request_info)
std::vector< ReplicaInfo > GetAllReplicas()
virtual void BroadCast(const Request &request)
int ProcessHeartBeat(std::unique_ptr< Context > context, std::unique_ptr< Request > request)
virtual int ConsensusCommit(std::unique_ptr< Context > context, std::unique_ptr< Request > request)
virtual ~ConsensusManager()
virtual void SetPrimary(uint32_t primary, uint64_t version)
virtual void SendMessage(const google::protobuf::Message &message, int64_t node_id)
virtual uint32_t GetPrimary()
void UpdateBroadCastClient()
ConsensusManager(const ResDBConfig &config)
virtual std::vector< ReplicaInfo > GetClientReplicas()
SignatureVerifier * GetSignatureVerifier()
ReplicaCommunicator * GetBroadCastClient()
virtual std::vector< ReplicaInfo > GetReplicas()=0
virtual void AddNewReplica(const ReplicaInfo &info)
virtual int Dispatch(std::unique_ptr< Context > context, std::unique_ptr< Request > request)
void AddNewClient(const ReplicaInfo &info)
std::unique_ptr< SignatureVerifier > verifier_
virtual std::unique_ptr< ReplicaCommunicator > GetReplicaClient(const std::vector< ReplicaInfo > &replicas, bool is_use_long_conn=false)
virtual uint32_t GetVersion()
uint32_t GetOutputWorkerNum() const
int GetMinDataReceiveNum() const
ResConfigData GetConfigData() const
uint32_t GetTcpBatchNum() const
CertificateInfo GetPublicKeyCertificateInfo() const
const ReplicaInfo & GetSelfInfo() const
bool SignatureVerifierEnabled()
const std::vector< ReplicaInfo > & GetReplicaInfos() const
KeyInfo GetPrivateKey() const
virtual bool IsRunning() const
std::unique_ptr< ResDBConfig > config_