On Wed, Jul 04, 2018 at 12:46:55 +0200, Michal Privoznik wrote:
If qemu-pr-helper process died while libvirtd was not running no
event is emitted. Therefore, when reconnecting to the monitor we
must check the qemu-pr-helper process status and act accordingly.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
src/qemu/qemu_process.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 78 insertions(+)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 94b7de76d7..ac148a39e9 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -2069,6 +2069,81 @@ qemuRefreshVirtioChannelState(virQEMUDriverPtr driver,
return ret;
}
+
+static int
+qemuProcessRefreshPRManagerState(virDomainObjPtr vm,
+ virHashTablePtr info)
+{
+ qemuDomainObjPrivatePtr priv = vm->privateData;
+ qemuMonitorPRManagerInfoPtr prManagerInfo;
+ size_t i;
+ int ret = -1;
+
+ for (i = 0; i < vm->def->ndisks; i++) {
+ const char *mgralias;
+
+ mgralias =
virStorageSourceChainGetManagedPRAlias(vm->def->disks[i]->src);
+
+ if (!mgralias)
+ continue;
+
+ if (!(prManagerInfo = virHashLookup(info, mgralias))) {
+ virReportError(VIR_ERR_OPERATION_FAILED,
+ _("missing info on pr-manager %s"),
+ mgralias);
+ goto cleanup;
+ }
I don't think this is a compelling reason to kill the VM upon reconnect.
Also as said, it should not be necessary to iterate the disks to see
whether the managed PR helper is required and what the alias is supposed
to be.
+
+ break;
+ }
+
+ if (i == vm->def->ndisks) {
+ /* no managed pr-manager, return early. */
+ ret = 0;
+ goto cleanup;
+ }
+
+ priv->prDaemonRunning = prManagerInfo->connected;
+
+ if (!priv->prDaemonRunning &&
+ qemuProcessStartManagedPRDaemon(vm) < 0)
+ goto cleanup;
+
+ ret = 0;
+ cleanup:
+ return ret;
+}
+
+
+static int
+qemuRefreshPRManagerState(virQEMUDriverPtr driver,
+ virDomainObjPtr vm)
+{
+ qemuDomainObjPrivatePtr priv = vm->privateData;
+ virHashTablePtr info = NULL;
+ int ret = -1;
+
+ if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_PR_MANAGER_HELPER))
+ return 0;
+
+ if (qemuDomainObjEnterMonitorAsync(driver, vm, QEMU_ASYNC_JOB_NONE) < 0)
+ goto cleanup;
Ummm, why don't you use qemuDomainObjEnterMonitor then?
+
+ ret = qemuMonitorGetPRManagerInfo(priv->mon, &info);
+ if (qemuDomainObjExitMonitor(driver, vm) < 0)
+ ret = -1;
+
+ if (ret < 0)
+ goto cleanup;
+
+ ret = qemuProcessRefreshPRManagerState(vm, info);
+
+ cleanup:
+ virHashFree(info);
+ return ret;
+}
+
+
static void
qemuRefreshRTC(virQEMUDriverPtr driver,
virDomainObjPtr vm)
@@ -7722,6 +7797,9 @@ qemuProcessReconnect(void *opaque)
if (qemuRefreshVirtioChannelState(driver, obj, QEMU_ASYNC_JOB_NONE) < 0)
goto error;
+ if (qemuRefreshPRManagerState(driver, obj) < 0)
+ goto error;
+
/* If querying of guest's RTC failed, report error, but do not kill the domain.
*/
qemuRefreshRTC(driver, obj);
--
2.16.4
--
libvir-list mailing list
libvir-list(a)redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list