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

Reply via email to