cinder建立volume的流程-简单梳理

1. cinder-api接收到建立的请求,入口:cinder.api.v2.volumes.VolumeController#create,该方法主要负责一些参数的从新封装和校验,而后调用cinder.volume.api.API#create方法,该方法会启动volume_create_api工做流(flow),flow的状态从pending->running->success,该工做流包含若干个任务(TASK),TASK的转换状态与工做流同样,都是到success结束,每一个TASK完成特定的任务。数据库

这里须要对taskflow额外解释下,cinder在建立卷的过程当中应用了taskflow(也能够理解为一种设计模式)库,来实现卷的建立。引进taskflow库可以实现方便的代码管理,并且增长功能实现的安全性。简单来讲,**当实现一个功能时,应用taskflow模式可以实现对flow执行的管理,可以开始、停止、从新开始以及逆转回滚等操做,好比当执行某个flow操做出现异常时,能够视具体状况尝试进行flow的逆转回滚操做,实现回溯到flow执行以前的状态**。这些须要对taskflow进行额外的研究,这里暂时不提缘由。

设计模式

  • ExtractVolumeRequestTask,验证request参数的合法性和对参数进行从新的组装,方便后边task的使用
  • QuotaReserveTask,对请求中指定的size和type预留配额
  • EntryCreateTask,在数据库中建立一条volume的记录
  • QuotaCommitTask,对预留的配额进行提交
  • VolumeCastTask,通过调度进行建立卷,经过scheduler_rpcapi.create_volume建立卷。

2. cinder-scheduler也是开启一个volume_create_scheduler flow,该flow包括如下几个task,ExtractSchedulerSpecTask和ScheduleCreateVolumeTask。api

  • ExtractSchedulerSpecTask,对request_spec的信息进行补充
  • ScheduleCreateVolumeTask,使用filter和weight筛选出适合的backend


向选出的host发送RPC请求。安全

3. cinder-volume也使用flow来建立volume。.net

  • ExtractVolumeRefTask,根据volume id获取完整的volume信息
  • OnFailureRescheduleTask,经过查看代码,该task无任何做用
  • ExtractVolumeSpecTask,提取volume spec的信息
  • NotifyVolumeActionTask,开始建立的消息通知
  • CreateVolumeFromSpecTask,调用driver建立volume
  • CreateVolumeOnFinishTask,建立成功的消息通知以及数据库相关数据的更新

相关连接:设计

相关文章
相关标签/搜索