Ceph Luminous librbd & librados 解析 -- image create

0 本文概述

本文将对通过终端cli在Ceph集群中创建image的流程进行解析

1 流程时序图

image.png

2 代码走读

2.1 命令行处理:/src/tools/

2.1.1 rbd.cc

rbd.cc提供main函数入口,作为主程序的入口,调用shell.cc中的execute()函数,对指令进行解析。

main()

2.1.2 shell.cc

shell.cc解析命令行,并通过封装的Action类调用对应的文件,对应当前目录下的Action文件。对于create而言,这里调用create.cc文件。

2.1.3 Action/create.cc

do_create()

在execute()函数中调用librados和IoContext并初始化,之后调用do_create().

do_create()

2.2 librbd层:src/librbd/

2.2.1 librbd.cc

librbd提供相应的接口,具体实现在interval.cc中,本文中create image操作使用create4()实现对create()接口的封装。

create4()

creae()

create()

通过create()接口,调用interval.cc中create()函数,interval.cc提供这些接口的实现(line 820 to line 877).

在create()函数中,librbd获取image id和相应的参数,并根据format的新旧使用调用不同的接口。v1现在已被废弃。使用v2来完成image create。
对于新format信息,调用当前目录中image目录中的CreateRequest.cc中send()函数进行调用。

2.2.2 /src/librbd/image/CreateRequest.cc

librbd中,将每个操作的具体实现都封装成了<operation>Request.cc/h文件,operation对应每个具体的操作,如当前的create操作的具体实现就是createRequest.cc/h中。

CreateRequest

如上,头文件给出了类的定义,send实现在.cc文件中。头文件还给出了CreateRequest.cc实现image create的函数调用流程图。

流程图

函数声明方面,函数和回调函数成对声明,回调函数以handle_开头区分。

函数和回调函数

send()

validate pool()

上面的函数实现中可以看出,send()函数调用validate_pool()函数,在validate_pool()函数中,封装并调用回调函数handle_validate_pool()函数,校验rbd_directory对象是否存在,下一步的操作在回调函数中调用。其中aio_operate()实际执行回调函数。

handle_validate_pool()

validate_overwrite()作用是校验rbd_info的内容。

validate_overwrite

handle_validate_overwrite()

在handle_validate_overwrite()函数中,如果rbd_info存在并且内容为“overwrite validated”, 直接进入下一状态,调用create_id_object(),创建rbd_id.<image_name>对象。

create_id_object

create_id_object()函数中,先调用了cls_client::set_id()创建rbd_id,之后又使用回调函数,这里个人观点为cls的函数需要回调函数触发。在回调函数中,调用add_image_to_directory()函数进入下一状态。

add_image_to_directory()

add_image_to_directory()作用为在rbd_directory对象中加入该image的id和name。

negotiate_features()

negotiate_features()中,会首先获取所有的feature,之后触发回调函数,将返回的feature decode到all_features中,之后调用create_image(),进入下一状态。

create_image()

get_all_fetures_start()

在create_image()中,通过cls注册的函数创建rbd_header对象,并设置omap中的值,调用回调函数完成创建。

handle_create_image()

set_stripe_unit_count()

之后代码遵循类似的流程,都是通过cls_client注册的函数 + 回调函数完成该状态功能,并调用函数,进入下一状态。调用的函数顺序为:

set_strip_unit_count() -> handle_strip_unit_count() -> object_map_resize() -> handle_object_map_resize() -> fetch_mirror_mode() -> handle_fetch_mirror_mode() -> journal_create() -> handle_journal_create() -> mirror_image_enable() -> handle_mirror_image_enable()

在一系列的调用完成后,调用complete()函数,传入的参数为0。

complete()

在complete()函数中,释放数据对象上下文,调用CreateRequest回调函数,完成步骤。

2.2.3 cls/rbd/cls_rbd_client.cc

在前文的Request调用中,使用回调函数进入下一状态之前,会先调用cls模块进行注册,cls模块针对rbd的实现在cls_rbd_client.cc文件中。

set_id()

dir_add_image()

create_image()

set_stripe_unit_count()

cls_client模块负责注册部分元数据操作。从调用的代码可以看出,cls_client下函数不会直接执行,而通过librados::ObjectOperation的exec()执行。在下一节可以看到,cls_client调用的操作在最终的OSDC层完成函数注册,但并不会实际调用。

需要注意的是,具体到image的创建,实际上只会记录一些image的基本信息。比如创建元数据对象rbd_id.foo和rbd_header.foo,对于image的真正数据对象rbd_data*,根本不会创建,这是因为ceph选择thin-provisioning这种凡事,可以做到秒级创建快设备,后段也可以超额分配容量。

2.3 librados层:src/librados/

librbd中cls_client的注册和回调函数的触发都在librados中实现。

2.3.1 librados.cc / librados.h

librados组件提供了cls_client注册函数需要的ObjectOperation的定义和接口实现,和IoctxImpl相关函数接口的封装。

cls_client调用的exec()函数的实现如下,函数中初始化ObjectOperationImpl实例,并调用其成员变量o的call()函数。

exec()

ObjectOperationImpl

代码中成员变量o的类型ObjectOperation来自雨OSDC层的Objecter组件,具体实现将在OSDC层中进行进一步讨论。

librbd中,真正触发回调函数是通过aio_operate()完成的,librados中提供了该接口,具体实现是封装了IoctxImpl的aio_operate()接口,最终实现是在IoctxImpl中完成。

aio_operate()

2.3.2 IoctxImpl.cc

aio_operate()

IoctxImpl中,::ObjectOperation op实际上是引用的src/osdc/Objecter.cc里面定义的类,初始化之后,通过op将消息发送给osd。真正使用osdc中的Objecter.cc中的组件的地方是operator()和aio_operate()函数。

2.4 OSDC 层:src/osdc

osdc层直接与osd进行通信,调用objecter.cc/objecter.h组件来实现消息的发送。

2.4.1 objecter.cc

objecter.cc提供对上层消息的封装,并将这些消息发送给osd,完成各项操作。

在librados层,cls_client调用的ObjectOperation的定义在objector.h中。

ObjectOperation

代码中各项成员变量的含义为

  out_bl: 用于存放ops每个操作的输出内容
  out_handler: 存放ops每个操作完成后执行的回调函数
  out_rval: 存放ops每个操作的返回值

librados层中注册函数时调用的call函数的定义如下

call()

add_call()

add_op()为其核心操作,作用是将ops数组中增加一个op,但不执行操作。

add_op()

最终的执行操作是通过aio_operate()函数在osdc层调用的op_submit()函数完成的。

op_submit()

_op_submit()

_op_submit()

_send_op()

_send_op()

从上述代码可以看出,在Objecter类中,遵循op_submit() -> _op_submit() -> _send_op()的调用顺序。

3 备注

[注] 参考链接ceph-librbd-create-image.html
[注] 从相关资料描述来看,RadosClient是其核心管理类,处理Rados层和Pool层管理,但是在当前的解析中并未体现RadosClient的作用,需要进一步的研究和分析。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容

  • 转载请注明出处(https://www.jianshu.com/p/5f538820e370),您的打赏是小编继续...
    福later阅读 27,011评论 8 70
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,093评论 1 32
  • 今天得空,我想谈谈关于我对写作的一些感受。 我不是什么作家,谈不上有什么写作技巧之类的东西,我就我个人的一些感受浅...
    徽茶飘香阅读 3,526评论 7 9
  • Git的优点 分布式,本地包含远程仓库所有源码,可以离线操作 便捷的分支功能,可以很方便的进行团队合作和版本控制 ...
    LJCoder阅读 5,507评论 2 9
  • 红装琉璃榻,可惜瑞珠洒 与君枝头下,青丝成白发
    羽聿阅读 225评论 0 1