日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
我的 OpenStack 代碼貢獻(xiàn)初體驗(yàn)

我的 OpenStack 代碼貢獻(xiàn)初體驗(yàn)

作者:YueZheng 2015-10-21 11:01:23

云計(jì)算

OpenStack 。在前段時(shí)間的OpenStack的測(cè)試過(guò)程中,我發(fā)現(xiàn)Nova項(xiàng)目中的一個(gè)Bug,于是向社區(qū)提交了Bug報(bào)告,并提交代碼修復(fù)了該Bug,從提交報(bào)告到代碼入庫(kù)經(jīng)歷近一月,下面重現(xiàn)整個(gè)過(guò)程。

創(chuàng)新互聯(lián)是一家專注網(wǎng)站建設(shè)、網(wǎng)絡(luò)營(yíng)銷策劃、微信小程序、電子商務(wù)建設(shè)、網(wǎng)絡(luò)推廣、移動(dòng)互聯(lián)開發(fā)、研究、服務(wù)為一體的技術(shù)型公司。公司成立十多年以來(lái),已經(jīng)為成百上千PVC花箱各業(yè)的企業(yè)公司提供互聯(lián)網(wǎng)服務(wù)?,F(xiàn)在,服務(wù)的成百上千客戶與我們一路同行,見證我們的成長(zhǎng);未來(lái),我們一起分享成功的喜悅。

OpenStack如今已成為開源云平臺(tái)中的明星項(xiàng)目,得到廣泛關(guān)注。OpenStack的優(yōu)秀出眾依賴于眾多開發(fā)者的努力,在享受其帶來(lái)的便利與快捷的同時(shí),為其做一份貢獻(xiàn)也是一個(gè)開發(fā)者的義務(wù)。在前段時(shí)間的OpenStack的測(cè)試過(guò)程中,我發(fā)現(xiàn)Nova項(xiàng)目中的一個(gè)Bug,于是向社區(qū)提交了Bug報(bào)告,并提交代碼修復(fù)了該Bug,從提交報(bào)告到代碼入庫(kù)經(jīng)歷近一月,下面重現(xiàn)整個(gè)過(guò)程。

一.發(fā)現(xiàn)Bug:

Nova中的虛擬機(jī)軟刪除(soft-delete)功能,是指在一段時(shí)間內(nèi),僅將數(shù)據(jù)庫(kù)中的某虛擬機(jī)記錄做一個(gè)標(biāo)記 (status='SOFT-DELETE'),然后將虛擬化平臺(tái)(kvm等)中對(duì)應(yīng)的虛擬機(jī)實(shí)例置為關(guān)機(jī)狀態(tài),當(dāng)超過(guò)某一時(shí)間段后才將虛擬機(jī)實(shí)例真正刪除;該功能為云平臺(tái)用戶提供了“后悔時(shí)間”,可以在一定程度上挽回誤操作。默認(rèn)情況下,軟刪除功能是關(guān)閉的,其開啟方式是在nova配置文件中添加"reclaim_instance_interval"選項(xiàng),并將其值設(shè)置為"后悔時(shí)間"的毫秒數(shù)。

在描述具體Bug前,需要對(duì)openstack中的用戶管理方面的基本概念簡(jiǎn)單介紹一下。

上圖是openstack用戶模型的簡(jiǎn)化版本,為了便于理解將不屬于keystone管理的quota也拿了過(guò)來(lái)。

Bug就與軟刪除相關(guān)。具體場(chǎng)景是這樣的:假設(shè)OpenStack中有兩個(gè)項(xiàng)目和兩個(gè)用戶:普通項(xiàng)目A其用戶a,管理員項(xiàng)目Admin其用戶為 admin(用戶管理相關(guān)概念可以查閱keystone文檔),用戶a不慎將自己的一臺(tái)虛擬機(jī)刪除了,這時(shí)求助系統(tǒng)管理員看看有沒(méi)有辦法恢復(fù),好在系統(tǒng)開啟的軟刪除功能,而且被刪除的虛擬機(jī)還在可回收的時(shí)間范圍內(nèi),這時(shí)管理員便以admin的身份登錄系統(tǒng),為用戶a恢復(fù)了虛擬機(jī),但是細(xì)心的管理員卻發(fā)現(xiàn)了一些不對(duì):其Admin項(xiàng)目下并沒(méi)有任何虛擬機(jī),但是其配額卻被使用了,難道這和剛才的操作有關(guān)?再來(lái)重試一下:普通用戶刪除虛擬機(jī),admin用戶來(lái)為其恢復(fù),這時(shí)配額又發(fā)生了變化,果然如此:被恢復(fù)的虛擬機(jī)的配額錯(cuò)誤的添加到了Admin項(xiàng)目下。該Bug在***的kilo版本中仍然存在,感興趣的同學(xué)可以實(shí)驗(yàn)一下。

二.定位Bug:

發(fā)現(xiàn)了Bug的存在,那就更進(jìn)一步,到代碼中找一下原因吧。

如何確定問(wèn)題代碼的位置呢?這需要對(duì)Nova的項(xiàng)目結(jié)構(gòu)有大體的了解,我們來(lái)簡(jiǎn)單了解一下:上圖是nova架構(gòu)的極簡(jiǎn)版本,與本問(wèn)題無(wú)關(guān)的組件都沒(méi)有畫上去,恢復(fù)虛擬機(jī)的操作過(guò)程大致是這樣:

  1. nova api接收到用戶請(qǐng)求,到數(shù)據(jù)庫(kù)中查詢虛擬機(jī)詳情,將該虛擬機(jī)所在的主機(jī)、名稱等數(shù)據(jù)發(fā)送到消息隊(duì)列中;
  2. nova compute服務(wù)在監(jiān)聽到相關(guān)消息后,開始執(zhí)行具體操作,將虛擬機(jī)在數(shù)據(jù)庫(kù)中的記錄做些調(diào)整,調(diào)用底層驅(qū)動(dòng)恢復(fù)虛擬機(jī)。

既然軟刪除的功能層面沒(méi)有任何問(wèn)題,虛擬機(jī)的刪除和恢復(fù)過(guò)程都很順利,可見不會(huì)是驅(qū)動(dòng)的問(wèn)題,順著API層的代碼調(diào)用往下找,很快就可以定位了。直接看出問(wèn)題的代碼片段:

  
 
 
 
  1. def restore(self, context, instance): 
  2.     # 該代碼做了刪減 
  3.     flavor = instance.get_flavor() 
  4.     # 獲取quotas對(duì)象 
  5.     num_instances, quotas = self._check_num_instances_quota( 
  6.             context, flavor, 1, 1) 
  7.     self._record_action_start(context, instance, instance_actions.RESTORE) 
  8.     try: 
  9.         if instance.host: 
  10.             instance.task_state = task_states.RESTORING 
  11.             instance.deleted_at = None 
  12.             instance.save(expected_task_state=[None]) 
  13.             self.compute_rpcapi.restore_instance(context, instance) 
  14.         else: 
  15.             instance.vm_state = vm_states.ACTIVE 
  16.             instance.task_state = None 
  17.             instance.deleted_at = None 
  18.             instance.save(expected_task_state=[None]) 
  19.         # 更新quotas 
  20.         quotas.commit() 

上面的這段代碼就是API層面上進(jìn)行虛擬機(jī)回收的主要方法,可以看到其中有明顯的配額操作(quotas),在解讀這段代碼前有必要先對(duì)nova 中"context"的概念做個(gè)簡(jiǎn)介。不僅是nova,在openstack其他項(xiàng)目中都隨處可見這個(gè)"context",它是一個(gè)包裝了用戶請(qǐng)求信息的對(duì)象,包含用戶的項(xiàng)目和認(rèn)證信息等,通過(guò)它可以簡(jiǎn)便的進(jìn)行各項(xiàng)目之間的API調(diào)用和用戶信息的查詢,API服務(wù)接收到用戶的每一次HTTP請(qǐng)求,都會(huì)創(chuàng)建一個(gè)新的context。

回到這段代碼,我們重點(diǎn)關(guān)注對(duì)quotas所作的操作:在方法的第二行,通過(guò)了一個(gè)方法獲取了quotas,有在方法的結(jié)尾執(zhí)行了 quotas.commit(),能夠獲取到的信息不多,我們?cè)倏匆幌芦@取quotas的方法:_check_num_instances_quota

  
 
 
 
  1. # 這里只截取一部分 
  2.  def _check_num_instances_quota(self, context, instance_type, min_count, 
  3.                                 max_count): 
  4.      req_cores = max_count * instance_type['vcpus'] 
  5.      vram_mb = int(instance_type.get('extra_specs', {}).get(VIDEO_RAM, 0)) 
  6.      req_ram = max_count * (instance_type['memory_mb'] + vram_mb) 
  7.  
  8.      try: 
  9.          quotas = objects.Quotas(context) 
  10.          quotas.reserve(context, instances=max_count, 
  11.                         cores=req_cores, ram=req_ram) 
  12.      ... 
  13.      return max_count, quotas 

這里可以看到獲取quotas的過(guò)程:通過(guò)當(dāng)前的context創(chuàng)建quotas對(duì)象,并且執(zhí)行了reserve操作; 我們知道context是由HTTP請(qǐng)求而來(lái),里面保存的是發(fā)請(qǐng)求的用戶的信息,所以這里的quotas對(duì)象的“所有者”也就是context中的用戶。

結(jié)合Bug發(fā)生的場(chǎng)景來(lái)看:管理員還原用戶a的虛擬機(jī),發(fā)請(qǐng)求的是管理員,當(dāng)前context中記錄的是管理員的信息,這里的quotas理所當(dāng)然的就是管理員的,然后操作了用戶a的虛擬機(jī),更新的卻是管理員的quotas。嗯,真相大白!

#p#

三.修復(fù)Bug:

Bug的原因是獲取的quotas并不屬于期望的用戶,但是直接修改context顯然不合適(會(huì)影響后續(xù)的操作),先了解一下quotas對(duì)象自身吧:

  
 
 
 
  1. class Quotas(base.NovaObject): 
  2.     # 部分代碼 
  3.     def __init__(self, *args, **kwargs): 
  4.         super(Quotas, self).__init__(*args, **kwargs) 
  5.         # Set up defaults. 
  6.         self.reservations = [] 
  7.         self.project_id = None 
  8.         self.user_id = None 
  9.         self.obj_reset_changes() 
  10.     ... 
  11.     def reserve(self, context, expire=None, project_id=None, user_id=None, 
  12.                 **deltas): 
  13.         reservations = quota.QUOTAS.reserve(context, expire=expire, 
  14.                                             project_id=project_id, 
  15.                                             user_id=user_id, 
  16.                                             **deltas) 
  17.         self.reservations = reservations 
  18.         self.project_id = project_id 
  19.         self.user_id = user_id 
  20.         self.obj_reset_changes() 
  21.  
  22.     def commit(self, context=None): 
  23.         if not self.reservations: 
  24.             return 
  25.         if context is None: 
  26.             context = self._context 
  27.         quota.QUOTAS.commit(context, self.reservations, 
  28.                             project_id=self.project_id, 
  29.                             user_id=self.user_id) 
  30.         self.reservations = None 
  31.         self.obj_reset_changes() 

注意看reserve方法的參數(shù),默認(rèn)為None的project_id和user_id,這正是改變quotas屬主的方便入口!

修改后的代碼這里就不貼了,感興趣的同學(xué)可以到這次提交中看:Code Review

四.代碼提交和Review:

openstack社區(qū)有著整套項(xiàng)目管理流程,這里有一張圖能夠較詳細(xì)的描述工作流程:

由圖可見bugfix是其中最簡(jiǎn)單的流程。

關(guān)于如何提交代碼,這篇文章有詳細(xì)的介紹: 向 OpenStack 貢獻(xiàn)您的代碼。另外需要注意一點(diǎn),在國(guó)內(nèi)向社區(qū)提交代碼,經(jīng)常會(huì)因?yàn)榫W(wǎng)絡(luò)問(wèn)題導(dǎo)致無(wú)法提交,幸好找到了大牛的博客介紹了該類問(wèn)題的解決辦法。 ?修改完代碼的單元測(cè)試和pep8本地測(cè)試當(dāng)然不能少,早就知道社區(qū)對(duì)單元測(cè)試要求很嚴(yán)格,這次才真正領(lǐng)教了,三行代碼的修改,單元測(cè)試卻寫了30 行,review期間多次因?yàn)閱卧獪y(cè)試的問(wèn)題重提代碼(哭)。社區(qū)里面的開發(fā)者,尤其是項(xiàng)目的core,對(duì)待項(xiàng)目有著像對(duì)自己孩子般的認(rèn)真與細(xì)致:他們會(huì)在一個(gè)自己根本不會(huì)在意的地方提醒你、面對(duì)當(dāng)前的問(wèn)題他們會(huì)延伸的考慮類似的問(wèn)題。他們的態(tài)度讓我首先感受到的吃驚,然后是敬佩!

經(jīng)歷八次review、歷時(shí)近一個(gè)月,我的代碼總算是入庫(kù)了!希望我的這篇記錄能對(duì)你有幫助。

感謝休倫公司技術(shù)總監(jiān) 孫琦 提供的英文支持,社區(qū)大牛Alex Xu給出的修改建議。

Launchpad上面的bug提交: Abnormal changes of quota usage after instance restored by admin

代碼審查過(guò)程: Fix abnormal quota usage after restore by admin

Git@OSC中的代碼: Fix abnormal quota usage after restore by admin

博文出處:http://my.oschina.net/zyzzy/blog/509315

關(guān)于OpenStack

OpenStack是一個(gè)由NASA(美國(guó)國(guó)家航空航天局)和Rackspace合作研發(fā)并發(fā)起的,是一個(gè)開源的云計(jì)算管理平臺(tái)項(xiàng)目,由幾個(gè)主要的組件組合起來(lái)完成具體工作。OpenStack支持幾乎所有類型的云環(huán)境,項(xiàng)目目標(biāo)是提供實(shí)施簡(jiǎn)單、可大規(guī)模擴(kuò)展、豐富、標(biāo)準(zhǔn)統(tǒng)一的云計(jì)算管理平臺(tái)。

OpenStack除了有Rackspace和NASA的大力支持外,還有包括戴爾、Citrix、Cisco、Canonical等重量級(jí)公司的貢獻(xiàn)和支持,致力于簡(jiǎn)化云的部署過(guò)程并為其帶來(lái)良好的可擴(kuò)展性。


網(wǎng)站題目:我的 OpenStack 代碼貢獻(xiàn)初體驗(yàn)
文章地址:http://www.5511xx.com/article/djscoic.html