[libvirt] [PATCH v3 12/28] _virLockManagerLockDaemonPrivate: Move @hasRWDisks into dom union

John Ferlan jferlan at redhat.com
Thu Aug 30 21:14:48 UTC 2018



On 08/27/2018 04:08 AM, Michal Privoznik wrote:
> The fact whether domain has or hasn't RW disks is specific to

"or doesn't have"

> VIR_LOCK_MANAGER_OBJECT_TYPE_DOMAIN and therefore should reside
> in union specific to it.
> 
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
>  src/locking/lock_driver_lockd.c | 187 +++++++++++++++++++++-------------------
>  1 file changed, 100 insertions(+), 87 deletions(-)
> 

This patch does a bit more than advertised...

> diff --git a/src/locking/lock_driver_lockd.c b/src/locking/lock_driver_lockd.c
> index 8ca0cf5426..98953500b7 100644
> --- a/src/locking/lock_driver_lockd.c
> +++ b/src/locking/lock_driver_lockd.c
> @@ -63,6 +63,8 @@ struct _virLockManagerLockDaemonPrivate {
>              char *name;
>              int id;
>              pid_t pid;
> +
> +            bool hasRWDisks;
>          } dom;
>  
>          struct {
> @@ -74,8 +76,6 @@ struct _virLockManagerLockDaemonPrivate {
>  
>      size_t nresources;
>      virLockManagerLockDaemonResourcePtr resources;
> -
> -    bool hasRWDisks;
>  };

>From the aspect of @dom vs @daemon union, moving @hasRWDisks still has
no bearing other than classifying it as a @dom type resource which is
fine, don't get me wrong on this - I'm just trying to go one patch at a
time here.

>  
>  
> @@ -566,107 +566,119 @@ static int virLockManagerLockDaemonAddResource(virLockManagerPtr lock,
>      if (flags & VIR_LOCK_MANAGER_RESOURCE_READONLY)
>          return 0;
>  
> -    switch (type) {
> -    case VIR_LOCK_MANAGER_RESOURCE_TYPE_DISK:
> -        if (params || nparams) {
> -            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                           _("Unexpected parameters for disk resource"));
> -            goto cleanup;
> -        }
> -        if (!driver->autoDiskLease) {
> -            if (!(flags & (VIR_LOCK_MANAGER_RESOURCE_SHARED |
> -                           VIR_LOCK_MANAGER_RESOURCE_READONLY)))
> -                priv->hasRWDisks = true;
> -            return 0;
> -        }
> +    switch (priv->type) {
> +    case VIR_LOCK_MANAGER_OBJECT_TYPE_DOMAIN:

Hmm. Why wasn't this done in the previous patch?

Not that I'm looking for more patches to review, but processing this
adjustment could have been easier if the @type switch code is/was put
into it's own helper before adding the switch for priv->type. Could mean
going back to patch8 and before patch11 somewhere.

>  
> -        /* XXX we should somehow pass in TYPE=BLOCK info
> -         * from the domain_lock code, instead of assuming /dev
> -         */
> -        if (STRPREFIX(name, "/dev") &&
> -            driver->lvmLockSpaceDir) {
> -            VIR_DEBUG("Trying to find an LVM UUID for %s", name);
> -            if (virStorageFileGetLVMKey(name, &newName) < 0)
> +        switch (type) {
> +        case VIR_LOCK_MANAGER_RESOURCE_TYPE_DISK:
> +            if (params || nparams) {
> +                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                               _("Unexpected parameters for disk resource"));
>                  goto cleanup;
> +            }
> +            if (!driver->autoDiskLease) {
> +                if (!(flags & (VIR_LOCK_MANAGER_RESOURCE_SHARED |
> +                               VIR_LOCK_MANAGER_RESOURCE_READONLY)))
> +                    priv->t.dom.hasRWDisks = true;
> +                return 0;
> +            }
>  
> -            if (newName) {
> -                VIR_DEBUG("Got an LVM UUID %s for %s", newName, name);
> -                if (VIR_STRDUP(newLockspace, driver->lvmLockSpaceDir) < 0)
> +            /* XXX we should somehow pass in TYPE=BLOCK info
> +             * from the domain_lock code, instead of assuming /dev
> +             */
> +            if (STRPREFIX(name, "/dev") &&
> +                driver->lvmLockSpaceDir) {
> +                VIR_DEBUG("Trying to find an LVM UUID for %s", name);
> +                if (virStorageFileGetLVMKey(name, &newName) < 0)
>                      goto cleanup;
> -                autoCreate = true;
> -                break;
> +
> +                if (newName) {
> +                    VIR_DEBUG("Got an LVM UUID %s for %s", newName, name);
> +                    if (VIR_STRDUP(newLockspace, driver->lvmLockSpaceDir) < 0)
> +                        goto cleanup;
> +                    autoCreate = true;
> +                    break;
> +                }
> +                virResetLastError();
> +                /* Fallback to generic non-block code */
>              }
> -            virResetLastError();
> -            /* Fallback to generic non-block code */
> -        }
>  
> -        if (STRPREFIX(name, "/dev") &&
> -            driver->scsiLockSpaceDir) {
> -            VIR_DEBUG("Trying to find an SCSI ID for %s", name);
> -            if (virStorageFileGetSCSIKey(name, &newName) < 0)
> -                goto cleanup;
> +            if (STRPREFIX(name, "/dev") &&
> +                driver->scsiLockSpaceDir) {
> +                VIR_DEBUG("Trying to find an SCSI ID for %s", name);
> +                if (virStorageFileGetSCSIKey(name, &newName) < 0)
> +                    goto cleanup;
> +
> +                if (newName) {
> +                    VIR_DEBUG("Got an SCSI ID %s for %s", newName, name);
> +                    if (VIR_STRDUP(newLockspace, driver->scsiLockSpaceDir) < 0)
> +                        goto cleanup;
> +                    autoCreate = true;
> +                    break;
> +                }
> +                virResetLastError();
> +                /* Fallback to generic non-block code */
> +            }
>  
> -            if (newName) {
> -                VIR_DEBUG("Got an SCSI ID %s for %s", newName, name);
> -                if (VIR_STRDUP(newLockspace, driver->scsiLockSpaceDir) < 0)
> +            if (driver->fileLockSpaceDir) {
> +                if (VIR_STRDUP(newLockspace, driver->fileLockSpaceDir) < 0)
> +                    goto cleanup;
> +                if (virCryptoHashString(VIR_CRYPTO_HASH_SHA256, name, &newName) < 0)
>                      goto cleanup;
>                  autoCreate = true;
> -                break;
> +                VIR_DEBUG("Using indirect lease %s for %s", newName, name);
> +            } else {
> +                if (VIR_STRDUP(newLockspace, "") < 0)
> +                    goto cleanup;
> +                if (VIR_STRDUP(newName, name) < 0)
> +                    goto cleanup;
> +                VIR_DEBUG("Using direct lease for %s", name);
>              }
> -            virResetLastError();
> -            /* Fallback to generic non-block code */
> -        }
>  
> -        if (driver->fileLockSpaceDir) {
> -            if (VIR_STRDUP(newLockspace, driver->fileLockSpaceDir) < 0)
> -                goto cleanup;
> -            if (virCryptoHashString(VIR_CRYPTO_HASH_SHA256, name, &newName) < 0)
> +            break;
> +        case VIR_LOCK_MANAGER_RESOURCE_TYPE_LEASE: {
> +            size_t i;
> +            char *path = NULL;
> +            char *lockspace = NULL;
> +            for (i = 0; i < nparams; i++) {
> +                if (STREQ(params[i].key, "offset")) {
> +                    if (params[i].value.ul != 0) {
> +                        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                                       _("Offset must be zero for this lock manager"));
> +                        goto cleanup;
> +                    }
> +                } else if (STREQ(params[i].key, "lockspace")) {
> +                    lockspace = params[i].value.str;
> +                } else if (STREQ(params[i].key, "path")) {
> +                    path = params[i].value.str;
> +                } else {
> +                    virReportError(VIR_ERR_INTERNAL_ERROR,
> +                                   _("Unexpected parameter %s for lease resource"),
> +                                   params[i].key);
> +                    goto cleanup;
> +                }
> +            }
> +            if (!path || !lockspace) {
> +                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                               _("Missing path or lockspace for lease resource"));
>                  goto cleanup;
> -            autoCreate = true;
> -            VIR_DEBUG("Using indirect lease %s for %s", newName, name);
> -        } else {
> -            if (VIR_STRDUP(newLockspace, "") < 0)
> +            }
> +            if (virAsprintf(&newLockspace, "%s/%s",
> +                            path, lockspace) < 0)
>                  goto cleanup;
>              if (VIR_STRDUP(newName, name) < 0)
>                  goto cleanup;
> -            VIR_DEBUG("Using direct lease for %s", name);
> -        }
>  
> +        }   break;
> +        default:
> +            virReportError(VIR_ERR_INTERNAL_ERROR,
> +                           _("Unknown lock manager object type %d for domain lock object"),
> +                           type);
> +            goto cleanup;
> +        }
>          break;
> -    case VIR_LOCK_MANAGER_RESOURCE_TYPE_LEASE: {
> -        size_t i;
> -        char *path = NULL;
> -        char *lockspace = NULL;
> -        for (i = 0; i < nparams; i++) {
> -            if (STREQ(params[i].key, "offset")) {
> -                if (params[i].value.ul != 0) {
> -                    virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                                   _("Offset must be zero for this lock manager"));
> -                    goto cleanup;
> -                }
> -            } else if (STREQ(params[i].key, "lockspace")) {
> -                lockspace = params[i].value.str;
> -            } else if (STREQ(params[i].key, "path")) {
> -                path = params[i].value.str;
> -            } else {
> -                virReportError(VIR_ERR_INTERNAL_ERROR,
> -                               _("Unexpected parameter %s for lease resource"),
> -                               params[i].key);
> -                goto cleanup;
> -            }
> -        }
> -        if (!path || !lockspace) {
> -            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> -                           _("Missing path or lockspace for lease resource"));
> -            goto cleanup;
> -        }
> -        if (virAsprintf(&newLockspace, "%s/%s",
> -                        path, lockspace) < 0)
> -            goto cleanup;
> -        if (VIR_STRDUP(newName, name) < 0)
> -            goto cleanup;
>  
> -    }   break;
> +    case VIR_LOCK_MANAGER_OBJECT_TYPE_DAEMON:

Especially because of this.  So we cannot acquire a daemon type lock
yet, which is I supposed fine/expected, but that's perhaps more because
it's not yet supported vs. unknown.

John

>      default:
>          virReportError(VIR_ERR_INTERNAL_ERROR,
>                         _("Unknown lock manager object type %d"),
> @@ -711,8 +723,9 @@ static int virLockManagerLockDaemonAcquire(virLockManagerPtr lock,
>      virCheckFlags(VIR_LOCK_MANAGER_ACQUIRE_REGISTER_ONLY |
>                    VIR_LOCK_MANAGER_ACQUIRE_RESTRICT, -1);
>  
> -    if (priv->nresources == 0 &&
> -        priv->hasRWDisks &&
> +    if (priv->type == VIR_LOCK_MANAGER_OBJECT_TYPE_DOMAIN &&
> +        priv->nresources == 0 &&
> +        priv->t.dom.hasRWDisks &&
>          driver->requireLeaseForDisks) {
>          virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>                         _("Read/write, exclusive access, disks were present, but no leases specified"));
> 




More information about the libvir-list mailing list