Как исправить ошибку эвакуации виртуальной машины с эфемерным диском, расположенным на общей системе хранения в OpenStack?

Примечание

Проблема обнаруживается для OpenStack Queens на CentOS 7.6.

Была выявлена ошибка эвакуации виртуальной машины с эфемерным диском, расположенным на общей системе хранения в OpenStack Queens с версией пакетов QEMU ≥ 2.10.

Начиная с версии QEMU ≥ 2.10 (Подробнее с изменениями в версии 2.10 можете ознакомиться на сайте официальной документации QEMU) в него была добавлена блокировка файлов виртуальной машины по умолчанию. Данное изменение может привести к тому, что при эвакуации виртуальной машины с эфемерным диском, расположенным на общей системе хранения (например, NFS), диск виртуальной машины может быть удален при эвакуации, если виртуальная машина остается активна на "потерянном" вычислительном узле. После успешной эвакуации OpenStack не сможет получить доступ к эфемерному диску виртуальной машины с нового вычислительного узла из-за блокировки, однако OpenStack посчитает эвакуацию успешной и диск данной виртуальной машины будет удален, в результате чего виртуальная машина становится неработоспособной.

В файлах логирования службы Nova это проявляется так:

2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [req-d12cf6fa-f6cc-4372-9509-7fe021257e1f 356bcb00813845609334cd5df810e44a 677ed342f7a54a38ac785864a318b92a - default default] [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23] Setting instance vm_state to ERROR: libvirtError: internal error: process exited while connecting to monitor: 2019-04-03 07:35:41.507+0000: Domain id=4 is tainted: host-cpu
2019-04-03T07:35:41.655802Z qemu-kvm: -drive file=/var/lib/nova/instances/80a2601d-e2ea-4003-98b8-3116c11b0e23/disk,format=qcow2,if=none,id=drive-virtio-disk0,cache=none,discard=unmap: Failed to get "write" lock
Is another process using the image?
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23] Traceback (most recent call last):
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]   File "/usr/lib/python2.7/site-packages/nova/compute/manager.py", line 7518, in _error_out_instance_on_exception
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]     yield
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]   File "/usr/lib/python2.7/site-packages/nova/compute/manager.py", line 2891, in rebuild_instance
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]     migration, request_spec)
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]   File "/usr/lib/python2.7/site-packages/nova/compute/manager.py", line 2953, in _do_rebuild_instance_with_claim
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]     self._do_rebuild_instance(*args, **kwargs)
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]   File "/usr/lib/python2.7/site-packages/nova/compute/manager.py", line 3110, in _do_rebuild_instance
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]     self._rebuild_default_impl(**kwargs)
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]   File "/usr/lib/python2.7/site-packages/nova/compute/manager.py", line 2797, in _rebuild_default_impl
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]     block_device_info=new_block_device_info)
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]   File "/usr/lib/python2.7/site-packages/nova/virt/libvirt/driver.py", line 3107, in spawn
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]     destroy_disks_on_failure=True)
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]   File "/usr/lib/python2.7/site-packages/nova/virt/libvirt/driver.py", line 5616, in _create_domain_and_network
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]     destroy_disks_on_failure)
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]   File "/usr/lib/python2.7/site-packages/oslo_utils/excutils.py", line 220, in __exit__
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]     self.force_reraise()
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]   File "/usr/lib/python2.7/site-packages/oslo_utils/excutils.py", line 196, in force_reraise
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]     six.reraise(self.type_, self.value, self.tb)
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]   File "/usr/lib/python2.7/site-packages/nova/virt/libvirt/driver.py", line 5585, in _create_domain_and_network
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]     post_xml_callback=post_xml_callback)
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]   File "/usr/lib/python2.7/site-packages/nova/virt/libvirt/driver.py", line 5520, in _create_domain
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]     guest.launch(pause=pause)
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]   File "/usr/lib/python2.7/site-packages/nova/virt/libvirt/guest.py", line 144, in launch
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]     self._encoded_xml, errors='ignore')
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]   File "/usr/lib/python2.7/site-packages/oslo_utils/excutils.py", line 220, in __exit__
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]     self.force_reraise()
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]   File "/usr/lib/python2.7/site-packages/oslo_utils/excutils.py", line 196, in force_reraise
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]     six.reraise(self.type_, self.value, self.tb)
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]   File "/usr/lib/python2.7/site-packages/nova/virt/libvirt/guest.py", line 139, in launch
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]     return self._domain.createWithFlags(flags)
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]   File "/usr/lib/python2.7/site-packages/eventlet/tpool.py", line 186, in doit
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]     result = proxy_call(self._autowrap, f, *args, **kwargs)
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]   File "/usr/lib/python2.7/site-packages/eventlet/tpool.py", line 144, in proxy_call
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]     rv = execute(f, *args, **kwargs)
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]   File "/usr/lib/python2.7/site-packages/eventlet/tpool.py", line 125, in execute
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]     six.reraise(c, e, tb)
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]   File "/usr/lib/python2.7/site-packages/eventlet/tpool.py", line 83, in tworker
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]     rv = meth(*args, **kwargs)
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]   File "/usr/lib64/python2.7/site-packages/libvirt.py", line 1110, in createWithFlags
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23]     if ret == -1: raise libvirtError ('virDomainCreateWithFlags() failed', dom=self)
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23] libvirtError: internal error: process exited while connecting to monitor: 2019-04-03 07:35:41.507+0000: Domain id=4 is tainted: host-cpu
2019-04-03 10:35:44.339 4281 ERROR nova.compute.manager [instance: 80a2601d-e2ea-4003-98b8-3116c11b0e23] 2019-04-03T07:35:41.655802Z qemu-kvm: -drive file=/var/lib/nova/instances/80a2601d-e2ea-4003-98b8-3116c11b0e23/disk,format=qcow2,if=none,id=drive-virtio-disk0,cache=none,discard=unmap: Failed to get "write" lock

Для того, чтобы избежать возникновения ошибки и потери данных, необходимо выполнять эвакуацию виртуальной машины только с полностью недоступных либо выключенных вычислительных узлов !