[libvirt] [PATCH v2 05/12] qemu: Store pr runtime data in status XML

John Ferlan jferlan at redhat.com
Fri Mar 2 12:50:01 UTC 2018



On 02/21/2018 01:11 PM, Michal Privoznik wrote:
> Now that we generate pr-manager alias and socket path store them
> in status XML so that they are preserved across daemon restarts.
> 
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
>  src/qemu/qemu_domain.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 88 insertions(+), 2 deletions(-)
> 

Something that dawned on my this morning (sorry ;-)) - the ->alias could
easily be generated at reconnect time too.

> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index dffc4c30e..45205fd03 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -2540,6 +2540,92 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt,
>  }
>  
>  
> +static int
> +qemuStorageSourcePrivateDataParsePR(xmlXPathContextPtr ctxt,
> +                                    virStorageSourcePtr src)
> +{
> +    qemuDomainStorageSourcePrivatePtr srcPriv = QEMU_DOMAIN_STORAGE_SOURCE_PRIVATE(src);
> +    qemuDomainDiskPRDPtr prd = NULL;
> +    int rc;
> +    int ret = -1;
> +
> +    if ((rc = virXPathBoolean("boolean(./prd)", ctxt)) ==  0) {
                                                            ^^
Extra space above

> +        return 0;
> +    } else if (rc < 0) {
> +        return ret;
> +    }
> +
> +    if (VIR_ALLOC(prd) < 0)
> +        goto cleanup;

return ret works too since prd == NULL

> +
> +    if (!(prd->alias = virXPathString("string(./prd/alias)", ctxt)) ||
> +        !(prd->path = virXPathString("string(./prd/path)", ctxt))) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                       _("malformed <prd/>"));
> +        goto cleanup;
> +    }
> +
> +    VIR_STEAL_PTR(srcPriv->prd, prd);
> +    ret = 0;
> + cleanup:
> +    qemuDomainDiskPRDFree(prd);
> +    return ret;
> +}
> +
> +
> +static int
> +qemuStorageSourcePrivateDataFormatPR(virStorageSourcePtr src,
> +                                     virBufferPtr buf)
> +{
> +    qemuDomainStorageSourcePrivatePtr srcPriv = QEMU_DOMAIN_STORAGE_SOURCE_PRIVATE(src);
> +    qemuDomainDiskPRDPtr prd;
> +
> +    if (!srcPriv || !srcPriv->prd)
> +        return 0;
> +
> +    prd = srcPriv->prd;

Does saving the information really "matter" in whatever case it is that
uses a 'static' alias and path?  IOW: Should we save some sort of
boolean to indicate PR was desired and then if path is also provided, we
can use that path; otherwise, use the 'static' path when we try to
reconnect the socket.

> +
> +    virBufferAddLit(buf, "<prd>\n");
> +    virBufferAdjustIndent(buf, 2);
> +    virBufferAsprintf(buf, "<alias>%s</alias>\n", prd->alias);
> +    virBufferAsprintf(buf, "<path>%s</path>\n", prd->path);

alias and path could be attributes of prd too rather than elements on
their own, but that's just your implementation detail...  IDC, but
figured I'd note it anyway.

John


> +    virBufferAdjustIndent(buf, -2);
> +    virBufferAddLit(buf, "</prd>\n");
> +    return 0;
> +}
> +
> +
> +static int
> +qemuStorageSourcePrivateDataParse(xmlXPathContextPtr ctxt,
> +                                  virStorageSourcePtr src)
> +{
> +    if (!(src->privateData = qemuDomainStorageSourcePrivateNew()))
> +        return -1;
> +
> +    if (virStorageSourcePrivateDataParseRelPath(ctxt, src) < 0)
> +        return -1;
> +
> +    if (qemuStorageSourcePrivateDataParsePR(ctxt, src) < 0)
> +        return -1;
> +
> +    return 0;
> +}
> +
> +
> +static int
> +qemuStorageSourcePrivateDataFormat(virStorageSourcePtr src,
> +                                   virBufferPtr buf)
> +{
> +    if (virStorageSourcePrivateDataFormatRelPath(src, buf) < 0)
> +        return -1;
> +
> +    if (qemuStorageSourcePrivateDataFormatPR(src, buf) < 0)
> +        return -1;
> +
> +    return 0;
> +}
> +
> +
>  virDomainXMLPrivateDataCallbacks virQEMUDriverPrivateDataCallbacks = {
>      .alloc = qemuDomainObjPrivateAlloc,
>      .free = qemuDomainObjPrivateFree,
> @@ -2548,8 +2634,8 @@ virDomainXMLPrivateDataCallbacks virQEMUDriverPrivateDataCallbacks = {
>      .chrSourceNew = qemuDomainChrSourcePrivateNew,
>      .parse = qemuDomainObjPrivateXMLParse,
>      .format = qemuDomainObjPrivateXMLFormat,
> -    .storageParse = virStorageSourcePrivateDataParseRelPath,
> -    .storageFormat = virStorageSourcePrivateDataFormatRelPath,
> +    .storageParse = qemuStorageSourcePrivateDataParse,
> +    .storageFormat = qemuStorageSourcePrivateDataFormat,
>  };
>  
>  
> 




More information about the libvir-list mailing list