[libvirt] [PATCH 4/8] secret: Clean up virSecretObjListAdd processing

Michal Privoznik mprivozn at redhat.com
Fri Jul 14 08:15:11 UTC 2017


On 07/13/2017 06:36 PM, John Ferlan wrote:
> 
> 
> On 07/11/2017 11:52 AM, Michal Privoznik wrote:
>> On 06/03/2017 03:27 PM, John Ferlan wrote:
>>> Make use of an error: label to handle the failure and need to call
>>> virSecretObjEndAPI for the object to set it to NULL for return.
>>>
>>> Also rather than an if/else processing - have the initial "if" which
>>> is just replacing the @newdef into obj->def goto cleanup, thus allowing
>>> the remaining code to be extracted from the else and appear to more inline.
>>>
>>> Signed-off-by: John Ferlan <jferlan at redhat.com>
>>> ---
>>>  src/conf/virsecretobj.c | 74 ++++++++++++++++++++++++-------------------------
>>>  1 file changed, 37 insertions(+), 37 deletions(-)
>>>
>>> diff --git a/src/conf/virsecretobj.c b/src/conf/virsecretobj.c
>>> index e3bcbe5..1bafd0b 100644
>>> --- a/src/conf/virsecretobj.c
>>> +++ b/src/conf/virsecretobj.c
>>> @@ -333,7 +333,6 @@ virSecretObjListAdd(virSecretObjListPtr secrets,
>>>  {
>>>      virSecretObjPtr obj;
>>>      virSecretDefPtr objdef;
>>> -    virSecretObjPtr ret = NULL;
>>>      char uuidstr[VIR_UUID_STRING_BUFLEN];
>>>      char *configFile = NULL, *base64File = NULL;
>>>  
>>> @@ -354,13 +353,13 @@ virSecretObjListAdd(virSecretObjListPtr secrets,
>>>                             _("a secret with UUID %s is already defined for "
>>>                               "use with %s"),
>>>                             uuidstr, objdef->usage_id);
>>> -            goto cleanup;
>>> +            goto error;
>>>          }
>>>  
>>>          if (objdef->isprivate && !newdef->isprivate) {
>>>              virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>>>                             _("cannot change private flag on existing secret"));
>>> -            goto cleanup;
>>> +            goto error;
>>>          }
>>>  
>>>          if (oldDef)
>>> @@ -368,50 +367,51 @@ virSecretObjListAdd(virSecretObjListPtr secrets,
>>>          else
>>>              virSecretDefFree(objdef);
>>>          obj->def = newdef;
>>> -    } else {
>>> -        /* No existing secret with same UUID,
>>> -         * try look for matching usage instead */
>>> -        if ((obj = virSecretObjListFindByUsageLocked(secrets,
>>> -                                                     newdef->usage_type,
>>> -                                                     newdef->usage_id))) {
>>> -            virObjectLock(obj);
>>> -            objdef = obj->def;
>>> -            virUUIDFormat(objdef->uuid, uuidstr);
>>> -            virReportError(VIR_ERR_INTERNAL_ERROR,
>>> -                           _("a secret with UUID %s already defined for "
>>> -                             "use with %s"),
>>> -                           uuidstr, newdef->usage_id);
>>> -            goto cleanup;
>>> -        }
>>> +        goto cleanup;
>>> +    }
>>>  
>>> -        /* Generate the possible configFile and base64File strings
>>> -         * using the configDir, uuidstr, and appropriate suffix
>>> -         */
>>> -        if (!(configFile = virFileBuildPath(configDir, uuidstr, ".xml")) ||
>>> -            !(base64File = virFileBuildPath(configDir, uuidstr, ".base64")))
>>> -            goto cleanup;
>>> +    /* No existing secret with same UUID,
>>> +     * try to look for matching usage instead */
>>> +    if ((obj = virSecretObjListFindByUsageLocked(secrets,
>>> +                                                 newdef->usage_type,
>>> +                                                 newdef->usage_id))) {
>>> +        virObjectLock(obj);
>>> +        objdef = obj->def;
>>> +        virUUIDFormat(objdef->uuid, uuidstr);
>>> +        virReportError(VIR_ERR_INTERNAL_ERROR,
>>> +                       _("a secret with UUID %s already defined for "
>>> +                         "use with %s"),
>>> +                       uuidstr, newdef->usage_id);
>>> +        goto error;
>>> +    }
>>>  
>>> -        if (!(obj = virSecretObjNew()))
>>> -            goto cleanup;
>>> +    /* Generate the possible configFile and base64File strings
>>> +     * using the configDir, uuidstr, and appropriate suffix
>>> +     */
>>> +    if (!(configFile = virFileBuildPath(configDir, uuidstr, ".xml")) ||
>>> +        !(base64File = virFileBuildPath(configDir, uuidstr, ".base64")))
>>> +        goto cleanup;
>>>  
>>> -        if (virHashAddEntry(secrets->objs, uuidstr, obj) < 0)
>>> -            goto cleanup;
>>> +    if (!(obj = virSecretObjNew()))
>>> +        goto cleanup;
>>>  
>>> -        obj->def = newdef;
>>> -        VIR_STEAL_PTR(obj->configFile, configFile);
>>> -        VIR_STEAL_PTR(obj->base64File, base64File);
>>> -        virObjectRef(obj);
>>> -    }
>>> +    if (virHashAddEntry(secrets->objs, uuidstr, obj) < 0)
>>> +        goto error;
>>
>> Frankly, I find this very confusing. While reading the commit message, I
>> understand why you sometimes jump to cleanup and other times to error
>> label. But if I were to just look at the code alone, it's completely
>> random to me. I think I'd much rather see the pattern that's here.
>> However, if you really dislike if-else branching (dislike also as in
>> prepare for upcoming patches), I suggest changing just that.
>>
>> Michal
>>
> 
> I'll return the if - else - logic...  and update the commit message.
> 
> Would you like to see a version of that?

Yes please.

> It does affect the next couple
> of patches. For patch 5 it's just a simple indention adjustment.  Since
> there's questions in 6 I'll address those there.

That's okay, you can just send another version (and state that some
patches were ACKed already).

Michal




More information about the libvir-list mailing list