91 lines
2.8 KiB
C++
91 lines
2.8 KiB
C++
/************************************************************************
|
|
*
|
|
* Copyright (c) 2016 Alibaba.com, Inc. All Rights Reserved
|
|
* $Id: single_leader.h,v 1.0 05/08/2017 3:42:01 PM jarry.zj(jarry.zj@alibaba-inc.com) $
|
|
*
|
|
************************************************************************/
|
|
|
|
/**
|
|
* @file single_leader.h
|
|
* @author jarry.zj(jarry.zj@alibaba-inc.com)
|
|
* @date 05/08/2017 3:42:01 PM
|
|
* @version 1.0
|
|
* @brief
|
|
*
|
|
**/
|
|
|
|
#ifndef CONSENSUS_INCLUDE_SINGLE_LEADER_H_
|
|
#define CONSENSUS_INCLUDE_SINGLE_LEADER_H_
|
|
|
|
#include <memory>
|
|
#include <atomic>
|
|
#include "consensus.h"
|
|
#include "paxos.pb.h"
|
|
|
|
namespace alisql {
|
|
|
|
/*
|
|
* singleLeader
|
|
*
|
|
* no heartbeat, send msg to the only learner, no changemember
|
|
*/
|
|
|
|
class MemPaxosLog;
|
|
class LearnerServer;
|
|
|
|
class SingleLeader : public Consensus
|
|
{
|
|
public:
|
|
SingleLeader(uint64_t clusterId);
|
|
|
|
virtual ~SingleLeader() { shutdown(); }
|
|
void init(int port, std::string learnerAddr, uint64_t lastLogIndex = 0,
|
|
uint64_t lastTerm = 0, uint64_t cacheSize = 1000, uint64_t ioThreadCnt = 4,
|
|
uint64_t workThreadCnt = 4);
|
|
virtual uint64_t replicateLog(LogEntry &entry);
|
|
void appendLogToLearner(bool needLock = false);
|
|
uint64_t appendLogFillForEach(PaxosMsg *msg, LearnerServer *server);
|
|
virtual int onAppendLogResponce(PaxosMsg *msg);
|
|
std::shared_ptr<MemPaxosLog> getLog() {return log_;}
|
|
virtual uint64_t getClusterId() {return clusterId_.load();}
|
|
uint64_t getLearnerMatchIndex();
|
|
uint64_t getLastLogIndex();
|
|
|
|
/* functions not use */
|
|
virtual int onAppendLogSendFail(PaxosMsg *msg, uint64_t *newId) {return 0;}
|
|
virtual int onAppendLog(PaxosMsg *msg, PaxosMsg *rsp) {return 0;};
|
|
virtual int onRequestVote(PaxosMsg *msg, PaxosMsg *rsp) {return 0;}
|
|
virtual int onRequestVoteResponce(PaxosMsg *msg) {return 0;}
|
|
virtual int onLeaderCommand(PaxosMsg *msg, PaxosMsg *rsp) {return 0;}
|
|
virtual int onLeaderCommandResponce(PaxosMsg *msg) {return 0;}
|
|
virtual int requestVote(bool force) {return 0;}
|
|
virtual int appendLog(const bool needLock) {return 0;} /* only appendLogToLearner */
|
|
virtual int onClusterIdNotMatch(PaxosMsg *msg) {return 0;}
|
|
virtual int onMsgPreCheck(PaxosMsg *msg, PaxosMsg *rsp) {return 0;}
|
|
virtual int onMsgPreCheckFailed(PaxosMsg *msg) {return 0;}
|
|
virtual int setClusterId(uint64_t ci) {return 0;}
|
|
virtual bool isShutdown() {return false;}
|
|
|
|
protected:
|
|
void stop();
|
|
void shutdown();
|
|
|
|
std::shared_ptr<Service> srv_;
|
|
std::shared_ptr<LearnerServer> learnerServer_;
|
|
std::shared_ptr<MemPaxosLog> log_;
|
|
std::atomic<uint64_t> currentTerm_;
|
|
std::atomic<uint64_t> commitIndex_;
|
|
const uint64_t heartbeatTimeout_;
|
|
std::atomic<uint64_t> clusterId_;
|
|
mutable std::mutex lock_;
|
|
uint64_t mockLastIndex_;
|
|
uint64_t mockLastTerm_;
|
|
const static uint64_t maxSystemPacketSize_;
|
|
|
|
friend class LearnerServer;
|
|
};
|
|
|
|
}
|
|
|
|
#endif /* CONSENSUS_INCLUDE_SINGLE_LEADER_H_ */
|