BlueStore 流程图

下面用 Mermaid 画两张图:一张偏 模块架构,一张偏 写事务状态机 + 读路径流程(内容对应 BlueStore.cc 里的主要协作关系,而非逐函数罗列)。


1. BlueStore 架构图(组件与依赖)

flowchart TB
  subgraph OSD["OSD / ObjectStore 接口"]
    OS[queue_transactions / read / collection ops]
  end

  subgraph BS["BlueStore 核心(BlueStore.cc)"]
    COLL[Collection + OnodeSpace]
    ONODE[Onode / ExtentMap / Blob / SharedBlob]
    BUF[BufferSpace + BufferCacheShard]
    TXC[TransContext 状态机]
    TH[Throttle + OpSequencer]
    DEF[Deferred 队列与回放]
  end

  subgraph ALLOC["空间管理"]
    AL[Allocator]
    FM[FreelistManager]
  end

  subgraph PERSIST["持久化"]
    KV[(KeyValueDB / RocksDB)]
    BF[BlueFS]
    BDEV[(BlockDevice: block / block.db / block.wal)]
  end

  subgraph BG["后台与回调"]
    KVTH[kv_sync_thread / kv_finalize_thread]
    FIN[Finisher]
    MPT[mempool_thread]
  end

  OS --> COLL
  OS --> TXC
  COLL --> ONODE
  read_path[read → _do_read] --> ONODE
  read_path --> BUF
  TXC --> ONODE
  TXC --> BUF
  TXC --> TH
  TXC --> AL
  TXC --> FM
  TXC --> KV
  ONODE --> KV
  FM --> KV
  TXC --> BDEV
  BUF --> BDEV
  KV --> BF
  BF --> BDEV
  KVTH --> TXC
  TXC --> FIN
  DEF --> BDEV
  DEF --> KV
  MPT -.-> BS

要点(和 BlueStore.cc 一致):

  • 元数据 / omap / deferred / 分配元数据KV;启用 BlueFS 时 RocksDB 文件BlueFS 里,再落到 块设备
  • 对象字节 直接 Allocator → pextent → BlockDevice
  • TransContext 串起 AIO、KV 提交、deferred、on_commit

2. 流程图:写路径(queue_transactions + _txc_state_proc

stateDiagram-v2
  direction LR

  [*] --> PREPARE: queue_transactions\n_txc_add_transaction
  PREPARE --> AIO_WAIT: 有块设备 AIO\n_txc_aio_submit
  PREPARE --> IO_DONE: 无 AIO

  AIO_WAIT --> IO_DONE: AIO 完成\n_txc_finish_io\n(同 OSR 顺序推进)

  IO_DONE --> KV_QUEUED: 入 kv_queue\n通知 kv_sync_thread

  state KV_QUEUED {
      [*] --> Note
      Note: 可选 bluestore_sync_submit_transaction\n同线程 _txc_apply_kv
  }

  KV_QUEUED --> KV_SUBMITTED: db->submit_transaction\n_txc_apply_kv
  KV_SUBMITTED --> KV_DONE: sync / finalize\n_txc_committed_kv\n(on_commit → finisher)

  KV_DONE --> DEFERRED_QUEUED: deferred_txn 非空\n_deferred_queue
  KV_DONE --> FINISHING: 无 deferred

  DEFERRED_QUEUED --> DEFERRED_CLEANUP: 延迟写完成
  DEFERRED_CLEANUP --> FINISHING

  FINISHING --> DONE: _txc_finish\n释放/回收/出队
  DONE --> [*]

补充一条线性泳道(便于和代码对照):

写路径主链解析 Transaction改 Onode/Extent/Blob\n分配/释放 extent提交块写 AIO编码 onode/shared_blob\n写入 txc->tdeferred 记入 KV\n_finalize_kv_txc_state_procKV 持久化deferred?deferred 数据写_txc_finish

3. 流程图:读路径(read_do_read

无对象readCollection 锁 + get_onode返回 -ENOENT_do_read_read_cache\n划分 ready vs 待读BufferSpace 命中\n拼 bl按 blob 合并读请求\nAIO 读 BlockDevice校验和 / 解压bufferlist 返回

4. 流程图:挂载时与存储栈的打开顺序(_open_db_and_around

mount → _mount_open_db_and_aroundpath + fsid + lock_open_bdev_open_db 只读_open_super_meta_open_fm + _init_alloc关 DB 再 _open_db 最终模式_post_init_alloc 可写时_upgrade_super + _open_collections_kv_start + _deferred_replay

若需要 可导出 PNG/SVG:把上述 Mermaid 粘进支持 Mermaid 的渲染器(如部分 Markdown 预览、Mermaid Live Editor),即可导出。若你希望 单张合并大图(架构 + 写状态机一页),可以说一下更偏向「部署视角」还是「代码函数视角」,我可以再收紧节点命名以便贴进设计文档。

文章互动

阅读 --

留言

0 条留言

正在加载留言…