1. 程式人生 > >nova volume-attach程式碼流程分析

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】【novanova 刪除雲主機流程程式碼分析

正常情況下刪除雲主機的操作,主要採用如下兩個方式: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