[libvirt] [PATCH 3/3] snapshot: implement LIST_LEAVES flag in esx

Daniel Veillard veillard at redhat.com
Wed Oct 12 14:24:52 UTC 2011


On Fri, Oct 07, 2011 at 08:37:05PM -0600, Eric Blake wrote:
> Relatively straight-forward filtering.
> 
> * src/esx/esx_vi.h (esxVI_GetNumberOfSnapshotTrees)
> (esxVI_GetSnapshotTreeNames): Add parameter.
> * src/esx/esx_vi.c (esxVI_GetNumberOfSnapshotTrees)
> (esxVI_GetSnapshotTreeNames): Allow leaf filtering.
> * src/esx/esx_driver.c (esxDomainSnapshotNum)
> (esxDomainSnapshotListNames, esxDomainSnapshotNumChildren)
> (esxDomainSnapshotListChildrenNames): Pass new flag through.
> ---
>  src/esx/esx_driver.c |   29 +++++++++++++++++++++--------
>  src/esx/esx_vi.c     |   27 ++++++++++++++++-----------
>  src/esx/esx_vi.h     |    4 ++--
>  3 files changed, 39 insertions(+), 21 deletions(-)
> 
> diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
> index bcf2406..f2a8f64 100644
> --- a/src/esx/esx_driver.c
> +++ b/src/esx/esx_driver.c
> @@ -4359,11 +4359,14 @@ esxDomainSnapshotNum(virDomainPtr domain, unsigned int flags)
>      esxPrivate *priv = domain->conn->privateData;
>      esxVI_VirtualMachineSnapshotTree *rootSnapshotTreeList = NULL;
>      bool recurse;
> +    bool leaves;
> 
>      virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_ROOTS |
> -                  VIR_DOMAIN_SNAPSHOT_LIST_METADATA, -1);
> +                  VIR_DOMAIN_SNAPSHOT_LIST_METADATA |
> +                  VIR_DOMAIN_SNAPSHOT_LIST_LEAVES, -1);
> 
>      recurse = (flags & VIR_DOMAIN_SNAPSHOT_LIST_ROOTS) == 0;
> +    leaves = (flags & VIR_DOMAIN_SNAPSHOT_LIST_LEAVES) != 0;
> 
>      if (esxVI_EnsureSession(priv->primary) < 0) {
>          return -1;
> @@ -4378,7 +4381,8 @@ esxDomainSnapshotNum(virDomainPtr domain, unsigned int flags)
>          return -1;
>      }
> 
> -    count = esxVI_GetNumberOfSnapshotTrees(rootSnapshotTreeList, recurse);
> +    count = esxVI_GetNumberOfSnapshotTrees(rootSnapshotTreeList, recurse,
> +                                           leaves);
> 
>      esxVI_VirtualMachineSnapshotTree_Free(&rootSnapshotTreeList);
> 
> @@ -4395,11 +4399,14 @@ esxDomainSnapshotListNames(virDomainPtr domain, char **names, int nameslen,
>      esxPrivate *priv = domain->conn->privateData;
>      esxVI_VirtualMachineSnapshotTree *rootSnapshotTreeList = NULL;
>      bool recurse;
> +    bool leaves;
> 
>      virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_ROOTS |
> -                  VIR_DOMAIN_SNAPSHOT_LIST_METADATA, -1);
> +                  VIR_DOMAIN_SNAPSHOT_LIST_METADATA |
> +                  VIR_DOMAIN_SNAPSHOT_LIST_LEAVES, -1);
> 
>      recurse = (flags & VIR_DOMAIN_SNAPSHOT_LIST_ROOTS) == 0;
> +    leaves = (flags & VIR_DOMAIN_SNAPSHOT_LIST_LEAVES) != 0;
> 
>      if (names == NULL || nameslen < 0) {
>          ESX_ERROR(VIR_ERR_INVALID_ARG, "%s", _("Invalid argument"));
> @@ -4420,7 +4427,7 @@ esxDomainSnapshotListNames(virDomainPtr domain, char **names, int nameslen,
>      }
> 
>      result = esxVI_GetSnapshotTreeNames(rootSnapshotTreeList, names, nameslen,
> -                                        recurse);
> +                                        recurse, leaves);
> 
>      esxVI_VirtualMachineSnapshotTree_Free(&rootSnapshotTreeList);
> 
> @@ -4437,11 +4444,14 @@ esxDomainSnapshotNumChildren(virDomainSnapshotPtr snapshot, unsigned int flags)
>      esxVI_VirtualMachineSnapshotTree *rootSnapshotTreeList = NULL;
>      esxVI_VirtualMachineSnapshotTree *snapshotTree = NULL;
>      bool recurse;
> +    bool leaves;
> 
>      virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS |
> -                  VIR_DOMAIN_SNAPSHOT_LIST_METADATA, -1);
> +                  VIR_DOMAIN_SNAPSHOT_LIST_METADATA |
> +                  VIR_DOMAIN_SNAPSHOT_LIST_LEAVES, -1);
> 
>      recurse = (flags & VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS) != 0;
> +    leaves = (flags & VIR_DOMAIN_SNAPSHOT_LIST_LEAVES) != 0;
> 
>      if (esxVI_EnsureSession(priv->primary) < 0) {
>          return -1;
> @@ -4462,7 +4472,7 @@ esxDomainSnapshotNumChildren(virDomainSnapshotPtr snapshot, unsigned int flags)
>      }
> 
>      count = esxVI_GetNumberOfSnapshotTrees(snapshotTree->childSnapshotList,
> -                                           recurse);
> +                                           recurse, leaves);
> 
>  cleanup:
>      esxVI_VirtualMachineSnapshotTree_Free(&rootSnapshotTreeList);
> @@ -4482,11 +4492,14 @@ esxDomainSnapshotListChildrenNames(virDomainSnapshotPtr snapshot,
>      esxVI_VirtualMachineSnapshotTree *rootSnapshotTreeList = NULL;
>      esxVI_VirtualMachineSnapshotTree *snapshotTree = NULL;
>      bool recurse;
> +    bool leaves;
> 
>      virCheckFlags(VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS |
> -                  VIR_DOMAIN_SNAPSHOT_LIST_METADATA, -1);
> +                  VIR_DOMAIN_SNAPSHOT_LIST_METADATA |
> +                  VIR_DOMAIN_SNAPSHOT_LIST_LEAVES, -1);
> 
>      recurse = (flags & VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS) != 0;
> +    leaves = (flags & VIR_DOMAIN_SNAPSHOT_LIST_LEAVES) != 0;
> 
>      if (names == NULL || nameslen < 0) {
>          ESX_ERROR(VIR_ERR_INVALID_ARG, "%s", _("Invalid argument"));
> @@ -4516,7 +4529,7 @@ esxDomainSnapshotListChildrenNames(virDomainSnapshotPtr snapshot,
>      }
> 
>      result = esxVI_GetSnapshotTreeNames(snapshotTree->childSnapshotList,
> -                                        names, nameslen, recurse);
> +                                        names, nameslen, recurse, leaves);
> 
>  cleanup:
>      esxVI_VirtualMachineSnapshotTree_Free(&rootSnapshotTreeList);
> diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c
> index 4a8c709..55a388a 100644
> --- a/src/esx/esx_vi.c
> +++ b/src/esx/esx_vi.c
> @@ -2164,17 +2164,19 @@ esxVI_GetVirtualMachineIdentity(esxVI_ObjectContent *virtualMachine,
> 
>  int
>  esxVI_GetNumberOfSnapshotTrees
> -  (esxVI_VirtualMachineSnapshotTree *snapshotTreeList, bool recurse)
> +  (esxVI_VirtualMachineSnapshotTree *snapshotTreeList, bool recurse,
> +   bool leaves)
>  {
>      int count = 0;
>      esxVI_VirtualMachineSnapshotTree *snapshotTree;
> 
>      for (snapshotTree = snapshotTreeList; snapshotTree != NULL;
>           snapshotTree = snapshotTree->_next) {
> -        count++;
> +        if (!(leaves && snapshotTree->childSnapshotList))
> +            count++;
>          if (recurse)
>              count += esxVI_GetNumberOfSnapshotTrees
> -                (snapshotTree->childSnapshotList, true);
> +                (snapshotTree->childSnapshotList, true, leaves);
>      }
> 
>      return count;
> @@ -2184,7 +2186,8 @@ esxVI_GetNumberOfSnapshotTrees
> 
>  int
>  esxVI_GetSnapshotTreeNames(esxVI_VirtualMachineSnapshotTree *snapshotTreeList,
> -                           char **names, int nameslen, bool recurse)
> +                           char **names, int nameslen, bool recurse,
> +                           bool leaves)
>  {
>      int count = 0;
>      int result;
> @@ -2194,14 +2197,16 @@ esxVI_GetSnapshotTreeNames(esxVI_VirtualMachineSnapshotTree *snapshotTreeList,
>      for (snapshotTree = snapshotTreeList;
>           snapshotTree != NULL && count < nameslen;
>           snapshotTree = snapshotTree->_next) {
> -        names[count] = strdup(snapshotTree->name);
> +        if (!(leaves && snapshotTree->childSnapshotList)) {
> +            names[count] = strdup(snapshotTree->name);
> 
> -        if (names[count] == NULL) {
> -            virReportOOMError();
> -            goto failure;
> -        }
> +            if (names[count] == NULL) {
> +                virReportOOMError();
> +                goto failure;
> +            }
> 
> -        count++;
> +            count++;
> +        }
> 
>          if (count >= nameslen) {
>              break;
> @@ -2211,7 +2216,7 @@ esxVI_GetSnapshotTreeNames(esxVI_VirtualMachineSnapshotTree *snapshotTreeList,
>              result = esxVI_GetSnapshotTreeNames(snapshotTree->childSnapshotList,
>                                                  names + count,
>                                                  nameslen - count,
> -                                                true);
> +                                                true, leaves);
> 
>              if (result < 0) {
>                  goto failure;
> diff --git a/src/esx/esx_vi.h b/src/esx/esx_vi.h
> index 05ed3d0..b8e921f 100644
> --- a/src/esx/esx_vi.h
> +++ b/src/esx/esx_vi.h
> @@ -359,11 +359,11 @@ int esxVI_GetVirtualMachineIdentity(esxVI_ObjectContent *virtualMachine,
> 
>  int esxVI_GetNumberOfSnapshotTrees
>        (esxVI_VirtualMachineSnapshotTree *snapshotTreeList,
> -       bool recurse);
> +       bool recurse, bool leaves);
> 
>  int esxVI_GetSnapshotTreeNames
>        (esxVI_VirtualMachineSnapshotTree *snapshotTreeList, char **names,
> -       int nameslen, bool recurse);
> +       int nameslen, bool recurse, bool leaves);
> 
>  int esxVI_GetSnapshotTreeByName
>        (esxVI_VirtualMachineSnapshotTree *snapshotTreeList, const char *name,

  ACK looks fine but it may be better if Matthias could have a look :-)

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list