nova volume-attach程式碼流程分析
最近遇到一個bug,是使用者在nova端attach一個volume給instance後,再發起detach操作,導致該volume detach失敗且一直處於detaching狀態,藉此走讀nova volume-detach的程式碼流程,在此分享下心得筆記。
nova client端發起nova volume-attach動作,首先在api側獲取到請求資訊,並進行簡單解析:
nova/api/openstack/compute/volume.py
def _attach_volume(self, context, instance, volume_id, device, disk_bus, device_type) :
"""Attach an existing volume to an existing instance.This method is separated to make it possible for cells version to override it.
"""
根據請求來的body,獲取volume及instance資訊,直接呼叫compute api:
device = self.compute_api.attach_volume(context, instance,volume_id, device)
compute api收到請求進行處理,
nova/compute/api.py:
def attach_volume(self, context, instance, volume_id, device=Nonedisk_bus=None, device_type=None):
這裡比較簡單,直接返回另一方法:
return self._attach_volume(context, instance, volume_id, device, disk_bus, device_type)
再看_attach_volume方法:
def _attach_volume(self, context, instance, volume_id, device, disk_bus, device_type) :
這部分主要建立bdm,rpc呼叫nova compute:
self.compute_rpcapi.attach_volume(context, instance, volume_bdm)
openstack下的rpc呼叫,最終都是由manager.py處理,所以直接看compute下的manager.py
nova/compute/manager.py:
def attach_volume(self, context, instance, bdm):
return self._attach_volume(context, instance, driver_bdm)
def _attach_volume(self, context, instance, bdm):
bdm.attach(context, instance, self.volume_api, self.driver,
do_driver_attach=True)
直接看第二個方法,發起呼叫bdm.attach,在nova/virt/block_device.py中:
def attach(self, context, instance, volume_api, virt_driver, do_driver_attach=False, **kwargs):
在這裡有以下幾部分操作:
1)獲取connect_info
2)呼叫driver將volume掛載給instance的動作(修改xml配置等);
virt_driver.attach_volume
3)檢查connect_info資訊
4)如果volume狀態是detached:
if volume['attach_status'] == "detached":
則呼叫cinder中attach方法,會將volume設定為in-use狀態:
volume_api.attach(context, volume_id, instance.uuid,
self['mount_device'], mode=mode)
在呼叫cinder之前,有一個connect_info儲存動作:
self.save()
正常在attach方法有裝飾器修飾:
@update_db
在attach執行後更新資料庫,儲存connect_info資訊。
在呼叫cinder之前加上儲存的動作是為了防止在attach之後又
發生detach動作,此時cinder返回volume為in-use狀態,但是connect_info尚未儲存到資料庫,在detach流程
中可能會因為獲取不到有效的connect_info資訊而導致detach失敗:
TRACE oslo.messaging.rpc.dispatcher TypeError: <type 'NoneType'> can't be decoded
使得volume一直處於detaching狀態。
小笨驢在吃草的時候建立了微信公眾號,為方便更多覓食的“小笨驢”,為大家準備了大量的免費基礎教學資料以及技術解決方案,還會定時釋出一些好的技術文章,當然也會扯扯蛋、談談人生、呵呵,希望我們這群樂於分享技術的“小笨驢”團隊越來越大!(技術乾貨分享群qq:128015753)
相關推薦
nova volume-attach程式碼流程分析
最近遇到一個bug,是使用者在nova端attach一個volume給instance後,再發起detach操作,導致該volume detach失敗且一直處於detaching狀態,藉此走讀nova volume-detach的程式碼流程,在此分享下心得筆記。
nova boot程式碼流程分析(四):nova與neutron的l2 agent(neutron-linuxbridge-agent)互動
#/nova/virt/libvirt/driver.py:LibvirtDriver # NOTE(ilyaalekseyev): Implementation like in multinics # for xenapi(tr3buchet)
nova boot程式碼流程分析(一):Claim機制
nova boot建立VM的流程大致為: 1. novaclient傳送HTTP請求到nova-api(這裡內部細節包括keystone對使用者的驗證及使用者從keystone獲取token和endpoints等資訊,具體參考《keystone WSGI流程》)。 2. n
hyperledger fabric超級賬本java sdk樣例e2e程式碼流程分析
一 checkConfig Before 1.1 private static final TestConfig testConfig = TestConfig.getConfig(); &
spi nand driver程式碼流程分析
硬體環境 主晶片:bcm63xx, spi nand:Winbond W25N01GV 程式碼環境 linux-4.1.27/drivers/mtd mtd_blkdevs.o mtdblock.o mtdchar.o m
SpringXD 任務、啟動訊息通訊程式碼流程分析
任務部署時,xd-admin和container之間通過zookeeper的節點監聽通訊。container監聽zk deployment節點,執行部署。同事繫結kafka message consumer和reactor subscriber。 任務啟動時,xd-admin和container通過
Android狀態列顯示電池狀態程式碼流程分析
BatteryController.java 註冊廣播接收器,接收Intent.ACTION_BATTERY_CHANGED廣播 之後呼叫BatteryStateChangeCallback cb.onBatteryLevelChanged(level, plugged)來
uboot的eMMC初始化程式碼流程分析
原始碼參考九鼎科技移植的X210開發板捆綁BSP中的uboot, 版本為1.3.4 mmc初始化函式int mmc_initialize(bd_t *bis)在uboot/lib_arm/board.c中的start_armboot()函式中被呼叫(uboot
Openstack之Nova建立虛機流程分析
2、虛擬機器建立簡單說來三步,nova api接受建立虛機請求,nova scheduler為建立虛機指定宿主機,nova compute啟動虛擬機器。如果能夠理解上面的所有步驟,那麼對於定位問題可以精準,甚至有些問題可以自己解決,譬如虛機error了,如果你看到虛機的資訊已經有host資訊了,那基本能從no
Nova attach volume的流程分析
作為個人學習筆記分享,有任何問題歡迎交流! (2013.7.5更新) Nova中volume掛載流程分為兩部分:掛載命令的傳送和接收處理 1 掛載命令的傳送 1.1提供API介面 程式碼來源:nova/api/openstack/contrib/volumes.py:
【openstack】【nova】nova 刪除雲主機流程及程式碼分析
正常情況下刪除雲主機的操作,主要採用如下兩個方式:1. is_local_delete = True 採用local_delete()2. is_local_delete = False 採用compute_rpcapi.terminate_instance()雲主機在如下的
[Android6.0][RK3399] 雙屏異顯程式碼實現流程分析(一)
Platform: RK3399 OS: Android 6.0 Version: v2016.08 本文分為兩部分。 《[RK3399] 雙屏異顯程式碼實現流程分析(一)》為分析 RK video 部分標準的程式碼(base on 2017.
netlink監聽網路變化程式碼(轉載)+流程分析(原創+轉載)+資料結構以及相關巨集的解析(原創)
一.netlink監聽網路變化程式碼(Linux下使用NetLink 監聽網路變化) #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h>
[Android6.0][RK3399] 雙屏異顯程式碼實現流程分析(二)
Platform: RK3399 OS: Android 6.0 Version: v2016.08 LCD interface: eDP + mipi Patch Code Date: Fri, 09 Dec 2016 10:53:11
leveldb程式碼閱讀(16)——流程分析:開啟資料庫(詳細版本)
Status VersionSet::Recover() { struct LogReporter : public log::Reader::Reporter { Status* status; virtualvoid Corruption(size_t bytes, const St
nova建立虛機流程原始碼分析 openstack
今天跟大家分享openstack中利用nova建立虛機時的原始碼流程,以便更好的理解openstack雲平臺實現,也有助於故障定位。 建立虛機方式有兩種,一種是通過dashboard雲管理平臺建立,一種是nova命令列方式建立。現在各雲端計算公
newlib 中的 crt0 流程分析
gets eno -s style and 條件判斷 obj als example 最近對 newlib 中的啟動代碼 crt0 產生了興趣,於是就分析了下其代碼。crt0 的源碼位於 libgloss/arm/crt0.S,為了兼容各種 ARM 架構,crt0.S 中有
PowerManagerService流程分析
other nes func 靜下心來 沒有 light 事情 統一管理 mon 一、PowerManagerService簡介 PowerManagerService主要服務Android系統電源管理工作,這樣講比較籠統,就具體細節上大致可以認為PowerManage
翻翻git之---自己定義郵件發送buttonSendButton(流程分析,實現思路能夠學習下)
現象 date() 加速 lag restart xtend fas trace str 轉載請註明出處:王亟亟的大牛之路 距離過春節還有1天。繼續這一系列的git翻料之旅。 昨天的工具類真的非常棒,這裏再推崇一下 傳送門:http://blog.c
Android5 Zygote 與 SystemServer 啟動流程分析
進一步 null 正常的 rtb 這樣的 ket constant vml resp Android5 Zygote 與 SystemServer 啟動流程分析 Android5 Zygote 與 SystemServer 啟動流程分析 前言 zy