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

相關連接:設計

相關文章
相關標籤/搜索