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

John Ferlan jferlan at redhat.com
Tue Sep 4 13:38:08 UTC 2018



On 09/03/2018 11:13 AM, Michal Privoznik wrote:
> On 08/30/2018 11:34 PM, John Ferlan wrote:
>>
>>
>> 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:
> 
> As I explain in one of my previous replies, users are not really
> expected to see this message. Is merely for us to avoid broken code
> pattern. Even if it so happens that broken code slips through review,
> what difference does it make for users to see "Unsupported lock manager
> object type" vs "Unknown lock manager object type"? They'll file a bug
> and we will notice immediately what is the problem when looking into the
> code (we will notice it because the error message logs type number).
> 

Consider my your early warning bz then ;-).  It doesn't really matter
that much... Maybe it's more of an "Unsupported" message regardless of
whether it's META or 'default'. At first I considered noting the Enum
range error, but it's not the same here.

I'll leave it as a design decision and move on.

John

>>>              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...
> 
> Okay.
> 
> Michal
> 




More information about the libvir-list mailing list