Loading...
Searching...
No Matches
consensus_manager.h
Go to the documentation of this file.
1/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19
20#pragma once
21
22#include <thread>
23
28#include "platform/proto/replica_info.pb.h"
29#include "platform/proto/resdb.pb.h"
31
32namespace resdb {
33
34// ConsensusManager is an consensus algorithm implimentation.
35// It receives the messages from ResDBServer and running a consensus algorithm
36// like PBFT to commit.
38 public:
39 ConsensusManager(const ResDBConfig& config);
40 virtual ~ConsensusManager();
41
42 // Process a request receied from ResDBServer.
43 // context contains the client socket and request_info contains the data
44 // received from the network.
45 virtual int Process(std::unique_ptr<Context> context,
46 std::unique_ptr<DataInfo> request_info);
47
48 bool IsReady() const;
49 void Stop();
50
51 // Should be called by the instance or test.
52 void Start();
53
54 protected:
55 // BroadCast will generate signatures whiling sending data to other replicas.
56 virtual void BroadCast(const Request& request);
57 virtual void SendMessage(const google::protobuf::Message& message,
58 int64_t node_id);
59
60 virtual int Dispatch(std::unique_ptr<Context> context,
61 std::unique_ptr<Request> request);
62 virtual int ConsensusCommit(std::unique_ptr<Context> context,
63 std::unique_ptr<Request> request);
64
65 // =============== default function ======================
66 int ProcessClientCert(std::unique_ptr<Context> context,
67 std::unique_ptr<Request> request);
68 int ProcessHeartBeat(std::unique_ptr<Context> context,
69 std::unique_ptr<Request> request);
70 // =======================================================
71
72 virtual std::unique_ptr<ReplicaCommunicator> GetReplicaClient(
73 const std::vector<ReplicaInfo>& replicas, bool is_use_long_conn = false);
74
75 virtual std::vector<ReplicaInfo> GetReplicas() = 0;
76 std::vector<ReplicaInfo> GetAllReplicas();
77 virtual std::vector<ReplicaInfo> GetClientReplicas();
78 virtual void AddNewReplica(const ReplicaInfo& info);
79 virtual uint32_t GetPrimary();
80 virtual uint32_t GetVersion();
81 virtual void SetPrimary(uint32_t primary, uint64_t version);
82 void AddNewClient(const ReplicaInfo& info);
83
85 // Update broad cast client to reflush the replica list.
87
89
90 private:
91 void HeartBeat();
92 void BroadCastThread();
93
94 protected:
96 std::unique_ptr<SignatureVerifier> verifier_;
97 struct QueueItem {
98 std::unique_ptr<Request> request;
99 std::vector<ReplicaInfo> replicas;
100 };
101
102 private:
103 std::thread heartbeat_thread_;
104 std::atomic<bool> is_ready_ = false;
105 std::unique_ptr<ReplicaCommunicator> bc_client_;
106 std::vector<ReplicaInfo> clients_;
107 Stats* global_stats_;
108};
109
110} // namespace resdb
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 void SetPrimary(uint32_t primary, uint64_t version)
virtual void SendMessage(const google::protobuf::Message &message, int64_t node_id)
virtual uint32_t GetPrimary()
virtual std::vector< ReplicaInfo > GetClientReplicas()
SignatureVerifier * GetSignatureVerifier()
int ProcessClientCert(std::unique_ptr< Context > context, std::unique_ptr< Request > request)
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()
std::unique_ptr< Request > request
std::vector< ReplicaInfo > replicas