vm: make sure qmemman connection is closed even on failed VM startup

Qmemman hold global lock while serving requests, so not closing
connection will prevent any further action.
This commit is contained in:
Marek Marczykowski-Górecki 2017-05-17 02:15:26 +02:00
parent e5daf902b3
commit ae28d32af7
No known key found for this signature in database
GPG Key ID: 063938BA42CFA724

View File

@ -871,15 +871,14 @@ class QubesVM(qubes.vm.mix.net.NetVMMixin, qubes.vm.BaseVM):
qmemman_client = yield from asyncio.get_event_loop().run_in_executor(
None, self.request_memory, mem_required)
yield from self.storage.start()
self._update_libvirt_domain()
try:
yield from self.storage.start()
self._update_libvirt_domain()
self.libvirt_domain.createWithFlags(libvirt.VIR_DOMAIN_START_PAUSED)
except:
finally:
if qmemman_client:
qmemman_client.close()
raise
try:
self.fire_event('domain-spawn',
@ -902,6 +901,7 @@ class QubesVM(qubes.vm.mix.net.NetVMMixin, qubes.vm.BaseVM):
# successful unpause is some indicator of it
if qmemman_client:
qmemman_client.close()
qmemman_client = None
# if self._start_guid_first and start_guid and not preparing_dvm \
# and os.path.exists('/var/run/shm.id'):
@ -919,6 +919,9 @@ class QubesVM(qubes.vm.mix.net.NetVMMixin, qubes.vm.BaseVM):
# self.force_shutdown(), because the vm is not running or paused
yield from self.kill() # pylint: disable=not-an-iterable
raise
finally:
if qmemman_client:
qmemman_client.close()
asyncio.ensure_future(self._wait_for_session())