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,創建成功的消息通知以及數據庫相關數據的更新
相關鏈接: