Hi Minh and Praveen,

I have just sent out the patch (amfa: fix memory leak in protection group).
Please help to review. Thanks so much.

Best regards,
Long Nguyen.

On 8/26/2016 12:47 PM, minh.c...@dektech.com.au wrote:
> Hi Praveen,
>
> Long is preparing the patch adding sentinel element.
>
> Thanks,
> Minh
>
>> Hi Minh,
>>
>> I think this is subject to interpretation. After finalize(), handle
>> becomes invalid. So an application cannot call Free_4() to free any
>> memory. In such a case, freeing any resources associated with this
>> handle in finalize() seems to be ok.
>>    Anyways freeing in finalize() can be postponed for any real use case
>> to come up.In that case please go ahead by adding sentinel element.
>> I think there are not other pending things in #1642 other than this.
>>
>> Thanks,
>> Praveen
>>
>>
>>
>> On 26-Aug-16 7:35 AM, minh chau wrote:
>>> Hi Praveen,
>>>
>>> Just to confirm if I understand correctly the problem you mentioned in
>>> saAmfFinalize(). As the specification says application should call
>>> free()/Free_4() to release the allocated memory, if application does not
>>> release memory then it's most likely application misuses API. Or do you
>>> mean saAmfFinalize() should do the same as saNtfFinalize()? if this is
>>> the case it looks just an enhancement to guard AMFA?
>>>
>>> Thanks
>>> Minh
>>>
>>> On 25/08/16 20:04, praveen malviya wrote:
>>>> Hi Minh,
>>>>
>>>> AMFA currently does not remember the allocated memory. It relies on
>>>> the application always to free the memory. In saAmfFinalize() also, it
>>>> does not free the memory. I think AMFA should remember memory by
>>>> associating it with handle because process which is starting PG
>>>> tracking may not be a component and may not call free()/Free_4() and
>>>> just relies on saAmfFinalize() call to release all the resources.
>>>>
>>>> I think as of now please go ahead with your suggested solution. From
>>>> finalize perspective this is a defect and applicable to all the
>>>> branches. So please raise a ticket for that.
>>>>
>>>> Thanks,
>>>> Praveen
>>>>
>>>>
>>>> On 22-Aug-16 12:08 PM, minh chau wrote:
>>>>> Hi Praveen,
>>>>>
>>>>> The case you just mentioned is still in callback context, so Agent can
>>>>> help application to release the allocated notification. But still
>>>>> another case:
>>>>>
>>>>> +    SaAmfProtectionGroupNotificationBufferT buff;
>>>>> +    buff.notification = NULL;
>>>>> +    rc = saAmfProtectionGroupTrack_4(my_amf_hdl, &track_csi,
>>>>> SA_TRACK_CURRENT, &buff);
>>>>> +    if (rc != SA_AIS_OK) {
>>>>> +        syslog(LOG_ERR, "saAmfProtectionGroupTrack FAILED - %u", rc);
>>>>> +        goto done;
>>>>> +    }
>>>>>
>>>>> In this case Agent has to allocate notification but it's not in
>>>>> Agent's
>>>>> context.
>>>>> Application has to call API Free_4(buff.notification) to free up
>>>>> notification.
>>>>> In order to iterate to free longDn(s) inside Free_4(), Agent has to
>>>>> memorize a list numberOfItems for every single call as above
>>>>> Track_4(),
>>>>> or Agent can add sentinel element to the allocated notification.
>>>>>
>>>>> Thanks,
>>>>> Minh
>>>>>
>>>>> On 22/08/16 15:34, praveen malviya wrote:
>>>>>> Hi,
>>>>>> The callback looks like this:
>>>>>> typedef void
>>>>>> (*SaAmfProtectionGroupTrackCallbackT_4)(
>>>>>>      const SaNameT *csiName,
>>>>>>      SaAmfProtectionGroupNotificationBufferT_4 *notificationBuffer,
>>>>>>      SaUint32T numberOfMembers,
>>>>>>      SaAisErrorT error);
>>>>>>
>>>>>> Inside this callback, application is supposed to call
>>>>>> saAmfProtectionGroupNotificationFree_4(). So agent must be able to
>>>>>> deduce this information as SaAmfProtectionGroupNotificationBufferT_4
>>>>>> contains numberOfItems and also numberOfMembers is available from
>>>>>> callback.
>>>>>> Since B.04.01 APIs are not fully implemented, agent copies from old
>>>>>> type of structure to new type in ava_cpy_protection_group_ntf().
>>>>>>
>>>>>>
>>>>>> Thanks,
>>>>>> Praveen
>>>>>>
>>>>>> On 22-Aug-16 10:51 AM, minh chau wrote:
>>>>>>> Hi Praveen,
>>>>>>>
>>>>>>> The problem with B.04.01 is the API:
>>>>>>> saAmfProtectionGroupNotificationFree_4(SaAmfHandleT hdl,
>>>>>>> SaAmfProtectionGroupNotificationT_4 *notification) does not have
>>>>>>> numberOfItems.
>>>>>>> Agent does not know how many element in *notification, each of
>>>>>>> element
>>>>>>> can hide a longDn inside it.
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Minh
>>>>>>>
>>>>>>>
>>>>>>> On 22/08/16 15:04, praveen malviya wrote:
>>>>>>>> Hi Minh,
>>>>>>>>
>>>>>>>> SaAmfProtectionGroupNotificationBufferT_4() contains numberOfItems
>>>>>>>> to
>>>>>>>> iterate over. In case of B.04.01, it should be simple as agent can
>>>>>>>> call direclty osaf_extended_name_free() during iteration inside
>>>>>>>> saAmfProtectionGroupNotificationFree_4(). So I think, only a for
>>>>>>>> loop
>>>>>>>> which will iterate over numberOfItems is required.
>>>>>>>>
>>>>>>>> Problem was in B.01.01 case, where application will have to iterate
>>>>>>>> and free the memory. For this, Long has already suggested and that
>>>>>>>> needs to be documented.
>>>>>>>>
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Praveen
>>>>>>>>
>>>>>>>>
>>>>>>>> On 20-Aug-16 2:22 PM, minh chau wrote:
>>>>>>>>> Hi Long, Praveen,
>>>>>>>>>
>>>>>>>>> Regarding this TODO
>>>>>>>>> +  if(notification) {
>>>>>>>>> +    // TODO (minhchau): memleak if notification is an array
>>>>>>>>> + osaf_extended_name_free(&notification->member.compName);
>>>>>>>>>       free(notification);
>>>>>>>>> +  }
>>>>>>>>>
>>>>>>>>> Client currently uses
>>>>>>>>> saAmfProtectionGroupNotificationFree_4(handle,
>>>>>>>>> buff->notification) to free the notification in buffer.
>>>>>>>>> If @buff->notification is a list of shortDn only, that should
>>>>>>>>> work as
>>>>>>>>> before, as agent will call this inside
>>>>>>>>> saAmfProtectionGroupNotificationFree_4
>>>>>>>>>
>>>>>>>>>      /* free memory */
>>>>>>>>>      if(notification)
>>>>>>>>>          free(notification);
>>>>>>>>>
>>>>>>>>> It will cause memory leak if @buff->notification contains a list
>>>>>>>>> of
>>>>>>>>> longDN notifications.
>>>>>>>>> The leak is longDn of compName in each notification after the the
>>>>>>>>> first
>>>>>>>>> one in the array @buff->notification.
>>>>>>>>>
>>>>>>>>> Agent can add a sentinel element when agent allocates
>>>>>>>>> @buff->notification, set this last element as NULL
>>>>>>>>> In Free() API, agent could iterate and free longDn in each
>>>>>>>>> element of
>>>>>>>>> array @buff->notification until agent reaches NULL element.
>>>>>>>>>
>>>>>>>>> Do you think it could work?
>>>>>>>>> Thanks,
>>>>>>>>> Minh
>>>>>>>>>
>>>>>>>>> On 19/08/16 21:13, Long Nguyen wrote:
>>>>>>>>>> Hi Praveen,
>>>>>>>>>>
>>>>>>>>>> Please see my answers marked with [Long].
>>>>>>>>>>
>>>>>>>>>> Best regards,
>>>>>>>>>> Long Nguyen.
>>>>>>>>>>
>>>>>>>>>> On 8/19/2016 6:01 PM, praveen malviya wrote:
>>>>>>>>>>> Hi Long,
>>>>>>>>>>>
>>>>>>>>>>> I see one problem if B.01.01 application frees the memory in pg
>>>>>>>>>>> tracking callback.
>>>>>>>>>>> Please see inline.
>>>>>>>>>>>
>>>>>>>>>>> Thanks,
>>>>>>>>>>> Praveen
>>>>>>>>>>> On 19-Aug-16 12:00 PM, Long HB Nguyen wrote:
>>>>>>>>>>>>   osaf/libs/agents/saf/amfa/amf_agent.cc | 1 +
>>>>>>>>>>>>   osaf/libs/agents/saf/amfa/ava_hdl.cc   |  2 --
>>>>>>>>>>>>   2 files changed, 1 insertions(+), 2 deletions(-)
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> diff --git a/osaf/libs/agents/saf/amfa/amf_agent.cc
>>>>>>>>>>>> b/osaf/libs/agents/saf/amfa/amf_agent.cc
>>>>>>>>>>>> --- a/osaf/libs/agents/saf/amfa/amf_agent.cc
>>>>>>>>>>>> +++ b/osaf/libs/agents/saf/amfa/amf_agent.cc
>>>>>>>>>>>> @@ -2450,6 +2450,7 @@ SaAisErrorT AmfAgent::ProtectionGroupTra
>>>>>>>>>>>> ava_cpy_protection_group_ntf(buf->notification,
>>>>>>>>>>>> rsp_buf->notification,
>>>>>>>>>>>> buf->numberOfItems,
>>>>>>>>>>>> SA_AMF_HARS_READY_FOR_ASSIGNMENT);
>>>>>>>>>>>>             rc = SA_AIS_ERR_NO_SPACE;
>>>>>>>>>>>> +          buf->numberOfItems = rsp_buf->numberOfItems;
>>>>>>>>>>>>           }
>>>>>>>>>>>>         } else {    /* if(create_memory == false) */
>>>>>>>>>>>>
>>>>>>>>>>>> diff --git a/osaf/libs/agents/saf/amfa/ava_hdl.cc
>>>>>>>>>>>> b/osaf/libs/agents/saf/amfa/ava_hdl.cc
>>>>>>>>>>>> --- a/osaf/libs/agents/saf/amfa/ava_hdl.cc
>>>>>>>>>>>> +++ b/osaf/libs/agents/saf/amfa/ava_hdl.cc
>>>>>>>>>>>> @@ -697,7 +697,6 @@ uint32_t ava_hdl_cbk_rec_prc(AVSV_AMF_CB
>>>>>>>>>>>> ((SaAmfCallbacksT_4*)reg_cbk)->saAmfProtectionGroupTrackCallback(&pg_track->csi_name,
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> &buf,
>>>>>>>>>>>> pg_track->mem_num, pg_track->err);
>>>>>>>>>>>> -                        free(buf.notification);
>>>>>>>>>>>>                       } else {
>>>>>>>>>>>>                           pg_track->err = SA_AIS_ERR_NO_MEMORY;
>>>>>>>>>>>>                           LOG_CR("Notification is NULL: Invoking
>>>>>>>>>>>> PGTrack Callback with error SA_AIS_ERR_NO_MEMORY");
>>>>>>>>>>>> @@ -740,7 +739,6 @@ uint32_t ava_hdl_cbk_rec_prc(AVSV_AMF_CB
>>>>>>>>>>>>                           ((SaAmfCallbacksT
>>>>>>>>>>>> *)reg_cbk)->saAmfProtectionGroupTrackCallback(&pg_track->csi_name,
>>>>>>>>>>>>
>>>>>>>>>>>> &buf,
>>>>>>>>>>>> pg_track->mem_num, pg_track->err);
>>>>>>>>>>>> -                        free(buf.notification);
>>>>>>>>>>> For B.04.01 API, saAmfProtectionGroupNotificationFree_4() is
>>>>>>>>>>> taking
>>>>>>>>>>> care of freeing any extended name. For
>>>>>>>>>>> saAmfProtectionGroupNotificationFree(), it is the application's
>>>>>>>>>>> responsibility to free the memory. But how it will free any
>>>>>>>>>>> extended
>>>>>>>>>>> name.
>>>>>>>>>>> I think there is no API equivalent to osaf_extended_name_free()
>>>>>>>>>>> for
>>>>>>>>>>> application. Is there any way?
>>>>>>>>>>> [Long] I think we can do somethings like in applications:
>>>>>>>>>>> if
>>>>>>>>>>> (strlen(saAisNameBorrow(buff.notification[i].member.comp_name))
>>>>>>>>>>> SA_MAX_UNEXTENDED_NAME_LENGTH)
>>>>>>>>>>> free(saAisNameBorrow(buff.notification[i].member.comp_name));
>>>>>>>>>>>
>>>>>>>>>>> Otherwise we can document it that:
>>>>>>>>>>> -if compName is not long dn in the notification buffer, then
>>>>>>>>>>> application has to free the memory.This will provide backward
>>>>>>>>>>> compatibility and spec compliance.
>>>>>>>>>>>
>>>>>>>>>>>   -if compName is longdn in notification then application should
>>>>>>>>>>> not
>>>>>>>>>>> free the memory. Agent will free the memory after callback is
>>>>>>>>>>> completed. So any B.01.01 application adapting to long dn will
>>>>>>>>>>> take
>>>>>>>>>>> care of this when modifying the application. In that case we
>>>>>>>>>>> need to
>>>>>>>>>>> do something like this :
>>>>>>>>>>> for i in notificationBuffer->notification[i]
>>>>>>>>>>>    if
>>>>>>>>>>> (osaf_is_an_extended_name(notificationBuffer->notification[i].member.compName)){
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>      longdn_found = true;
>>>>>>>>>>>      osaf_extended_name_free();
>>>>>>>>>>>      }
>>>>>>>>>>> }
>>>>>>>>>>> if(longdn_found)
>>>>>>>>>>>      free(buf.notification)
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Also there is a Todo in amf_agent.cc " // TODO (minhchau):
>>>>>>>>>>> memleak if
>>>>>>>>>>> notification is an array".
>>>>>>>>>>> [Long] Thanks, I will check it.
>>>>>>>>>>>
>>>>>>>>>>> Thanks,
>>>>>>>>>>> Praveen
>>>>>>>>>>>
>>>>>>>>>>>>                       } else {
>>>>>>>>>>>>                           pg_track->err = SA_AIS_ERR_NO_MEMORY;
>>>>>>>>>>>>                           LOG_CR("Notification is NULL: Invoking
>>>>>>>>>>>> PGTrack Callback with error SA_AIS_ERR_NO_MEMORY");
>>>>>>>>>>>>
>>>>>>>>>>
>
>


------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to