I think this code is more complex than needed. If cmd_type is always setup 
properly I don't think any additional state (amcmd) is needed.

This is what we have at the top of avnd_evt_clc_resp_evh() after your patch:

        if (clc_evt->exec_ctxt) {
                comp = m_AVND_COMPDB_REC_GET(cb->compdb, clc_evt->comp_name);
                if (comp->clc_info.am_cmd_exec_ctxt == clc_evt->exec_ctxt)
                        amcmd = 1;
        } else
                /* => cmd did not launch successfully (comp is available) */
                comp = m_AVND_COMPDB_REC_GET(cb->compdb, clc_evt->comp_name);

clc_evt->exec_ctxt is always 0 (never written to after calloc, used to hold the 
old ptr) thus this can be transformed into:

        comp = m_AVND_COMPDB_REC_GET(cb->compdb, clc_evt->comp_name);

and amcmd is not needed. cmd_type is used instead. We cannot keep code around 
that does not make sense...

Thanks,
Hans
________________________________________
From: praveen malviya [[email protected]]
Sent: Wednesday, 07 August 2013 12:23 PM
To: Hans Feldt
Cc: [email protected]; Hans Nordebäck; Mathivanan Naickan Palanivelu; 
[email protected]
Subject: Re: [devel] [PATCH 1 of 1] amfnd: correlate clc scripts response event 
based on comp name [#514]

Not sure about changes in avnd_evt_clc_resp_evh() since amcmd flow may
get impacted other changes will be incorporated.

Please suggest.
Thanks,
Praveen


On 07-Aug-13 2:51 PM, Hans Feldt wrote:
> You could apply the attached patch on top of this one (merged to one before 
> push).
> Thanks,
> Hans
> ________________________________________
> From: Hans Feldt [[email protected]]
> Sent: Wednesday, 07 August 2013 9:58 AM
> To: praveen malviya
> Cc: Hans Feldt; [email protected]; Hans Nordebäck; Mathivanan Naickan 
> Palanivelu; [email protected]
> Subject: Re: [devel] [PATCH 1 of 1] amfnd: correlate clc scripts response 
> event based on comp name [#514]
>
> See inline, I think more polishing is needed.
>
> this comment in avnd_evt.h:
>      /* valid only when cmd launch (fork, exec etc) fails */
>
> should be removed
>
> In avnd_evt_clc_resp_evh comp lookup can silently return. I think you
> should add a log entry there:
>
> LOG_WA("%s: could not find comp '%s'", clc_evt->comp_name.value);
>
> Thanks,
> Hans
>
> On 6 August 2013 15:21,  <[email protected]> wrote:
>>   osaf/services/saf/avsv/avnd/avnd_clc.c |  63 
>> ++++++++++++++++-----------------
>>   1 files changed, 31 insertions(+), 32 deletions(-)
>>
>>
>> At present when clc response event comes AMFND searches whole component 
>> database and matches the context.
>> This context does not include component name. Thus AMFND can associate clc 
>> response with wrong component.
>> The patch ensures that AMFND gets component name in the clc response event 
>> and thus solves the problem
>> by associating clc response event with the component.
> The changelog can be improved. Should state that AMF can e.g. think
> that cleanup has failed as described in the ticket. And why (because
> correlation done with a pointer to dynamic memory)
>
>> diff --git a/osaf/services/saf/avsv/avnd/avnd_clc.c 
>> b/osaf/services/saf/avsv/avnd/avnd_clc.c
>> --- a/osaf/services/saf/avsv/avnd/avnd_clc.c
>> +++ b/osaf/services/saf/avsv/avnd/avnd_clc.c
>> @@ -316,17 +316,9 @@ uint32_t avnd_evt_clc_resp_evh(AVND_CB *
>>
>>          /* get the comp */
>>          if (clc_evt->exec_ctxt) {
>> -               /* => cmd successfully launched (scan the entire 
>> comp-database) */
>> -               for (comp = (AVND_COMP 
>> *)ncs_patricia_tree_getnext(&cb->compdb,
>> -                                                                  (uint8_t 
>> *)0); comp;
>> -                    comp = (AVND_COMP 
>> *)ncs_patricia_tree_getnext(&cb->compdb, (uint8_t *)&comp->name)) {
>> -                       if (comp->clc_info.cmd_exec_ctxt == 
>> clc_evt->exec_ctxt)
>> -                               break;
>> -                       if (comp->clc_info.am_cmd_exec_ctxt == 
>> clc_evt->exec_ctxt) {
>> -                               amcmd = 1;
>> -                               break;
>> -                       }
>> -               }
>> +               comp = m_AVND_COMPDB_REC_GET(cb->compdb, clc_evt->comp_name);
>> +               if (comp->clc_info.am_cmd_exec_ctxt == clc_evt->exec_ctxt)
>> +                       amcmd = 1;
>>          } else
>>                  /* => cmd did not launch successfully (comp is available) */
> The above comment is wrong and should be removed. comp name is now
> always available.
> But I think the remaining if/else can be removed too.
>
> clc_evt->exec_ctxt is never set to a value thus
>
>          if (comp->clc_info.am_cmd_exec_ctxt == clc_evt->exec_ctxt)
>              amcmd = 1;
>
> is always false which means it can be removed together with the amcmd 
> variable.
>
>>                  comp = m_AVND_COMPDB_REC_GET(cb->compdb, 
>> clc_evt->comp_name);
>> @@ -637,7 +629,7 @@ done:
>>   
>> ******************************************************************************/
>>   uint32_t avnd_comp_clc_resp(NCS_OS_PROC_EXECUTE_TIMED_CB_INFO *info)
>>   {
>> -       AVND_CLC_EVT clc_evt;
>> +       AVND_CLC_EVT *clc_evt = (AVND_CLC_EVT *)info->i_usr_hdl;
>>          AVND_EVT *evt = 0;
>>          uint32_t rc = NCSCC_RC_SUCCESS;
>>          TRACE_ENTER();
>> @@ -645,14 +637,11 @@ uint32_t avnd_comp_clc_resp(NCS_OS_PROC_
>>          if (!info)
>>                  goto done;
> the above check does not make sense since you have already dereferenced info
> so move initialization of clc_evt past the check
> The check should probably be an assert instead
>
> assert(info != NULL);
>
>> -       memset(&clc_evt, 0, sizeof(AVND_CLC_EVT));
>> -
>>          /* fill the clc-evt param */
>> -       clc_evt.exec_ctxt = info->i_exec_hdl;
>> -       clc_evt.exec_stat = info->exec_stat;
>> +       clc_evt->exec_stat = info->exec_stat;
>>
>>          /* create the event */
>> -       evt = avnd_evt_create(avnd_cb, AVND_EVT_CLC_RESP, 0, 0, 0, (void 
>> *)&clc_evt, 0);
>> +       evt = avnd_evt_create(avnd_cb, AVND_EVT_CLC_RESP, 0, 0, 0, (void 
>> *)clc_evt, 0);
> void * cast should not be needed, can be removed
>
>>          if (!evt) {
>>                  rc = NCSCC_RC_FAILURE;
>>                  goto done;
>> @@ -662,6 +651,7 @@ uint32_t avnd_comp_clc_resp(NCS_OS_PROC_
>>          rc = avnd_evt_send(avnd_cb, evt);
>>
>>    done:
>> +       free(clc_evt);
>>          /* free the event */
>>          if (NCSCC_RC_SUCCESS != rc && evt)
>>                  avnd_evt_destroy(evt);
>> @@ -2508,7 +2498,7 @@ uint32_t avnd_comp_clc_cmd_execute(AVND_
>>          char env_var_nodeid[] = "NCS_ENV_NODE_ID";
>>          char env_var_comp_err[] = "NCS_ENV_COMPONENT_ERROR_SRC";
>>          char *env_attr_val = 0;
>> -       AVND_CLC_EVT clc_evt;
>> +       AVND_CLC_EVT *clc_evt;
>>          AVND_EVT *evt = 0;
>>          AVND_COMP_CLC_INFO *clc_info = &comp->clc_info;
>>          char scr[SAAMF_CLC_LEN];
>> @@ -2528,15 +2518,16 @@ uint32_t avnd_comp_clc_cmd_execute(AVND_
>>                  goto err;
>>          }
>>
>> +       clc_evt = (AVND_CLC_EVT *)calloc(1, sizeof(AVND_CLC_EVT));
> Since the clc_evt memory is not freed in this function, add comment
> where it is freed.
>
>> +       memcpy(&clc_evt->comp_name, &comp->name, sizeof(SaNameT));
> intialize clc_evt->cmd_type here with cmd_type once
> add new line here.
>
>>          /* For external component, there is no cleanup command. So, we will 
>> send a
>>             SUCCESS message to the mail box for external components. There 
>> wouldn't
>>             be any other command for external component comming. */
>>          if (true == comp->su->su_is_external) {
>>                  if (AVND_COMP_CLC_CMD_TYPE_CLEANUP == cmd_type) {
>> -                       memset(&clc_evt, 0, sizeof(AVND_CLC_EVT));
>> -                       memcpy(&clc_evt.comp_name, &comp->name, 
>> sizeof(SaNameT));
>> -                       clc_evt.cmd_type = cmd_type;
>> -                       clc_evt.exec_stat.value = NCS_OS_PROC_EXIT_NORMAL;
>> +                       memcpy(&clc_evt->comp_name, &comp->name, 
>> sizeof(SaNameT));
>> +                       clc_evt->cmd_type = cmd_type;
> remove 2 above lines, redundant
>
>> +                       clc_evt->exec_stat.value = NCS_OS_PROC_EXIT_NORMAL;
>>
>>                          clc_info->exec_cmd = cmd_type;
>>                          m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, 
>> AVND_CKPT_COMP_EXEC_CMD);
>> @@ -2545,17 +2536,21 @@ uint32_t avnd_comp_clc_cmd_execute(AVND_
>>                          m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, 
>> AVND_CKPT_COMP_CMD_EXEC_CTXT);
>>
>>                          /* create the event */
>> -                       evt = avnd_evt_create(cb, AVND_EVT_CLC_RESP, 0, 0, 
>> 0, (void *)&clc_evt, 0);
>> +                       evt = avnd_evt_create(cb, AVND_EVT_CLC_RESP, 0, 0, 
>> 0, (void *)clc_evt, 0);
>>                          if (!evt) {
>> +                               free(clc_evt);
>>                                  rc = NCSCC_RC_FAILURE;
>>                                  goto err;
>>                          }
>>
>>                          /* send the event */
>>                          rc = avnd_evt_send(cb, evt);
>> -                       if (NCSCC_RC_SUCCESS != rc)
>> +                       if (NCSCC_RC_SUCCESS != rc) {
>> +                               free(clc_evt);
>>                                  goto err;
>> -
>> +                       }
>> +
>> +                       free(clc_evt);
>>                          return rc;
>>                  } else {
>>                          LOG_ER("Command other than cleanup recvd for ext 
>> comp: Comp and cmd_type are '%s': %u",\
>> @@ -2682,6 +2677,7 @@ uint32_t avnd_comp_clc_cmd_execute(AVND_
>>          cmd_info.i_timeout_in_ms = (uint32_t)((clc_info->cmds[cmd_type - 
>> 1].timeout) / 1000000);
>>          cmd_info.i_cb = avnd_comp_clc_resp;
>>          cmd_info.i_set_env_args = &arg;
>> +       cmd_info.i_usr_hdl = (NCS_EXEC_USR_HDL) clc_evt;
>>
>>          TRACE_1("CLC CLI script:'%s'",cmd_info.i_script);
>>          for(count=1;count<argc;count++)
>> @@ -2707,29 +2703,32 @@ uint32_t avnd_comp_clc_cmd_execute(AVND_
>>          if (NCSCC_RC_SUCCESS != rc) {
>>                  TRACE_2("The CLC CLI command execution failed");
>>                  /* generate a cmd failure event; it'll be executed 
>> asynchronously */
>> -               memset(&clc_evt, 0, sizeof(AVND_CLC_EVT));
>>
>>                  /* fill the clc-evt param */
>> -               memcpy(&clc_evt.comp_name, &comp->name, sizeof(SaNameT));
>> -               clc_evt.cmd_type = cmd_type;
>> +               memcpy(&clc_evt->comp_name, &comp->name, sizeof(SaNameT));
>> +               clc_evt->cmd_type = cmd_type;
> remove 3 above lines, redundant
>
>>                  /* create the event */
>> -               evt = avnd_evt_create(cb, AVND_EVT_CLC_RESP, 0, 0, 0, (void 
>> *)&clc_evt, 0);
>> +               evt = avnd_evt_create(cb, AVND_EVT_CLC_RESP, 0, 0, 0, (void 
>> *)clc_evt, 0);
> void * cast can be removed
>
>>                  if (!evt) {
>> +                       free(clc_evt);
>>                          rc = NCSCC_RC_FAILURE;
>>                          goto err;
>>                  }
>>
>>                  /* send the event */
>>                  rc = avnd_evt_send(cb, evt);
>> -               if (NCSCC_RC_SUCCESS != rc)
>> +               if (NCSCC_RC_SUCCESS != rc) {
>> +                       free(clc_evt);
>>                          goto err;
>> +               }
>> +               free(clc_evt);
>>          } else {
>>                  TRACE_2("The CLC CLI command execution success");
>>                  if (cmd_type == AVND_COMP_CLC_CMD_TYPE_AMSTART || cmd_type 
>> == AVND_COMP_CLC_CMD_TYPE_AMSTOP)
>> -                       clc_info->am_cmd_exec_ctxt = cmd_info.o_exec_hdl;
>> +                       clc_info->am_cmd_exec_ctxt = 
>> (NCS_EXEC_HDL)cmd_info.i_usr_hdl;
>>                  else {
>> -                       clc_info->cmd_exec_ctxt = cmd_info.o_exec_hdl;
>> +                       clc_info->cmd_exec_ctxt = 
>> (NCS_EXEC_HDL)cmd_info.i_usr_hdl;
>>                          m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp, 
>> AVND_CKPT_COMP_CMD_EXEC_CTXT);
>>                  }
>>          }
>>
>> ------------------------------------------------------------------------------
>> Get your SQL database under version control now!
>> Version control is standard for application code, but databases havent
>> caught up. So what steps can you take to put your SQL databases under
>> version control? Why should you start doing it? Read more to find out.
>> http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk
>> _______________________________________________
>> Opensaf-devel mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/opensaf-devel


------------------------------------------------------------------------------
Get 100% visibility into Java/.NET code with AppDynamics Lite!
It's a free troubleshooting tool designed for production.
Get down to code-level detail for bottlenecks, with <2% overhead. 
Download for free and get started troubleshooting in minutes. 
http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to