[libvirt RFCv4 06/20] libvirt: introduce virDomainSaveParametersFlags public API
Claudio Fontana
cfontana at suse.de
Fri Apr 29 09:26:12 UTC 2022
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 at 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
>
More information about the libvir-list
mailing list