前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Ocata nova evacuate bug

Ocata nova evacuate bug

作者头像
后端云
发布2018-10-24 11:30:05
5790
发布2018-10-24 11:30:05
举报
文章被收录于专栏:后端云后端云

现象

执行nova evacuate操作,但是在rebuild的时候有问题,到了某个步骤之后报错”rebuild的虚机被删除了”。

原因

当实例从一个节点疏散到另一个节点的时候,在rebuild过程中check_instance_exists方法执行的过程中InstanceNotFound异常是被期待发生的。

check_instance_exists方法是用来确保实例在新的节点上不存在,若存在要引发异常的。

实际代码中的check_instance_exists在不该报InstanceNotFound异常的时候,报了此异常,在方法的except未加入捕获InstanceNotFound异常。

社区修复

nova/virt/libvirt/driver.py

代码语言:javascript
复制
def instance_exists(self, instance):
    """Efficient override of base instance_exists method."""
    try:
        self._host.get_guest(instance)
        return True
    except exception.InternalError:
        return False

修改成:

代码语言:javascript
复制
def instance_exists(self, instance):
    """Efficient override of base instance_exists method."""
    try:
        self._host.get_guest(instance)
        return True
    except (exception.InternalError, exception.InstanceNotFound):
        return False

增加测试

代码语言:javascript
复制
@mock.patch.object(host.Host, 'get_guest')
def test_instance_exists(self, mock_get_guest):
    drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
    self.assertTrue(drvr.instance_exists(None))

    mock_get_guest.side_effect = exception.InstanceNotFound
    self.assertFalse(drvr.instance_exists(None))

    mock_get_guest.side_effect = exception.InternalError
    self.assertFalse(drvr.instance_exists(None))
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-07-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端云 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 现象
  • 原因
  • 社区修复
  • 增加测试
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档