On 4/28/22 11:12 AM, Daniel P. Berrangé wrote:
On Wed, Apr 27, 2022 at 11:13:25PM +0200, Claudio Fontana wrote:
> add new API in order to be able to extend parameters to the domain
> save operation. We will use it to fit the existing arguments of
> VirDomainSaveFlags, and then add parallel saves functionality.
>
> Signed-off-by: Claudio Fontana <cfontana(a)suse.de>
> ---
> include/libvirt/libvirt-domain.h | 45 ++++++++++++++++++++++++++++
> src/driver-hypervisor.h | 7 +++++
> src/libvirt-domain.c | 51 ++++++++++++++++++++++++++++++++
> src/libvirt_public.syms | 5 ++++
> 4 files changed, 108 insertions(+)
>
> diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
> index 9aa214f3df..b870a73b64 100644
> --- a/include/libvirt/libvirt-domain.h
> +++ b/include/libvirt/libvirt-domain.h
> @@ -1481,6 +1481,8 @@ typedef enum {
> VIR_DOMAIN_SAVE_RUNNING = 1 << 1, /* Favor running over paused */
> VIR_DOMAIN_SAVE_PAUSED = 1 << 2, /* Favor paused over running */
> VIR_DOMAIN_SAVE_RESET_NVRAM = 1 << 3, /* Re-initialize NVRAM from
template */
> + /** Since: v8.3.0 */
> + VIR_DOMAIN_SAVE_PARALLEL = 1 << 4, /* Parallel Save/Restore to
multiple files */
> } virDomainSaveRestoreFlags;
>
> int virDomainSave (virDomainPtr domain,
> @@ -1489,6 +1491,10 @@ int virDomainSaveFlags (virDomainPtr
domain,
> const char *to,
> const char *dxml,
> unsigned int flags);
> +int virDomainSaveParametersFlags (virDomainPtr domain,
> + virTypedParameterPtr params,
> + int nparams,
> + unsigned int flags);
BTW, we don't need 'Flags' as a suffix here. We only add 'Flags'
suffixes
when we had an existing API that was missing flags and need a new unique
name. I'd also probably shorten to 'Params', eg in this case, it is
sufficient to have virDomainSaveParams and virDomainRestoreParams.
Ok, will do in the next spin.
> int virDomainRestore (virConnectPtr conn,
> const char *from);
> int virDomainRestoreFlags (virConnectPtr conn,
> @@ -1496,6 +1502,45 @@ int virDomainRestoreFlags (virConnectPtr
conn,
> const char *dxml,
> unsigned int flags);
>
> +/**
> + * VIR_SAVE_PARAM_FILE:
> + *
> + * the parameter used to specify the savestate file to save to or restore from.
> + * For parallel saves, this is the main file, with the extra connections adding
suffix
> + * .1 .2 .3 ... up to VIR_SAVE_PARAM_PARALLEL_CONNECTIONS.
> + *
> + * Since: v8.3.0
> + */
> +# define VIR_SAVE_PARAM_FILE "file"
> +
> +/**
> + * VIR_SAVE_PARAM_DXML:
> + *
> + * an optional parameter used to adjust guest xml on restore.
> + * If the hypervisor supports it, it can be used to alter
> + * host-specific portions of the domain XML that will be used when
> + * restoring an image. For example, it is possible to alter the
> + * device while the domain is stopped.
> + *
> + * Since: v8.3.0
> + */
> +# define VIR_SAVE_PARAM_DXML "dxml"
> +
> +/**
> + * VIR_SAVE_PARAM_PARALLEL_CONNECTIONS:
> + *
> + * this optional parameter mirrors the migration parameter
> + * VIR_MIGRATE_PARAM_PARALLEL_CONNECTIONS.
> + *
> + * This parameter is used when saving or restoring state files
> + * in parallel using the flag VIR_DOMAIN_SAVE_PARALLEL .
> + * It specifies the number of extra files to save/restore
> + * using parallel connections.
> + *
> + * Since: v8.3.0
> + */
> +# define VIR_SAVE_PARAM_PARALLEL_CONNECTIONS "parallel.connections"
> +
> /* See below for virDomainSaveImageXMLFlags */
> char * virDomainSaveImageGetXMLDesc (virConnectPtr conn,
> const char *file,
> diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h
> index 4423eb0885..a4e1d21e76 100644
> --- a/src/driver-hypervisor.h
> +++ b/src/driver-hypervisor.h
> @@ -240,6 +240,12 @@ typedef int
> const char *dxml,
> unsigned int flags);
>
> +typedef int
> +(*virDrvDomainSaveParametersFlags)(virDomainPtr domain,
> + virTypedParameterPtr params,
> + int nparams,
> + unsigned int flags);
> +
> typedef int
> (*virDrvDomainRestore)(virConnectPtr conn,
> const char *from);
> @@ -1489,6 +1495,7 @@ struct _virHypervisorDriver {
> virDrvDomainGetControlInfo domainGetControlInfo;
> virDrvDomainSave domainSave;
> virDrvDomainSaveFlags domainSaveFlags;
> + virDrvDomainSaveParametersFlags domainSaveParametersFlags;
> virDrvDomainRestore domainRestore;
> virDrvDomainRestoreFlags domainRestoreFlags;
> virDrvDomainSaveImageGetXMLDesc domainSaveImageGetXMLDesc;
> diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
> index cbd7902d2d..9e4fcfd022 100644
> --- a/src/libvirt-domain.c
> +++ b/src/libvirt-domain.c
> @@ -959,6 +959,57 @@ virDomainSaveFlags(virDomainPtr domain, const char *to,
> return -1;
> }
>
> +/**
> + * virDomainSaveParametersFlags:
> + * @domain: a domain object
> + * @params: save parameters
> + * @nparams: number of save parameters
> + * @flags: bitwise-OR of virDomainSaveRestoreFlags
> + *
> + * This method extends virDomainSaveFlags by adding parameters to Save.
> + *
> + * If @flags includes VIR_DOMAIN_SAVE_PARALLEL, then libvirt will
> + * attempt to trigger a parallel transfer to multiple files,
> + * where the number of extra files is determined by the parameter
> + * VIR_SAVE_PARAM_PARALLEL_CONNECTIONS.
> + *
> + * Returns 0 in case of success and -1 in case of failure.
> + */
> +int
> +virDomainSaveParametersFlags(virDomainPtr domain,
> + virTypedParameterPtr params, int nparams,
> + unsigned int flags)
> +{
> + virConnectPtr conn;
> +
> + VIR_DOMAIN_DEBUG(domain, "params=%p, nparams=%d, flags=0x%x",
> + params, nparams, flags);
> + VIR_TYPED_PARAMS_DEBUG(params, nparams);
> +
> + virResetLastError();
> +
> + virCheckDomainReturn(domain, -1);
> + conn = domain->conn;
> +
> + virCheckReadOnlyGoto(conn->flags, error);
> +
> + VIR_EXCLUSIVE_FLAGS_GOTO(VIR_DOMAIN_SAVE_RUNNING,
> + VIR_DOMAIN_SAVE_PAUSED,
> + error);
> +
> + if (conn->driver->domainSaveParametersFlags) {
> + if (conn->driver->domainSaveParametersFlags(domain, params, nparams,
flags) < 0)
> + goto error;
> + return 0;
> + }
> +
> + virReportUnsupportedError();
> +
> + error:
> + virDispatchError(domain->conn);
> + return -1;
> +}
> +
>
> /**
> * virDomainRestore:
> diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
> index f93692c427..eb3a7afb75 100644
> --- a/src/libvirt_public.syms
> +++ b/src/libvirt_public.syms
> @@ -916,4 +916,9 @@ LIBVIRT_8.0.0 {
> virDomainSetLaunchSecurityState;
> } LIBVIRT_7.8.0;
>
> +LIBVIRT_8.3.0 {
> + global:
> + virDomainSaveParametersFlags;
> +} LIBVIRT_8.0.0;
> +
> # .... define new API here using predicted next version number ....
> --
> 2.34.1
>
With regards,
Daniel