目录

Raft Meta Storage 分析文档

系统头文件

  • errno.h

  • butil/time.h
  • butil/logging.h
  • butil/file_util.h

其他外部头文件

    项目内部头文件

    • braft/util.h
    • braft/protobuf_file.h
    • braft/local_storage.pb.h
    • braft/raft_meta.h

    1. 类设计

    MetaStorageManager (单例类)

    管理所有KVBasedMergedMetaStorageImpl实例。

    主要成员函数:

    • register_meta_storage(): 注册新的存储实例
    • get_meta_storage(): 获取已存在的存储实例
    • remove_instance_from_meta_storage(): 移除存储实例

    主要成员变量:

    • _ss_map: 存储实例映射表(DoublyBufferedData)

    混合元数据存储实现,同时使用文件和KV存储。

    • init(): 初始化存储
    • set_term_and_votedfor(): 设置term和投票信息
    • get_term_and_votedfor(): 获取term和投票信息
    • gc_instance(): 垃圾回收实例

    主要成员变量:

      FileBasedSingleMetaStorage

      基于文件的单实例元数据存储。

      主要成员函数:

      • init(): 初始化存储
      • load(): 加载元数据
      • save(): 保存元数据
      • set_term_and_votedfor(): 设置term和投票信息
      • get_term_and_votedfor(): 获取term和投票信息

      主要成员变量:

      • _term: 当前任期
      • _votedfor: 投票给谁
      • _path: 存储路径

      基于KV存储的合并元数据存储。

      • init(): 初始化存储
      • set_term_and_votedfor(): 设置term和投票信息
      • get_term_and_votedfor(): 获取term和投票信息
      • delete_meta(): 删除元数据

      主要成员变量:

        KVBasedMergedMetaStorageImpl

        KV存储的具体实现类。

        主要成员函数:

        • init(): 初始化存储
        • set_term_and_votedfor(): 设置term和投票信息
        • get_term_and_votedfor(): 获取term和投票信息
        • delete_meta(): 删除元数据
        • run_tasks(): 执行批量写入任务

        主要成员变量:

        • _db: leveldb实例
        • _queue_id: 任务队列ID
        • _path: 存储路径

        类图

        classDiagram class RaftMetaStorage { <<interface>> +init() +set_term_and_votedfor() +get_term_and_votedfor() } class MetaStorageManager { -ss_map +register_meta_storage() +get_meta_storage() +remove_instance_from_meta_storage() } class MixedMetaStorage { -single_impl -merged_impl +init() +set_term_and_votedfor() +get_term_and_votedfor() } class FileBasedSingleMetaStorage { -term -votedfor -path +init() +set_term_and_votedfor() +get_term_and_votedfor() } class KVBasedMergedMetaStorage { -merged_impl +init() +set_term_and_votedfor() +get_term_and_votedfor() +delete_meta() } class KVBasedMergedMetaStorageImpl { -db -queue_id -path +init() +set_term_and_votedfor() +get_term_and_votedfor() +delete_meta() } RaftMetaStorage <|-- MixedMetaStorage RaftMetaStorage <|-- FileBasedSingleMetaStorage RaftMetaStorage <|-- KVBasedMergedMetaStorage MixedMetaStorage --> FileBasedSingleMetaStorage MixedMetaStorage --> KVBasedMergedMetaStorageImpl KVBasedMergedMetaStorage --> KVBasedMergedMetaStorageImpl MetaStorageManager --> KVBasedMergedMetaStorageImpl

        2. 处理流程

        主要处理流程

        1. 元数据存储初始化流程
        flowchart TD A[开始] --> B{检查是否已初始化} B -- 是 --> C[返回成功] B -- 否 --> D[创建存储目录] D --> E{是否是混合存储?} E -- 是 --> F[初始化单文件存储] F --> G[初始化KV存储] E -- 否 --> H{是否是KV存储?} H -- 是 --> I[初始化LevelDB] H -- 否 --> J[初始化文件存储] I --> K[创建执行队列] G --> L[设置初始化标志] J --> L K --> L L --> M[结束]
        1. 写入元数据流程
        flowchart TD A[开始] --> B{检查是否已初始化} B -- 否 --> C[返回错误] B -- 是 --> D{是否是混合存储?} D -- 是 --> E[写入单文件存储] E --> F[写入KV存储] D -- 否 --> G{是否是KV存储?} G -- 是 --> H[创建写入任务] H --> I[加入执行队列] G -- 否 --> J[写入文件] F --> K[结束] I --> K J --> K

        3. 时序图

        混合存储写入时序

        sequenceDiagram participant Client participant MixedStorage participant SingleStorage participant KVStorage participant LevelDB Client->>MixedStorage: set_term_and_votedfor() MixedStorage->>SingleStorage: set_term_and_votedfor() SingleStorage->>SingleStorage: save() MixedStorage->>KVStorage: set_term_and_votedfor() KVStorage->>KVStorage: create WriteTask KVStorage->>LevelDB: Write Batch LevelDB-->>KVStorage: Write Result KVStorage-->>MixedStorage: Done MixedStorage-->>Client: Return Status

        KV存储批量写入时序

        sequenceDiagram participant Client participant KVStorage participant ExecutionQueue participant LevelDB Client->>KVStorage: set_term_and_votedfor() KVStorage->>ExecutionQueue: execute(WriteTask) ExecutionQueue->>ExecutionQueue: batch tasks ExecutionQueue->>LevelDB: WriteBatch LevelDB-->>ExecutionQueue: Write Result ExecutionQueue->>KVStorage: run_closure KVStorage-->>Client: Return Status

        这个文档详细分析了raft_meta.cpp的实现,包括:

        所有用到的头文件

        详细的类设计,包括每个类的主要成员和职责

        使用Mermaid绘制的类图,展示了类之间的关系

        主要处理流程的流程图

        关键操作的时序图

        文档结构清晰,使用Mermaid图表直观地展示了代码的设计和流程,便于理解代码的整体架构。