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。

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

向选出的host发送RPC请求。

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

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

相关链接:

05-18 03:54