【分析】Ceph文件系统修复机制cephfs-data-scan(3)

Ceph文件系统修复机制ceph-data-scan(3)

​ 前述章节已经介绍过:

​ ceph-data-scan是通过函数data_scan.main(args)解析并执行用户命令的。

​ data_scan.main(args)的参数检查和解析及其ceph-data-scan init的执行过程

​ 本章节主要介绍cephfs-data-scan scan_extents --force-pool 的实现过程

作者:Younger Liu,

本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。

本文链接地址为:http://blog.csdn.net/younger_china/article/details/76737659


当用户输入命令如下命令

# cephfs-data-scan scan_extents --force-pool 

为文件系统数据池,必须指定--force-pool

1. 参数解析

当进入data_scan.main中时,首先会解析参数,当解析到--force-pool时,会设置全局变量force_pool=true


  if (arg == "--force-pool") {
    force_pool = true;
    return true;
  } 
  ...
  } else {
    return false;
  }

2. 初始化

然后会初始化fs、 driver,与rados建立通信联系

3. 存储池的查找

通过存储池的名字获取存储池的ID


    data_pool_id = rados.pool_lookup(data_pool_name.c_str());
    if (data_pool_id < 0) {
      std::cerr << "Data pool '" << data_pool_name << "' not found!" << std::endl;
      return -ENOENT;
    } else {
      dout(4) << "data pool '" << data_pool_name
        << "' has ID " << data_pool_id << dendl;
    }

pool_lookup调用函数


int64_t librados::RadosClient::lookup_pool(const char *name)

其流程如下:

【分析】Ceph文件系统修复机制cephfs-data-scan(3)_第1张图片

其语义很简单:

  1. 首先是获取osdmap,同步请求

  2. 从osdmap查找存储池的ID

  3. 如果前两步,无法查找,则更新osdmap,再一次查找

继续判断,如果不是文件系统的数据池,则直接返回


    if (!fs->mds_map.is_data_pool(data_pool_id)) {
      std::cerr << "Warning: pool '" << data_pool_name << "' is not a "
        "CephFS data pool!" << std::endl;
      if (!force_pool) {
        std::cerr << "Use --force-pool to continue" << std::endl;
        return -EINVAL;
      }
    }

最后调用scan_extents

4 scan_extents分析

其流程如下:(有待于仔细斟酌和完善)

  1. 获取对象分片列表的起始、终止焦点

  2. 判断是否为旧版本osd,旧版本osd是不支持cephfs pgls filtering mode

  3. 依次遍历每一个object,对每一个object进行处理

【分析】Ceph文件系统修复机制cephfs-data-scan(3)_第2张图片

作者:Younger Liu,

本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。

本文链接地址为:http://blog.csdn.net/younger_china/article/details/76737659

你可能感兴趣的:(数据存储,深入理解CEPH系统)