Please see inline.

Thanks,
Praveen

On 01-Jul-13 8:34 PM, Hans Feldt wrote:
>
>
> On 06/28/2013 04:45 PM, praveen malviya wrote:
>> 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.
>
> Well it is good with an idea how we think it should look
>
>>> The SU pres state change from TERMINATING to UNINSTANTIATEzD 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
>
> I do not understand this. An SU in TERMINATING state can end up in 
> either UNINSTANTIATED or TERMINATION-FAILED state. What is this 
> "sometimes hanging" case that you refer to?
>
> I changed your patch according to my comments and it works fine. What 
> test case am I missing?
>
Please test:
1) NPI SU configuration: 1SG, 2 NPI SUs  (saAmfSUFailover=1), 1 comp 
(saAmfCompRecoveryOnError=3)  in each SU and 1SI with 1 CSI.
2)Bring up the model.
2) kill the active SU component.

Thanks,
Praveen
> Thanks,
> Hans
>
>> 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