On 8/26/26 10:46, [email protected] wrote:
> From: shotor <[email protected]>
>
> Libvirt reports Cloud Hypervisor domains as having unknown persistence.
>
> Commit 85cf0e4f17ae added support for keeping a separate inactive
> definition for running domains, but it didn't persist domain
> definitions to disk or reload them when virtchd restarted. Meaning
> defined CH domains were still lost across daemon restarts and libvirt
> couldn't report them as persistent.
>
> Follow the approach used by the QEMU driver: save domain definitions to
> disk when they are defined, reload them during driver initialization,
> remove the stored configuration when they are undefined, and roll back
> the in-memory definition if saving fails.
>
> Also implement domainIsPersistent so libvirt reports the persistence
> state correctly.
>
> Signed-off-by: shotor <[email protected]>
> ---
> src/ch/ch_conf.c | 13 +++++++---
> src/ch/ch_conf.h | 1 +
> src/ch/ch_driver.c | 63 +++++++++++++++++++++++++++++++++++++++++++---
> 3 files changed, 69 insertions(+), 8 deletions(-)
>
> diff --git a/src/ch/ch_conf.c b/src/ch/ch_conf.c
> index 6896683b7f..793ec33a10 100644
> --- a/src/ch/ch_conf.c
> +++ b/src/ch/ch_conf.c
> @@ -178,22 +178,26 @@ virCHDriverConfigNew(bool privileged)
> cfg->logDir = g_strdup_printf("%s/log/libvirt/ch", LOCALSTATEDIR);
> cfg->stateDir = g_strdup_printf("%s/libvirt/ch", RUNSTATEDIR);
> cfg->saveDir = g_strdup_printf("%s/lib/libvirt/ch/save",
> LOCALSTATEDIR);
> - cfg->configDir = g_strdup(SYSCONFDIR "/libvirt");
> + cfg->configBaseDir = g_strdup(SYSCONFDIR "/libvirt");
> + cfg->configDir = g_strdup_printf("%s/ch/domains",
> + cfg->configBaseDir);
> } else {
> g_autofree char *rundir = NULL;
> g_autofree char *cachedir = NULL;
> - g_autofree char *configbasedir = NULL;
> + const char *configbasedir = NULL;
This is going to leak the variable.
>
> cachedir = virGetUserCacheDirectory();
> -
> cfg->logDir = g_strdup_printf("%s/ch/log", cachedir);
>
> rundir = virGetUserRuntimeDirectory();
> cfg->stateDir = g_strdup_printf("%s/ch/run", rundir);
>
> configbasedir = virGetUserConfigDirectory();
> +
> cfg->saveDir = g_strdup_printf("%s/ch/save", configbasedir);
> - cfg->configDir = g_strdup_printf("%s/ch", configbasedir);
> + cfg->configBaseDir = g_strdup_printf("%s/ch", configbasedir);
> + cfg->configDir = g_strdup_printf("%s/domains",
> + cfg->configBaseDir);
> }
I'd rather have domain XMLs right under .../libvirt/ch/ directory, just
like we do for other drivers.
How about:
virCHDriverConfig *
virCHDriverConfigNew(bool privileged)
{
virCHDriverConfig *cfg;
...
if (privileged) {
cfg->logDir = g_strdup_printf("%s/log/libvirt/ch", LOCALSTATEDIR);
cfg->stateDir = g_strdup_printf("%s/libvirt/ch", RUNSTATEDIR);
cfg->saveDir = g_strdup_printf("%s/lib/libvirt/ch/save", LOCALSTATEDIR);
cfg->configBaseDir = g_strdup(SYSCONFDIR "/libvirt");
} else {
g_autofree char *rundir = NULL;
g_autofree char *cachedir = NULL;
cachedir = virGetUserCacheDirectory();
cfg->logDir = g_strdup_printf("%s/ch/log", cachedir);
rundir = virGetUserRuntimeDirectory();
cfg->stateDir = g_strdup_printf("%s/ch/run", rundir);
cfg->configBaseDir = virGetUserConfigDirectory();
cfg->saveDir = g_strdup_printf("%s/ch/save", cfg->configBaseDir);
}
cfg->configDir = g_strdup_printf("%s/ch", cfg->configBaseDir);
return cfg;
}
This would be compliant with other drivers.
Michal