Please see inline.

Thanks,
Praveen
On 28-Jun-13 2:39 PM, Hans Feldt wrote:
> Ok so conceptually I think the COMP FSM should take care of sending 
> COMPONENT_FAILOVER request to AMFD and the SU FSM should take care of sending 
> SU_FAILOVER request to AMFD. Is that the way it is now?
We can make such empirical rules for our understanding. But AMF is too 
complex to theorize it.
> The SU pres state change from TERMINATING to UNINSTANTIATED should be the 
> trigger to send the SU_FAILOVER request. That means you should put the logic 
> in function avnd_su_pres_st_chng_prc() and not in avnd_su_pres_fsm_run(). 
> There is no similar logic in avnd_su_pres_fsm_run() and should be kept clean 
> and do what it says. all_comps_terminated_in_su() is then not needed.
if you see AMFND code SU FSM transitions works differently for NPI SU 
and PI SU. In case of NPI, SI has been taken as reference to trigger 
FSMs because only one SI can be assigned to whole NPI SU (spec governs 
it) which is good as well as creates problems also, while in case of  PI 
SU comp is the reference. Since comp and SU both have presence states, 
their FSM works in good sync in PI case. But CSI(or SI) does not have 
presence state which causes pres state of SU sometimes hanging in other 
than UNINSTANTIATED state (This is the reason I cannot get away with 
all_comps_terminated_in_su() ). One reason I think initial developers 
did not realize that component failover has no meaning in NPI case 
becasue of only one SI assign to it so it is always su failover for NPI 
SU (saAmfSUFailover is always true for NPI SU). See open tickets in 
community for NPI configurations because of component failover in NPI. 
All this you will also realize while implementing #474. To sum up, these 
are the reasons I am not handling sufailover in 
avnd_su_pres_st_chng_prc(). SU failover is much simpler then component 
failover, cleanup components->delete susi at amfnd->inform amfd->then 
usual flow.

> Can you please provide at new 4/4 patch with the above changed?
>
> Thanks,
> Hans
>
> P.S. As a side note, I have a hard time to map the C code to UML state 
> machines. The "hdler" functions seems represent actions and state 
> transitions. After a state transition, avnd_su_pres_st_chng_prc() is 
> executed. It checks the from state and the new state and takes actions. 
> Meaning these are not entry/exit actions (which would not look at the from/to 
> state), rather a clumsy way of executing common actions at state transitions. 
> Would be more elegant if the "hdler" functions called a common 
> stateY_to_stateY() handler instead. Therefore the complexity of 
> avnd_su_pres_st_chng_prc(), it handles all states in one C function. This 
> should be refactored at some point!
>
> Or maybe a complete state machine (re)design starting from diagrams...
>
I agree. To add more the variety of spec concepts like proxied, proxy, 
external, PI and NPI further complicates thing at amfnd. But "future 
work", good words for this.
>> -----Original Message-----
>> From:[email protected]  [mailto:[email protected]]
>> Sent: den 28 juni 2013 08:22
>> To: Hans Feldt;[email protected];[email protected]
>> Cc:[email protected]
>> Subject: [PATCH 4 of 4] amfnd: handle sufailover in SU FSM and Comp FSM
>> [#98]
>>
>>   osaf/services/saf/avsv/avnd/avnd_clc.c  |   82 +++++++++++---------
>>   osaf/services/saf/avsv/avnd/avnd_comp.c |    2 +-
>>   osaf/services/saf/avsv/avnd/avnd_su.c   |    1 +
>>   osaf/services/saf/avsv/avnd/avnd_susm.c |  127
>> ++++++++++++++++++++++++-------
>>   4 files changed, 146 insertions(+), 66 deletions(-)
>>
>>
>> Refloating the patch after incorporating comments.
>>
>> 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
>> @@ -1065,8 +1065,8 @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_
>>                      if (m_AVND_COMP_IS_FAILED(comp) && !comp-
>>> csi_list.n_nodes &&
>>                          !m_AVND_SU_IS_ADMN_TERM(comp->su) &&
>>                          (cb->oper_state ==
>> SA_AMF_OPERATIONAL_ENABLED)) {
>> -                            /* No need to restart component during
>> shutdown */
>> -                            if (!m_AVND_IS_SHUTTING_DOWN(cb))
>> +                            /* No need to restart component during
>> shutdown and during sufailover*/
>> +                            if (!m_AVND_IS_SHUTTING_DOWN(cb) &&
>> +!avnd_sufailover_in_progress(comp->su))
>>                                      rc = avnd_comp_clc_fsm_trigger(cb,
>> comp, AVND_COMP_CLC_PRES_FSM_EV_INST);
>>                      } else if (m_AVND_COMP_IS_FAILED(comp) &&
>> !comp->csi_list.n_nodes) {
>>                              m_AVND_COMP_FAILED_RESET(comp);
>>      /*if we moved from restart -> term
>> @@ -1099,33 +1099,38 @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_
>>                              goto done;
>>                      m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb,
>> comp, AVND_CKPT_COMP_OPER_STATE);
>>
>> -                    if (!m_AVND_COMP_IS_FAILED(comp)) {
>> -                            /* csi-set / csi-rem succeeded.. generate csi-
>> done indication */
>> -                            csi =
>> m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(m_NCS_DBLIST_FIND_FI
>> RST(&comp->csi_list));
>> -                            osafassert(csi);
>> -                            if
>> (m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_ASSIGNING(csi))
>> -                                    rc = avnd_comp_csi_assign_done(cb,
>> comp,
>> -
>> m_AVND_COMP_IS_ALL_CSI(comp) ? 0 : csi);
>> -                            else if
>> (m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_REMOVING(csi))
>> -                                    rc =
>> avnd_comp_csi_remove_done(cb, comp,
>> -
>> m_AVND_COMP_IS_ALL_CSI(comp) ? 0 : csi);
>> -                            if (NCSCC_RC_SUCCESS != rc)
>> -                                    goto done;
>> -                    } else {
>> -                            /* failed su is ready to take on si assignment..
>> inform avd */
>> -                            if (!comp->csi_list.n_nodes) {
>> -                                    m_AVND_SU_IS_ENABLED(comp-
>>> su, is_en);
>> -                                    if (true == is_en) {
>> -
>>      m_AVND_SU_OPER_STATE_SET(comp-
>>> su,SA_AMF_OPERATIONAL_ENABLED);
>> -
>>      m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp->su,
>> AVND_CKPT_SU_OPER_STATE);
>> -                                            rc = avnd_di_oper_send(cb,
>> comp->su, 0);
>> -                                            if (NCSCC_RC_SUCCESS != rc)
>> -                                                    goto done;
>> +                    if (avnd_sufailover_in_progress(comp->su)) {
>> +                            /*Do not reset any flag, this will be done as a
>> part of repair.*/
>> +                    }
>> +                    else {
>> +                            if (!m_AVND_COMP_IS_FAILED(comp)) {
>> +                                    /* csi-set / csi-rem succeeded..
>> generate csi-done indication */
>> +                                    csi =
>> m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(m_NCS_DBLIST_FIND_FI
>> RST(&comp->csi_list));
>> +                                    osafassert(csi);
>> +                                    if
>> (m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_ASSIGNING(csi))
>> +                                            rc =
>> avnd_comp_csi_assign_done(cb, comp,
>> +
>>      m_AVND_COMP_IS_ALL_CSI(comp) ? 0 : csi);
>> +                                    else if
>> (m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_REMOVING(csi))
>> +                                            rc =
>> avnd_comp_csi_remove_done(cb, comp,
>> +
>>      m_AVND_COMP_IS_ALL_CSI(comp) ? 0 : csi);
>> +                                    if (NCSCC_RC_SUCCESS != rc)
>> +                                            goto done;
>> +                            } else {
>> +                                    /* failed su is ready to take on si
>> assignment.. inform avd */
>> +                                    if (!comp->csi_list.n_nodes) {
>> +
>>      m_AVND_SU_IS_ENABLED(comp->su, is_en);
>> +                                            if (true == is_en) {
>> +
>>      m_AVND_SU_OPER_STATE_SET(comp-
>>> su,SA_AMF_OPERATIONAL_ENABLED);
>> +
>>      m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp->su,
>> AVND_CKPT_SU_OPER_STATE);
>> +                                                    rc =
>> avnd_di_oper_send(cb, comp->su, 0);
>> +                                                    if
>> (NCSCC_RC_SUCCESS != rc)
>> +                                                            goto done;
>> +                                            }
>> +
>>      m_AVND_COMP_FAILED_RESET(comp);
>> +
>>      m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp,
>> +AVND_CKPT_COMP_FLAG_CHANGE);
>>                                      }
>> -
>>      m_AVND_COMP_FAILED_RESET(comp);
>> -
>>      m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp,
>> AVND_CKPT_COMP_FLAG_CHANGE);
>> +
>>                              }
>> -
>>                      }
>>              }
>>
>> @@ -1190,12 +1195,17 @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_
>>
>>              /* terminating -> uninstantiated */
>>              if ((SA_AMF_PRESENCE_TERMINATING == prv_st) &&
>> (SA_AMF_PRESENCE_UNINSTANTIATED == final_st)) {
>> -                    /* npi comps are enabled in uninstantiated state */
>> -                    m_AVND_COMP_OPER_STATE_SET(comp,
>> SA_AMF_OPERATIONAL_ENABLED);
>> -                    m_AVND_COMP_OPER_STATE_AVD_SYNC(cb,
>> comp, rc);
>> -                    if (NCSCC_RC_SUCCESS != rc)
>> -                            goto done;
>> -                    m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb,
>> comp, AVND_CKPT_COMP_OPER_STATE);
>> +                    if (avnd_sufailover_in_progress(comp->su)) {
>> +                            /*Do not reset any flag, this will be done as a
>> part of repair.*/
>> +                    }
>> +                    else {
>> +                            /* npi comps are enabled in uninstantiated
>> state */
>> +                            m_AVND_COMP_OPER_STATE_SET(comp,
>> SA_AMF_OPERATIONAL_ENABLED);
>> +
>>      m_AVND_COMP_OPER_STATE_AVD_SYNC(cb, comp, rc);
>> +                            if (NCSCC_RC_SUCCESS != rc)
>> +                                    goto done;
>> +
>>      m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, comp,
>> AVND_CKPT_COMP_OPER_STATE);
>> +                    }
>>              }
>>
>>              /* Instantiating -> Instantiationfailed */ @@ -2763,7 +2773,7
>> @@ uint32_t avnd_comp_clc_cmd_execute(AVND_  uint32_t
>> avnd_instfail_su_failover(AVND_CB *cb, AVND_SU *su, AVND_COMP
>> *failed_comp)  {
>>      uint32_t rc = NCSCC_RC_SUCCESS;
>> -    TRACE_ENTER2("Executing SU Failover: Instantiation failed SU: '%s' :
>> Failed component: '%s'",
>> +    TRACE_ENTER2("Executing Component Failover: Instantiation failed
>> SU:
>> +'%s' : Failed component: '%s'",
>>                                                              su-
>>> name.value, failed_comp->name.value);
>>      /* mark the comp failed */
>> @@ -2812,12 +2822,12 @@ uint32_t avnd_instfail_su_failover(AVND_
>>              m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
>> AVND_CKPT_SU_OPER_STATE);
>>
>>              /* inform AvD */
>> -            rc = avnd_di_oper_send(cb, su,
>> AVSV_ERR_RCVR_SU_FAILOVER);
>> +            rc = avnd_di_oper_send(cb, su,
>> SA_AMF_COMPONENT_FAILOVER);
>>      }
>>
>>    done:
>>      if (rc == NCSCC_RC_SUCCESS)
>> -            LOG_NO("SU Failover trigerred for '%s': Failed component:
>> '%s'",
>> +            LOG_NO("Component Failover trigerred for '%s': Failed
>> component:
>> +'%s'",
>>                      su->name.value, failed_comp->name.value);
>>      TRACE_LEAVE2("%u", rc);
>>      return rc;
>> diff --git a/osaf/services/saf/avsv/avnd/avnd_comp.c
>> b/osaf/services/saf/avsv/avnd/avnd_comp.c
>> --- a/osaf/services/saf/avsv/avnd/avnd_comp.c
>> +++ b/osaf/services/saf/avsv/avnd/avnd_comp.c
>> @@ -872,7 +872,7 @@ uint32_t avnd_comp_unreg_prc(AVND_CB *cb
>>                      m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb,
>> comp->su, AVND_CKPT_SU_OPER_STATE);
>>
>>                      /* inform AvD */
>> -                    rc = avnd_di_oper_send(cb, comp->su, 0);
>> +                    rc = avnd_di_oper_send(cb, comp->su,
>> SA_AMF_COMPONENT_FAILOVER);
>>              }
>>      }
>>
>> diff --git a/osaf/services/saf/avsv/avnd/avnd_su.c
>> b/osaf/services/saf/avsv/avnd/avnd_su.c
>> --- a/osaf/services/saf/avsv/avnd/avnd_su.c
>> +++ b/osaf/services/saf/avsv/avnd/avnd_su.c
>> @@ -494,6 +494,7 @@ uint32_t avnd_evt_su_admin_op_req(AVND_C
>>              m_AVND_SU_OPER_STATE_SET(su,
>> SA_AMF_OPERATIONAL_ENABLED);
>>              avnd_di_uns32_upd_send(AVSV_SA_AMF_SU,
>> saAmfSUOperState_ID, &su->name, su->oper);
>>              avnd_su_pres_state_set(su,
>> SA_AMF_PRESENCE_UNINSTANTIATED);
>> +            rc = avnd_di_oper_send(cb, su, 0);
>>
>>              if (!comp_in_term_failed_state())
>>                      avnd_failed_state_file_delete();
>> diff --git a/osaf/services/saf/avsv/avnd/avnd_susm.c
>> b/osaf/services/saf/avsv/avnd/avnd_susm.c
>> --- a/osaf/services/saf/avsv/avnd/avnd_susm.c
>> +++ b/osaf/services/saf/avsv/avnd/avnd_susm.c
>> @@ -56,7 +56,6 @@ static uint32_t avnd_su_pres_inst_compin  static
>> uint32_t avnd_su_pres_instfailed_compuninst(AVND_CB *, AVND_SU *,
>> AVND_COMP *);
>>
>>   static uint32_t avnd_su_pres_st_chng_prc(AVND_CB *, AVND_SU *,
>> SaAmfPresenceStateT, SaAmfPresenceStateT);
>> -
>>
>> /**********************************************************
>> ******************
>>    * S E R V I C E  U N I T  P R E S  F S M  M A T R I X  D E F I N I T I O 
>> N *
>>
>> **********************************************************
>> ******************/
>> @@ -1262,6 +1261,32 @@ done:
>>      return rc;
>>   }
>>
>> +
>> +/**
>> + * Check if all components have been terminated in the su.
>> + * @param su
>> + * @return bool
>> + */
>> +static bool all_comps_terminated_in_su(AVND_SU *su) {
>> +    AVND_COMP *comp;
>> +
>> +    for (comp =
>> m_AVND_COMP_FROM_SU_DLL_NODE_GET(m_NCS_DBLIST_FIND_FIRST(
>> &su->comp_list));
>> +                    comp;
>> +                    comp =
>> +m_AVND_COMP_FROM_SU_DLL_NODE_GET(m_NCS_DBLIST_FIND_NEXT(
>> &comp->su_dll_n
>> +ode))) {
>> +
>> +            if ((comp->pres != SA_AMF_PRESENCE_UNINSTANTIATED)
>> &&
>> +                            (comp->pres !=
>> SA_AMF_PRESENCE_INSTANTIATION_FAILED) &&
>> +                            (comp->pres !=
>> SA_AMF_PRESENCE_TERMINATION_FAILED)) {
>> +
>> +                    TRACE("'%s' not terminated, pres.st=%u", comp-
>>> name.value, comp->pres);
>> +                    return false;
>> +            }
>> +       }
>> +
>> +       return true;
>> +}
>> +
>>
>> /**********************************************************
>> ******************
>>     Name          : avnd_su_pres_fsm_run
>>
>> @@ -1300,6 +1325,21 @@ uint32_t avnd_su_pres_fsm_run(AVND_CB *c
>>
>>      TRACE_1("Exited SU presence state FSM: New State = %u",final_st);
>>
>> +    /*Complete su failover at amfnd*/
>> +     if (avnd_sufailover_in_progress(su) &&
>> (all_comps_terminated_in_su(su))) {
>> +                TRACE("SU_FAILOVER for '%s'", su->name.value);
>> +                /* Since all components got successfully terminated, finish
>> sufailover at amfnd
>> +                   by deleting SUSIs at amfnd and informing amfd about
>> sufailover.*/
>> +                LOG_NO("Terminated all components in '%s'", su->name.value);
>> +                LOG_NO("Informing director of sufailover");
>> +                rc = avnd_di_oper_send(avnd_cb, su,
>> AVSV_ERR_RCVR_SU_FAILOVER);
>> +                osafassert(NCSCC_RC_SUCCESS == rc);
>> +                avnd_su_si_del(avnd_cb, &su->name);
>> +            if (!m_AVND_SU_IS_PREINSTANTIABLE(su))
>> +                    avnd_su_pres_state_set(su,
>> SA_AMF_PRESENCE_UNINSTANTIATED);
>> +            goto done;
>> +        }
>> +
>>      /* process state change */
>>      if (prv_st != final_st)
>>              rc = avnd_su_pres_st_chng_prc(cb, su, prv_st, final_st); @@
>> -1411,17 +1451,24 @@ uint32_t avnd_su_pres_st_chng_prc(AVND_C
>>              /* terminating -> uninstantiated */
>>              if ((SA_AMF_PRESENCE_TERMINATING == prv_st) &&
>> (SA_AMF_PRESENCE_UNINSTANTIATED == final_st)) {
>>                      TRACE("SU Terminating -> Uninstantiated");
>> -                    /* reset the su failed flag */
>> -                    if (m_AVND_SU_IS_FAILED(su)) {
>> -                            m_AVND_SU_FAILED_RESET(su);
>> -
>>      m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
>> AVND_CKPT_SU_FLAG_CHANGE);
>> +                    if (avnd_sufailover_in_progress(su)) {
>> +                            /*Do not reset any flag, this will be done as a
>> part of repair.*/
>>                      }
>> +                    else
>> +                    {
>> +                            /* reset the su failed flag */
>> +                            if (m_AVND_SU_IS_FAILED(su)) {
>> +                                    m_AVND_SU_FAILED_RESET(su);
>> +
>>      m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
>> AVND_CKPT_SU_FLAG_CHANGE);
>> +                            }
>>
>> -                    /* reset the su restart falg */
>> -                    if (m_AVND_SU_IS_RESTART(su)) {
>> -                            m_AVND_SU_RESTART_RESET(su);
>> -
>>      m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
>> AVND_CKPT_SU_FLAG_CHANGE);
>> +                            /* reset the su restart flag */
>> +                            if (m_AVND_SU_IS_RESTART(su)) {
>> +                                    m_AVND_SU_RESTART_RESET(su);
>> +
>>      m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
>> AVND_CKPT_SU_FLAG_CHANGE);
>> +                            }
>>                      }
>> +                    goto done;
>>              }
>>
>>              /* instantiating -> inst-failed */
>> @@ -1430,7 +1477,7 @@ uint32_t avnd_su_pres_st_chng_prc(AVND_C
>>                      /* send the su-oper state msg (to indicate that
>> instantiation failed) */
>>                      m_AVND_SU_OPER_STATE_SET(su,
>> SA_AMF_OPERATIONAL_DISABLED);
>>                      m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
>> AVND_CKPT_SU_OPER_STATE);
>> -                    rc = avnd_di_oper_send(cb, su,
>> AVSV_ERR_RCVR_SU_FAILOVER);
>> +                    rc = avnd_di_oper_send(cb, su,
>> SA_AMF_COMPONENT_FAILOVER);
>>                      if (NCSCC_RC_SUCCESS != rc)
>>                              goto done;
>>              }
>> @@ -1457,7 +1504,7 @@ uint32_t avnd_su_pres_st_chng_prc(AVND_C
>>                              TRACE("SU oper state is enabled");
>>                              m_AVND_SU_OPER_STATE_SET(su,
>> SA_AMF_OPERATIONAL_DISABLED);
>>
>>      m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
>> AVND_CKPT_SU_OPER_STATE);
>> -                            rc = avnd_di_oper_send(cb, su,
>> AVSV_ERR_RCVR_SU_FAILOVER);
>> +                            rc = avnd_di_oper_send(cb, su,
>> SA_AMF_COMPONENT_FAILOVER);
>>                              if (NCSCC_RC_SUCCESS != rc)
>>                                      goto done;
>>                      }
>> @@ -1471,7 +1518,7 @@ uint32_t avnd_su_pres_st_chng_prc(AVND_C
>>                      m_AVND_SU_OPER_STATE_SET(su,
>> SA_AMF_OPERATIONAL_DISABLED);
>>                      m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
>> AVND_CKPT_SU_OPER_STATE);
>>                      /* inform AvD about oper state change */
>> -                    rc = avnd_di_oper_send(cb, su, 0);
>> +                    rc = avnd_di_oper_send(cb, su,
>> SA_AMF_COMPONENT_FAILOVER);
>>                      if (NCSCC_RC_SUCCESS != rc)
>>                              goto done;
>>
>> @@ -1515,7 +1562,7 @@ uint32_t avnd_su_pres_st_chng_prc(AVND_C
>>                      m_AVND_SU_OPER_STATE_SET(su,
>> SA_AMF_OPERATIONAL_DISABLED);
>>                      m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
>> AVND_CKPT_SU_OPER_STATE);
>>
>> -                    rc = avnd_di_oper_send(cb, su,
>> AVSV_ERR_RCVR_SU_FAILOVER);
>> +                    rc = avnd_di_oper_send(cb, su,
>> SA_AMF_COMPONENT_FAILOVER);
>>
>>              }
>>
>> @@ -1531,15 +1578,21 @@ uint32_t avnd_su_pres_st_chng_prc(AVND_C
>>              /* terminating -> uninstantiated */
>>              if ((SA_AMF_PRESENCE_TERMINATING == prv_st) &&
>> (SA_AMF_PRESENCE_UNINSTANTIATED == final_st)) {
>>                      TRACE("Terminating -> UnInstantiated");
>> -                    /* si assignment/removal success.. generate si-oper
>> done indication */
>> -                    rc = avnd_su_si_oper_done(cb, su,
>> m_AVND_SU_IS_ALL_SI(su) ? 0 : si);
>> -                    m_AVND_SU_ALL_SI_RESET(su);
>> -                    m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
>> AVND_CKPT_SU_FLAG_CHANGE);
>> +                    if (avnd_sufailover_in_progress(su)) {
>> +                            /*Do not reset any flag, this will be done as a
>> part of repair.*/
>> +                    }
>> +                    else
>> +                    {
>> +                            /* si assignment/removal success.. generate
>> si-oper done indication */
>> +                            rc = avnd_su_si_oper_done(cb, su,
>> m_AVND_SU_IS_ALL_SI(su) ? 0 : si);
>> +                            m_AVND_SU_ALL_SI_RESET(su);
>> +
>>      m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
>> AVND_CKPT_SU_FLAG_CHANGE);
>>
>> -                    /* npi su is enabled in uninstantiated state */
>> -                    m_AVND_SU_OPER_STATE_SET(su,
>> SA_AMF_OPERATIONAL_ENABLED);
>> -                    m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
>> AVND_CKPT_SU_OPER_STATE);
>> -                    rc = avnd_di_oper_send(cb, su, 0);
>> +                            /* npi su is enabled in uninstantiated state */
>> +                            m_AVND_SU_OPER_STATE_SET(su,
>> SA_AMF_OPERATIONAL_ENABLED);
>> +
>>      m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
>> AVND_CKPT_SU_OPER_STATE);
>> +                            rc = avnd_di_oper_send(cb, su, 0);
>> +                    }
>>              }
>>
>>              /* terminating/instantiated/restarting -> term-failed */ @@ -
>> 1550,7 +1603,7 @@ uint32_t avnd_su_pres_st_chng_prc(AVND_C
>>                      m_AVND_SU_OPER_STATE_SET(su,
>> SA_AMF_OPERATIONAL_DISABLED);
>>                      m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su,
>> AVND_CKPT_SU_OPER_STATE);
>>                      /* inform AvD about oper state change */
>> -                    rc = avnd_di_oper_send(cb, su, 0);
>> +                    rc = avnd_di_oper_send(cb, su,
>> SA_AMF_COMPONENT_FAILOVER);
>>
>>                      /* si assignment/removal failed.. inform AvD */
>>                      rc = avnd_di_susi_resp_send(cb, su,
>> m_AVND_SU_IS_ALL_SI(su) ? 0 : si); @@ -2085,11 +2138,9 @@ uint32_t
>> avnd_su_pres_inst_compterming_h
>>      TRACE_ENTER2("CompTerminating event in the Instantiated
>> state:'%s' : '%s'",
>>                               su->name.value, compname);
>>
>> -    if (m_AVND_SU_IS_PREINSTANTIABLE(su)) {
>> -            if (m_AVND_SU_IS_FAILED(su)) {
>> -                    /* transition to terminating state */
>> -                    avnd_su_pres_state_set(su,
>> SA_AMF_PRESENCE_TERMINATING);
>> -            }
>> +    if (m_AVND_SU_IS_FAILED(su)) {
>> +            /* transition to terminating state */
>> +            avnd_su_pres_state_set(su,
>> SA_AMF_PRESENCE_TERMINATING);
>>      }
>>
>>      TRACE_LEAVE2("%u", rc);
>> @@ -2258,7 +2309,9 @@ uint32_t avnd_su_pres_terming_compuninst
>>                               su->name.value, compname);
>>
>>      /* This case is for handling the case of admn su term while su is
>> restarting */
>> -    if (m_AVND_SU_IS_PREINSTANTIABLE(su) &&
>> m_AVND_SU_IS_FAILED(su) && m_AVND_SU_IS_ADMN_TERM(su)) {
>> +    if (m_AVND_SU_IS_PREINSTANTIABLE(su) &&
>> m_AVND_SU_IS_FAILED(su) &&
>> +                    (m_AVND_SU_IS_ADMN_TERM(su) ||
>> avnd_sufailover_in_progress(su)))
>> +    {
>>              TRACE("PI SU");
>>              for (curr_comp =
>> m_AVND_COMP_FROM_SU_DLL_NODE_GET(m_NCS_DBLIST_FIND_FIRST(
>> &su->comp_list));
>>                   curr_comp;
>> @@ -2274,6 +2327,7 @@ uint32_t avnd_su_pres_terming_compuninst
>>              }
>>      }
>>
>> +
>>      /*
>>       * If pi su, pick the prv pi comp & trigger it's FSM with TermEv.
>>       */
>> @@ -2304,7 +2358,7 @@ uint32_t avnd_su_pres_terming_compuninst
>>      /*
>>       * If npi su, pick the prv csi & trigger it's comp fsm with TermEv.
>>       */
>> -    if (!m_AVND_SU_IS_PREINSTANTIABLE(su)) {
>> +    if (!m_AVND_SU_IS_PREINSTANTIABLE(su) &&
>> !m_AVND_SU_IS_FAILED(su)) {
>>              TRACE("NPI SU");
>>              /* get the only csi rec */
>>              curr_csi =
>> m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(m_NCS_DBLIST_FIND_FI
>> RST(&comp->csi_list));
>> @@ -2730,3 +2784,18 @@ uint32_t avnd_su_pres_instfailed_compuni
>>      return rc;
>>   }
>>
>> +/**
>> + * This function checks if the sufailover is going on.
>> + * @param su: ptr to the SU .
>> + *
>> + * @return true/false.
>> + */
>> +bool avnd_sufailover_in_progress(AVND_SU *su) {
>> +    if (m_AVND_SU_IS_FAILED(su) && (su->sufailover) &&
>> +                    ((su->sg_redundancy_model ==
>> SA_AMF_2N_REDUNDANCY_MODEL) ||
>> +                     (su->sg_redundancy_model ==
>> SA_AMF_NO_REDUNDANCY_MODEL)) &&
>> +                     (avnd_cb->oper_state !=
>> SA_AMF_OPERATIONAL_DISABLED) && (!su->is_ncs))
>> +                            return true;
>> +    return false;
>> +}


------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:

Build for Windows Store.

http://p.sf.net/sfu/windows-dev2dev
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to