Ocata nova evacuate bug

  1. 现象
  2. 原因
  3. 社区修复
  4. 增加测试

现象

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

原因

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

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

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

社区修复

nova/virt/libvirt/driver.py

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

修改成:

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

增加测试

@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))

转载请注明来源,欢迎指出任何有错误或不够清晰的表达。可以邮件至 backendcloud@gmail.com