openstack中存储模块主要由cinder组件管理,cinder主要由API、scheduler以及volume服务3部分组成,API负责接收请求,scheduler服务调度,volume服务负责具体的请求的处理,本文以创建卷方法来分析整体流程
API处理流程:
当请求发送到API服务时候,API服务会解析请求的url,将其路由到对应的controller的方法,以V3版本为例子,该路由会对应到cinder/api/v3/volumes.py代码中的VolumeController的create函数
create(self,req,body)函数主要处理流程
1、校验body的请求参数
2、构造对应的size,name,description以及其他参数
3、调用volume_api.create方法创建卷
volume_api.create的处理流程(cinder/volume/api.py中的create函数)
1、校验输入参数
2、构造新的创建参数
3、根据参数构造flow_engine,该flow_engine主要为创建卷的flow。
4、调用flow创建卷
flow中有两个TASK比较重要,分别为EntryCreateTask和VolumeCastTask
其中EntryCreateTask主要为在数据库中创建卷的记录,VolumeCastTask主要为构造参数,然后调用scheduler_rpcapi的create_volume函数
其中create_volume函数(cinder/scheduler/rpcapi.py)流程为
1、获取创建参数
2、调用ctx.cast异步发送rpc请求。请求发送到监听的volume服务
该rpcapi调用(cinder/scheduler/manager.py)中的create_volume函数,该函数也采用flow方式调用,主要为ScheduleCreateVolumeTask的调用,该Task主要执行为schedule_create_volume函数(cinder/scheduler/driver.py--cinder/scheduler/filter_scheduler.py)
schedule_create_volume主要执行
1、调度获取对应执行的backend服务
2、更新数据库记录,主要为卷中更新host字段
3、调用volume服务的rpcapi提供的create_volume
volume_rpcapi.create_volume函数主要为cinder/volume/rcpapi.py的函数,流程为
1、选择volume对应消息队列的topic主题
2、将消息发送给消息队列
消息队列会将消息发送到volume服务注册的topic,主要对应到volume服务的rpc调用(cinder/volume/manager.py对应的函数中),
volume服务(cinder/volume/manager.py)的create_volume函数主要执行:
1、参数分析
2、构造create_volume的Task Flow(cinder/volume/flows/manager/create_volume.py),主要为CreateVolumeFromSpecTask
3、执行结果处理
CreateVolumeFromSpecTask主要执行为:
1、参数解析
2、根据类型选择不同函数处理,以下主要分析raw类型的创建,不同类型调用不同函数,raw主要调用_create_raw_volume
3、数据库更新
_create_raw_volume函数比较简单,主要为调用驱动的create_volume,以下使用rbd驱动来分析
驱动的create_volume(cinder/volume/drivers/rbd.py)流程为:
1、根据是否加密来选择不同函数处理,加密由_create_encrypted_volume处理,非加密由原来函数处理
2、生成RBDVolumeProxy对象,通过调用rbd的image对象来进行创建卷(由ceph的rbd包提供)。
通过以上流程分析,最后则创建对应的卷。具体代码细节请对照openstack代码逐步分析