[libvirt] [PATCH v3 13/28] lock_driver: Introduce VIR_LOCK_MANAGER_RESOURCE_TYPE_METADATA

John Ferlan jferlan at redhat.com
Thu Aug 30 21:34:44 UTC 2018



On 08/27/2018 04:08 AM, Michal Privoznik wrote:
> This is a new type of object that lock drivers can handle.
> Currently, it is supported by lockd driver only.
> 
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
>  src/locking/lock_driver.h         |  2 ++
>  src/locking/lock_driver_lockd.c   | 43 +++++++++++++++++++++++++++++++--------
>  src/locking/lock_driver_sanlock.c |  3 ++-
>  3 files changed, 38 insertions(+), 10 deletions(-)
> 
> diff --git a/src/locking/lock_driver.h b/src/locking/lock_driver.h
> index a9d2041c30..9be0abcfba 100644
> --- a/src/locking/lock_driver.h
> +++ b/src/locking/lock_driver.h
> @@ -51,6 +51,8 @@ typedef enum {
>      VIR_LOCK_MANAGER_RESOURCE_TYPE_DISK = 0,
>      /* A lease against an arbitrary resource */
>      VIR_LOCK_MANAGER_RESOURCE_TYPE_LEASE = 1,
> +    /* The resource to be locked is a metadata */
> +    VIR_LOCK_MANAGER_RESOURCE_TYPE_METADATA = 2,
>  } virLockManagerResourceType;
>  
>  typedef enum {
> diff --git a/src/locking/lock_driver_lockd.c b/src/locking/lock_driver_lockd.c
> index 98953500b7..d7cb183d7a 100644
> --- a/src/locking/lock_driver_lockd.c
> +++ b/src/locking/lock_driver_lockd.c
> @@ -557,6 +557,7 @@ static int virLockManagerLockDaemonAddResource(virLockManagerPtr lock,
>      virLockManagerLockDaemonPrivatePtr priv = lock->privateData;
>      char *newName = NULL;
>      char *newLockspace = NULL;
> +    int newFlags = 0;
>      bool autoCreate = false;
>      int ret = -1;
>  
> @@ -569,7 +570,7 @@ static int virLockManagerLockDaemonAddResource(virLockManagerPtr lock,
>      switch (priv->type) {
>      case VIR_LOCK_MANAGER_OBJECT_TYPE_DOMAIN:
>  
> -        switch (type) {
> +        switch ((virLockManagerResourceType) type) {
>          case VIR_LOCK_MANAGER_RESOURCE_TYPE_DISK:
>              if (params || nparams) {
>                  virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> @@ -670,6 +671,8 @@ static int virLockManagerLockDaemonAddResource(virLockManagerPtr lock,
>                  goto cleanup;
>  
>          }   break;
> +
> +        case VIR_LOCK_MANAGER_RESOURCE_TYPE_METADATA:

I'm still conflicted with Unknown and Unsupported.

>          default:
>              virReportError(VIR_ERR_INTERNAL_ERROR,
>                             _("Unknown lock manager object type %d for domain lock object"),
> @@ -679,6 +682,29 @@ static int virLockManagerLockDaemonAddResource(virLockManagerPtr lock,
>          break;
>  
>      case VIR_LOCK_MANAGER_OBJECT_TYPE_DAEMON:
> +        switch ((virLockManagerResourceType) type) {
> +        case VIR_LOCK_MANAGER_RESOURCE_TYPE_METADATA:
> +            if (params || nparams) {
> +                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                               _("Unexpected parameters for metadata resource"));
> +                goto cleanup;
> +            }
> +            if (VIR_STRDUP(newLockspace, "") < 0 ||
> +                VIR_STRDUP(newName, name) < 0)
> +                goto cleanup;
> +            newFlags |= VIR_LOCK_SPACE_PROTOCOL_ACQUIRE_RESOURCE_METADATA;
> +            break;
> +
> +        case VIR_LOCK_MANAGER_RESOURCE_TYPE_DISK:
> +        case VIR_LOCK_MANAGER_RESOURCE_TYPE_LEASE:

Again Unknown and Unsupported...

> +        default:
> +            virReportError(VIR_ERR_INTERNAL_ERROR,
> +                           _("Unknown lock manager object type %d for daemon lock object"),
> +                           type);
> +            goto cleanup;
> +        }
> +        break;
> +
>      default:
>          virReportError(VIR_ERR_INTERNAL_ERROR,
>                         _("Unknown lock manager object type %d"),
> @@ -686,19 +712,18 @@ static int virLockManagerLockDaemonAddResource(virLockManagerPtr lock,
>          goto cleanup;
>      }
>  
> +    if (flags & VIR_LOCK_MANAGER_RESOURCE_SHARED)
> +        newFlags |= VIR_LOCK_SPACE_PROTOCOL_ACQUIRE_RESOURCE_SHARED;
> +
> +    if (autoCreate)

Interstingly enough, @newFlags is adjusted in the new case and we could
do the same in the existing case instead of setting @autoCreate, just
set the newFlags. Of course I'm quite aware that this could have been
done in a separate patch too. IOW: I could easily support removing
@autoCreate...

> +        newFlags |= VIR_LOCK_SPACE_PROTOCOL_ACQUIRE_RESOURCE_AUTOCREATE;
> +
>      if (VIR_EXPAND_N(priv->resources, priv->nresources, 1) < 0)
>          goto cleanup;
>  
>      VIR_STEAL_PTR(priv->resources[priv->nresources-1].lockspace, newLockspace);
>      VIR_STEAL_PTR(priv->resources[priv->nresources-1].name, newName);
> -
> -    if (flags & VIR_LOCK_MANAGER_RESOURCE_SHARED)
> -        priv->resources[priv->nresources-1].flags |=
> -            VIR_LOCK_SPACE_PROTOCOL_ACQUIRE_RESOURCE_SHARED;
> -
> -    if (autoCreate)
> -        priv->resources[priv->nresources-1].flags |=
> -            VIR_LOCK_SPACE_PROTOCOL_ACQUIRE_RESOURCE_AUTOCREATE;
> +    priv->resources[priv->nresources-1].flags = newFlags;
>  
>      ret = 0;
>   cleanup:
> diff --git a/src/locking/lock_driver_sanlock.c b/src/locking/lock_driver_sanlock.c
> index fe422d3be6..9393e7d9a2 100644
> --- a/src/locking/lock_driver_sanlock.c
> +++ b/src/locking/lock_driver_sanlock.c
> @@ -815,7 +815,7 @@ static int virLockManagerSanlockAddResource(virLockManagerPtr lock,
>      if (flags & VIR_LOCK_MANAGER_RESOURCE_READONLY)
>          return 0;
>  
> -    switch (type) {
> +    switch ((virLockManagerResourceType) type) {
>      case VIR_LOCK_MANAGER_RESOURCE_TYPE_DISK:
>          if (driver->autoDiskLease) {
>              if (virLockManagerSanlockAddDisk(driver, lock, name, nparams, params,
> @@ -839,6 +839,7 @@ static int virLockManagerSanlockAddResource(virLockManagerPtr lock,
>              return -1;
>          break;
>  
> +    case VIR_LOCK_MANAGER_RESOURCE_TYPE_METADATA:

Conflict continues.

>      default:
>          virReportError(VIR_ERR_INTERNAL_ERROR,
>                         _("Unknown lock manager object type %d for domain lock object"),
> 

So after all that - I guess I can accept that Unknown will be used and a
separate Unsupported isn't necessary.

However, I do think removing @autoCreate is worthwhile especially since
it's specific to TYPE_DOMAIN and TYPE_DISK. So with that, for the logic
at least regardless if the exact location changes as a result of motion
that may happen prior to this...

Reviewed-by: John Ferlan <jferlan at redhat.com>

John




More information about the libvir-list mailing list