下面用 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 --> [*]补充一条线性泳道(便于和代码对照):
3. 流程图:读路径(read → _do_read)
4. 流程图:挂载时与存储栈的打开顺序(_open_db_and_around)
若需要 可导出 PNG/SVG:把上述 Mermaid 粘进支持 Mermaid 的渲染器(如部分 Markdown 预览、Mermaid Live Editor),即可导出。若你希望 单张合并大图(架构 + 写状态机一页),可以说一下更偏向「部署视角」还是「代码函数视角」,我可以再收紧节点命名以便贴进设计文档。
正在加载留言…