[libvirt] [PATCH v7 20/23] backup: qemu: Implement framework for backup job APIs
Peter Krempa
pkrempa at redhat.com
Wed Mar 27 11:33:52 UTC 2019
On Wed, Mar 27, 2019 at 05:10:51 -0500, Eric Blake wrote:
> Still needs to actually kick off the right QMP commands, but at
> least allows validation of backup XML, including the fact that
> a backup job can survive a libvirtd restart. Atomically creating
> a checkpoint alongside the backup still needs implementing.
>
> Signed-off-by: Eric Blake <eblake at redhat.com>
> ---
> src/qemu/qemu_domain.h | 4 +
> src/qemu/qemu_domain.c | 32 ++++++-
> src/qemu/qemu_driver.c | 185 +++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 217 insertions(+), 4 deletions(-)
>
> diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
> index 9b29628107..7e3641c6d0 100644
> --- a/src/qemu/qemu_domain.h
> +++ b/src/qemu/qemu_domain.h
> @@ -376,6 +376,10 @@ struct _qemuDomainObjPrivate {
>
> /* true if global -mem-prealloc appears on cmd line */
> bool memPrealloc;
> +
> + /* Any currently running backup job.
> + * FIXME: allow jobs in parallel. For now, at most one job, always id 1. */
> + virDomainBackupDefPtr backup;
> };
>
> # define QEMU_DOMAIN_PRIVATE(vm) \
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 8a2b951dde..6648240dc4 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -57,6 +57,7 @@
> #include "locking/domain_lock.h"
> #include "virdomainsnapshotobjlist.h"
> #include "virdomaincheckpointobjlist.h"
> +#include "backup_conf.h"
>
> #ifdef MAJOR_IN_MKDEV
> # include <sys/mkdev.h>
> @@ -2313,13 +2314,25 @@ static int
> qemuDomainObjPrivateXMLFormatBlockjobs(virBufferPtr buf,
> virDomainObjPtr vm)
> {
> + qemuDomainObjPrivatePtr priv = vm->privateData;
> virBuffer attrBuf = VIR_BUFFER_INITIALIZER;
> bool bj = qemuDomainHasBlockjob(vm, false);
> + int ret = -1;
>
> virBufferAsprintf(&attrBuf, " active='%s'",
> virTristateBoolTypeToString(virTristateBoolFromBool(bj)));
>
> - return virXMLFormatElement(buf, "blockjobs", &attrBuf, NULL);
> + if (virXMLFormatElement(buf, "blockjobs", &attrBuf, NULL) < 0)
> + goto cleanup;
> +
> + /* TODO: merge other blockjobs and backups into uniform space? */
> + if (priv->backup && virDomainBackupDefFormat(buf, priv->backup, true) < 0)
> + goto cleanup;
If this is a separate element please don't put it into this function.
This should format just <blockjobs>. If you wish to declare it as a
blockjob format it as a child of <blockjobs>.
> +
> + ret = 0;
> + cleanup:
> + virBufferFreeAndReset(&attrBuf);
> + return ret;
> }
>
>
> @@ -2666,18 +2679,29 @@ qemuDomainObjPrivateXMLParseAutomaticPlacement(xmlXPathContextPtr ctxt,
>
>
> static int
> -qemuDomainObjPrivateXMLParseBlockjobs(qemuDomainObjPrivatePtr priv,
> +qemuDomainObjPrivateXMLParseBlockjobs(virQEMUDriverPtr driver,
> + qemuDomainObjPrivatePtr priv,
> xmlXPathContextPtr ctxt)
> {
> + xmlNodePtr node;
> char *active;
> int tmp;
> + int ret = -1;
>
> if ((active = virXPathString("string(./blockjobs/@active)", ctxt)) &&
> (tmp = virTristateBoolTypeFromString(active)) > 0)
> priv->reconnectBlockjobs = tmp;
>
> + if ((node = virXPathNode("./domainbackup", ctxt)) &&
> + !(priv->backup = virDomainBackupDefParseNode(ctxt->doc, node,
> + driver->xmlopt,
> + VIR_DOMAIN_BACKUP_PARSE_INTERNAL)))
Same here. Put it into a separate function if it's considered separate.
Also I'd strongly suggest to put it into a container if you ever expect
more than one element present. so that it does not pollute the private
data part.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20190327/99a25fab/attachment-0001.sig>
More information about the libvir-list
mailing list