[PATCH] qemu: clear residual QMP caps processes during QEMU driver initialization
Jiri Denemark
jdenemar at redhat.com
Fri Sep 25 16:09:16 UTC 2020
> In some cases, the QMP capabilities processes possible residue. So we need to
> clear the residual QMP caps processes during starting libvirt.
I agree with you that leaving processes behind is more serious than
leaving temporary files and thus we should try to kill such processes
when libvirtd starts.
> Signed-off-by:Bihong Yu <yubihong at huawei.com>
> ---
> src/qemu/qemu_driver.c | 2 ++
> src/qemu/qemu_process.c | 40 ++++++++++++++++++++++++++++++++++++++++
> src/qemu/qemu_process.h | 2 ++
> 3 files changed, 44 insertions(+)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index d185666..d627fd7 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -889,6 +889,8 @@ qemuStateInitialize(bool privileged,
> run_gid = cfg->group;
> }
>
> + qemuProcessQMPClear(cfg->libDir);
> +
> qemu_driver->qemuCapsCache = virQEMUCapsCacheNew(cfg->libDir,
> cfg->cacheDir,
> run_uid,
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 70fc24b..d545e3e 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -8312,6 +8312,46 @@ static qemuMonitorCallbacks callbacks = {
> };
>
>
> +/**
> + * qemuProcessQMPClear
How about qemuProcessQMPClearAll or something like that to make it a bit
more obvious it's not working with a single process only?
> + *
> + * Try to kill residual QMP caps processes
> + */
> +void
> +qemuProcessQMPClear(const char *libDir)
> +{
> + virErrorPtr orig_err;
> + DIR *dirp = NULL;
> + struct dirent *dp;
> +
> + if (!virFileExists(libDir))
I think virFileIsDir would be more appropriate here.
> + return;
> +
You should save the error here by calling
virErrorPreserveLast(&orig_err);
> + if (virDirOpen(&dirp, libDir) < 0)
> + return;
And here you would need to jump to the end of the function to restore
the original error.
> +
> + virErrorPreserveLast(&orig_err);
> + while (virDirRead(dirp, &dp, libDir) > 0) {
> + g_autofree char *qmp_uniqDir = NULL;
> + g_autofree char *qmp_pidfile = NULL;
> +
> + if (!STRPREFIX(dp->d_name, "qmp-"))
> + continue;
> +
> + qmp_uniqDir = g_strdup_printf("%s/%s", libDir, dp->d_name);
> + qmp_pidfile = g_strdup_printf("%s/%s", qmp_uniqDir, "qmp.pid");
> +
> + ignore_value(virPidFileForceCleanupPath(qmp_pidfile));
> +
> + if (qmp_uniqDir)
There's no way qmp_uniqDir could be NULL here.
> + rmdir(qmp_uniqDir);
> + }
Add a cleanup label and jump here when virDirOpen fails.
> + virErrorRestore(&orig_err);
> +
> + VIR_DIR_CLOSE(dirp);
> +}
> +
> +
I would've sworn we had some auto magic that would save/restore the
error when entering/leaving a function, but I can't find it. So I guess
it does not really exist or I don't know what to look for.
> static void
> qemuProcessQMPStop(qemuProcessQMPPtr proc)
> {
> diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h
> index 15e67b9..b039e6c 100644
> --- a/src/qemu/qemu_process.h
> +++ b/src/qemu/qemu_process.h
> @@ -233,6 +233,8 @@ qemuProcessQMPPtr qemuProcessQMPNew(const char *binary,
> gid_t runGid,
> bool forceTCG);
>
> +void qemuProcessQMPClear(const char *libDir);
> +
> void qemuProcessQMPFree(qemuProcessQMPPtr proc);
>
> int qemuProcessQMPStart(qemuProcessQMPPtr proc);
Jirka
More information about the libvir-list
mailing list