[PATCH v2 2/3] lib: Repurpose virDomainSaveParams() with no VIR_DOMAIN_SAVE_PARAM_FILE
Michal Prívozník
mprivozn at redhat.com
Fri May 13 13:54:16 UTC 2022
On 5/13/22 14:57, Claudio Fontana wrote:
> On 5/13/22 9:54 AM, Michal Privoznik wrote:
>> When no VIR_DOMAIN_SAVE_PARAM_FILE typed param is set when
>> calling virDomainSaveParams() then in turn virQEMUFileOpenAs()
>> tries to open a NULL path.
>>
>> We have two options now:
>> 1) require the typed param, which in turn may be promoted to a
>> regular argument, or
>>
>> 2) use this opportunity to make the API behave like
>> virDomainManagedSave() and use typed params to pass extra
>> arguments, instead of having to invent new managed save API
>> with typed params.
>>
>> Let's go with option 2, as it is more future proof.
>>
>> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>> ---
>> src/libvirt-domain.c | 2 ++
>> src/qemu/qemu_driver.c | 33 ++++++++++++++++++++-------------
>> 2 files changed, 22 insertions(+), 13 deletions(-)
>>
>> diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
>> index d1d62daa71..208c2438fe 100644
>> --- a/src/libvirt-domain.c
>> +++ b/src/libvirt-domain.c
>> @@ -1007,6 +1007,8 @@ virDomainSaveFlags(virDomainPtr domain, const char *to,
>> * @flags: bitwise-OR of virDomainSaveRestoreFlags
>> *
>> * This method extends virDomainSaveFlags by adding parameters.
>> + * If VIR_DOMAIN_SAVE_PARAM_FILE is not provided then a managed save is
>> + * performed (see virDomainManagedSave).
>> *
>> * Returns 0 in case of success and -1 in case of failure.
>> *
>> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>> index 7d8c7176d9..0b31c73bb9 100644
>> --- a/src/qemu/qemu_driver.c
>> +++ b/src/qemu/qemu_driver.c
>> @@ -2772,6 +2772,7 @@ qemuDomainManagedSavePath(virQEMUDriver *driver, virDomainObj *vm)
>> static int
>> qemuDomainManagedSaveHelper(virQEMUDriver *driver,
>> virDomainObj *vm,
>> + const char *dxml,
>> unsigned int flags)
>> {
>> g_autoptr(virQEMUDriverConfig) cfg = NULL;
>> @@ -2799,7 +2800,7 @@ qemuDomainManagedSaveHelper(virQEMUDriver *driver,
>> VIR_INFO("Saving state of domain '%s' to '%s'", vm->def->name, path);
>>
>> if (qemuDomainSaveInternal(driver, vm, path, compressed,
>> - compressor, NULL, flags) < 0)
>> + compressor, dxml, flags) < 0)
>> return -1;
>>
>> vm->hasManagedSave = true;
>> @@ -2853,17 +2854,18 @@ qemuDomainSave(virDomainPtr dom, const char *path)
>>
>> static int
>> qemuDomainSaveParams(virDomainPtr dom,
>> - virTypedParameterPtr params, int nparams,
>> + virTypedParameterPtr params,
>> + int nparams,
>> unsigned int flags)
>> {
>> + virQEMUDriver *driver = dom->conn->privateData;
>> + g_autoptr(virQEMUDriverConfig) cfg = NULL;
>> + virDomainObj *vm = NULL;
>> + g_autoptr(virCommand) compressor = NULL;
>> const char *to = NULL;
>> const char *dxml = NULL;
>> - virQEMUDriver *driver = dom->conn->privateData;
>> int compressed;
>> - g_autoptr(virCommand) compressor = NULL;
>> int ret = -1;
>> - virDomainObj *vm = NULL;
>> - g_autoptr(virQEMUDriverConfig) cfg = NULL;
>>
>> virCheckFlags(VIR_DOMAIN_SAVE_BYPASS_CACHE |
>> VIR_DOMAIN_SAVE_RUNNING |
>> @@ -2884,18 +2886,23 @@ qemuDomainSaveParams(virDomainPtr dom,
>> VIR_DOMAIN_SAVE_PARAM_DXML, &dxml) < 0)
>> return -1;
>>
>> - cfg = virQEMUDriverGetConfig(driver);
>> - if ((compressed = qemuSaveImageGetCompressionProgram(cfg->saveImageFormat,
>> - &compressor,
>> - "save", false)) < 0)
>> - goto cleanup;
>> -
>> if (!(vm = qemuDomainObjFromDomain(dom)))
>> goto cleanup;
>>
>> if (virDomainSaveParamsEnsureACL(dom->conn, vm->def) < 0)
>> goto cleanup;
>>
>> + if (!to) {
>> + /* If no save path was provided then this behaves as managed save. */
>> + return qemuDomainManagedSaveHelper(driver, vm, dxml, flags);
>> + }
>
> Is this sufficient? In some cases I am seeing that omitted string parameters are passed as the empty string.
> In my multifd series I encountered this with the optional --parallel-compression argument,
>
> that in this case would mean:
>
> if (!to || !to[0])
That's likely caused by virsh. I haven't checked your patches yet, but
depending on how the argument is queried for in virsh you may get a NULL
or an empty string. However, empty string doesn't matter as it produces
sensible error message:
No such file or directory: ''
Michal
More information about the libvir-list
mailing list