OSD.cc 快速参考卡片

OSD.cc 快速参考卡片

🚀 核心入口函数

函数 行号 功能
OSD::OSD() 2741 OSD 构造函数
OSD::pre_init() 2941 预初始化
OSD::init() 4050 完整初始化(24步)
OSD::shutdown() 5084 关闭流程
OSD::ms_dispatch() 8158 消息分发入口

📨 消息处理

消息类型 处理函数 行号 说明
MOSDOp handle_op() ~8500 客户端 I/O 操作
MOSDPGLog handle_pg_log() ~9000 PG 日志同步
MOSDPGNotify handle_pg_notify() ~9100 PG 通知
MOSDPGCreate2 handle_pg_create() ~5500 PG 创建
MCommand handle_command() 8007 管理命令

🗂️ PG 管理

函数 行号 功能
OSD::load_pgs() ~5500 从存储加载 PG
OSD::create_pg() ~5600 创建新 PG
OSD::lookup_pg() ~5700 查找 PG
OSDService::queue_for_pg_delete() 2238 PG 删除

🔄 恢复和回填

函数 行号 功能
OSDService::queue_recovery_context() 2004 恢复上下文入队
OSDService::_queue_for_recovery() 2358 恢复操作入队
OSDService::kick_recovery_queue() ~2400 触发恢复队列

🧹 Scrub

函数 行号 功能
OSDService::queue_for_scrub() 2149 Scrub 入队
OSD::scrub_purged_snaps() 8041 清理快照映射

⏰ 定时器

函数 行号 功能
OSD::tick() 6951 持有锁的 tick
OSD::tick_without_osd_lock() 7006 不持有锁的 tick

💓 心跳

函数 行号 功能
OSD::_add_heartbeat_peer() 6098 添加心跳对等节点
OSD::maybe_update_heartbeat_peers() 6159 更新心跳对等节点
OSD::heartbeat_check() ~6800 心跳检查
OSD::heartbeat_dispatch() 8136 心跳消息分发

🗺️ OSDMap 管理

函数 行号 功能
OSDService::activate_map() 646 激活新 Map
OSDService::get_nextmap_reserved() 663 保留 Map
OSDService::await_reserved_maps() 705 等待 Map 释放
OSDService::publish_map() ~650 发布 Map

🎯 操作调度

函数 行号 功能
OSDService::enqueue_back() 1969 操作入队(尾部)
OSDService::enqueue_front() 1979 操作入队(头部)

🔧 工具函数

函数 行号 功能
OSD::write_superblock() 2418 写入 Superblock
OSD::mkfs() 2448 创建文件系统
OSD::get_osd_compat_set() 263 获取兼容性特性

📊 关键数据结构

类型 位置 说明
OSDService OSD.h 服务层,提供共享服务
OSDShard OSD.h 分片,管理 PG 和调度器
ShardedOpWQ OSD.h 分片工作队列
HeartbeatInfo OSD.h 心跳信息

🔑 关键代码段

初始化流程(24步)

1
2
3
4
5
6
7
8
9
行 4050-4583: OSD::init()
├─ 行 4059-4063: 初始化基础组件
├─ 行 4086-4090: 挂载存储
├─ 行 4141-4173: 读取 Superblock
├─ 行 4177-4185: 加载 OSDMap
├─ 行 4274: 加载 PG
├─ 行 4376: 启动操作线程池
├─ 行 4393-4408: Monitor 认证
└─ 行 4566: 启动引导

消息处理流程

1
2
3
4
5
行 8158: ms_dispatch() 入口

行 8500+: _dispatch() 路由

根据消息类型分发到相应处理函数

PG 操作流程

1
2
3
4
5
6
7
客户端操作 → ms_dispatch()

handle_op() → lookup_pg()

enqueue_back() → 操作队列

ShardedOpWQ → PG::do_request()

📍 重要行号速查

  • 文件头部注释: 行 17-29
  • OSD 构造函数: 行 2741
  • OSD 初始化: 行 4050
  • 消息分发: 行 8158
  • 定时器 tick: 行 6951, 7006
  • 心跳检查: 行 ~6800
  • PG 创建: 行 ~5500
  • 恢复调度: 行 2004, 2358

🎓 学习路径

  1. 第一天:阅读 OSD::init() (行 4050-4583)
  2. 第二天:阅读 OSD::ms_dispatch() (行 8158+) 和消息路由
  3. 第三天:阅读 PG 管理相关函数
  4. 第四天:阅读恢复和回填机制
  5. 第五天:阅读心跳和定时器

💡 调试技巧

  1. 设置断点

    • OSD::init() - 观察初始化流程
    • OSD::ms_dispatch() - 观察消息分发
    • OSD::tick() - 观察定时任务
  2. 日志输出

    • 使用 dout() 宏查看调试信息
    • 关注 derr 错误输出
  3. 符号查找

    • 使用 IDE 的 “Go to Definition”
    • 使用 grep 查找函数调用

提示:配合 OSD.h 一起阅读,理解类定义和接口

文章互动

阅读 --

留言

0 条留言

正在加载留言…