braft源码学习笔记,api介绍

braft架构

braft分为几个板块,我根据自己的理解进行了概述:

ballot:

ballot,ballot_box

选票类,raft的选举leader步骤

cli:

cli,cli_service

客户端,cli用来修改或者获取复制状态机组节点状态,cli_service继承cli

closure:

closure_helper,closure_queue

返回时的信息和报告内容

configuration:

configuration,configuration_manager

配置信息类,peerid类,nodeid类

configuration_manager用来记录和管理configuration条目历史变更

file:

file_reader:读取文件内容

file_service:为状态机增加或者移除一个file_reader

file_system_adaptor:文件系统适配

protobuf_file:

remote_file_copier:远程文件复制,存储使用快照

fsm_caller:

复制状态机,发生事件时的操作

fsync:

参数选择内存数据落到磁盘的方式,直接调用mingw函数

lease:

作为leader节点和follower节点的状态

log:

log:日志类,log定义和LogStorage定义

log_entry:每条日志条目

log_manager:用于管理日志条目

memory_log:日志条目索引相关操作

node:

node:节点类,每一个node是一个复制状态机的节点实例

node_manager:node节点管理

raft(核心):

raft:定义task,状态机操作,节点参数,状态机参数等

raft_meta:

raft_service

repeated_timer_task:

重复任务计时器

replicator:

leader,follower之间的信息复制

route_table:

一张通信表,存多个复制组,可获取每个复制组leader,更新组配置,等

snapshot:

snapshot:快照类,

snapshot_executor:快照执行操作

snapshot_throttle:大容量磁盘读/写

storage:

存储类,包含元数据存储,log存储,快照存储,稳定存储等

util:

放一些常用的公用方法

 

之后对我认为比较重要的,或者官方文档中出现的头文件进行注释翻译

configuration.h

 

变量名 类型 说明
GroupId

typedef std::string

raft组名

VersionedGroupId

typedef std::string

GroupId加个版本号

 {group_id}_{index}

=======struct PeerId:=======

butil::EndPoint addr;//就是ip+port

int idx;//idx算是下标号,默认0

除了构造函数外,

reset():初始化值为0

is_empty():都为0时认为是空的

parse():解析字符串并赋值

to_string():将值转成字符串,ip:port:idx

<,==,!=,<<操作符被重载

=======struct NodeId:=======

GroupId group_id;//存组名

PeerId peer_id;//存一个peerid

有一个两值都传的构造函数

to_string():将值转成字符串,group_id:ip:port:idx

<,==,!=,<<操作符被重载

=======class Configuration:=======

std::set<PeerId> _peers;//是一个peers集合

typedef std::set<PeerId>::const_iterator const_iterator;//一个循环集合的迭代器

两个构造函数,可以用vector和set来构造

重载了=符号(赋值)

void reset():清空集合

bool empty():是否为空

size_t size() :返回大小

const_iterator begin() / end():返回迭代器头部 / 迭代器尾部

void list_peers(std::set<PeerId>* peers) / list_peers(std::vector<PeerId>* peers):使用参数替换掉当前集合

void append_peers(std::set<PeerId>* peers):将一系列集合插入到当前集合

bool add_peer(const PeerId& peer):插入一个新节点并判断是否插入成功(是否为新peer)

bool remove_peer(const PeerId& peer):移除节点,并判断是否移除

bool contains(const PeerId& peer_id) /contains(const std::vector<PeerId>& peers):判断是否存在这些peer

bool equals(const std::vector<PeerId>& peers) / equals(const Configuration& rhs): 判断是否和参数匹配

void diffs(const Configuration& rhs,

               Configuration* included,

               Configuration* excluded):得到当前值和rhs的不同,included为this-rhs,excluded为rhs-this

int parse_from(butil::StringPiece conf):从字符串解析并赋值(peerid之间用,隔开)

重载了<<输出符号,输出peerid,用逗号隔开

raft.h

#ifndef BRAFT_RAFT_H
#define BRAFT_RAFT_H
//一堆头文件
#include <string>

#include <butil/logging.h>
#include <butil/iobuf.h>
#include <butil/status.h>
#include <brpc/callback.h>
#include "braft/configuration.h"
#include "braft/enum.pb.h"
#include "braft/errno.pb.h"

template <typename T> class scoped_refptr;//一个模板类scoped_refptr

namespace brpc {
class Server;
}  // namespace brpc

namespace braft {
//给出这些类的声明,定义在其他c文件中
class SnapshotWriter;//快照写
class SnapshotReader;//快照读
class SnapshotHook;//
class LeaderChangeContext;//leader变更信息
class FileSystemAdaptor;//文件适配器
class SnapshotThrottle;//快照大磁盘
class LogStorage;//log存储
//给出一个默认值,会用来做初始化
const PeerId ANY_PEER(butil::EndPoint(butil::IP_ANY, 0), 0);

// 特定于raft的closure(返回报告),包含一个butil :: Status以报告操作是否成功。
class Closure : public google::protobuf::Closure {
public://两个获取status值的函数
    butil::Status& status() { return _st; }
    const butil::Status& status() const { return _st; }
    
private:
    butil::Status _st;//status
};

// 描述一个特定的错误
class Error {
public:
    //构造函数
    Error() : _type(ERROR_TYPE_NONE) {}
    Error(const Error& e) : _type(e._type), _st(e._st) {}
    //返回值
    ErrorType type() const { return _type; }
    const butil::Status& status() const { return _st; }
    butil::Status& status() { return _st; }
    //设置error类型
    void set_type(ErrorType type) { _type = type; }
    //重载赋值号
    Error& operator=(const Error& rhs) {
        _type = rhs._type;
        _st = rhs._st;
        return *this;
    }
private:
    // 需要赋值
    ErrorType _type;
    butil::Status _st;
};
//将error类型转为字符串
inline const char* errortype2str(ErrorType t) {
    switch (t) {
    case ERROR_TYPE_NONE:
        return "None";
    case ERROR_TYPE_LOG:
        return "LogError";
    case ERROR_TYPE_STABLE:
        return "StableError";
    case ERROR_TYPE_SNAPSHOT:
        return "SnapshotError";
    case ERROR_TYPE_STATE_MACHINE:
        return "StateMachineError";
    }
    return "Unknown";
}
//重载输出符号
inline std::ostream& operator<<(std::ostream& os, const Error& e) {
    os << "{type=" << errortype2str(e.type()) 
       << ", error_code=" << e.status().error_code()
       << ", error_text=`" << e.status().error_cstr()
       << "'}";
    return os;
}

// libraft的基本消息结构
struct Task {//任务
    Task() : data(NULL), done(NULL), expected_term(-1) {}//构造函数

    // 数据应用于状态机
    butil::IOBuf* data;

    // 当数据应用于状态机或发生错误时继续。
    Closure* done;

    // 如果expected_term与当前值不匹配,则拒绝此任务
    // 此节点,如果值不为-1
    // 默认值:-1
    int64_t expected_term;
};

class IteratorImpl;//类声明

// Iterator over a batch of committed tasks
//
// Example:
// void YouStateMachine::on_apply(braft::Iterator& iter) {
//     for (; iter.valid(); iter.next()) {
//         brpc::ClosureGuard done_guard(iter.done());
//         process(iter.data());
//     }
// }
class Iterator {
    DISALLOW_COPY_AND_ASSIGN(Iterator);//关闭隐式调用构造函数
public:
    // 移至下一个任务。
    void next();

   
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aiky哇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值