osaf/services/saf/avsv/avnd/avnd_clc.c | 3 +- osaf/services/saf/avsv/avnd/avnd_susm.c | 60 ++++++++++++++++++++++++-------- 2 files changed, 47 insertions(+), 16 deletions(-)
In case of NPI SU, failed component is cleaned up when AMFD sends quiesced HA state to AMFND. In this issue when SU is still instantiating, one instantiated component failed with suFailover recovery. This patches ensures that when AMFD send quiesced HA state to AMFND, cleanup or termination of components will be performed. 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 @@ -2028,7 +2028,8 @@ uint32_t avnd_comp_clc_terming_cleansucc } /* TODO(hafe) needs to be changed when SU failover is implemented */ - if (m_AVND_COMP_IS_FAILED(comp) && m_AVND_SU_IS_FAILED(comp->su)) { + if (m_AVND_COMP_IS_FAILED(comp) && m_AVND_SU_IS_FAILED(comp->su) && + m_AVND_SU_IS_PREINSTANTIABLE(comp->su)) { /* request director to orchestrate component failover */ rc = avnd_di_oper_send(cb, comp->su, SA_AMF_COMPONENT_FAILOVER); } 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 @@ -1660,6 +1660,8 @@ uint32_t avnd_su_pres_uninst_suinst_hdle uint32_t avnd_su_pres_insting_suterm_hdler(AVND_CB *cb, AVND_SU *su, AVND_COMP *comp) { AVND_COMP *curr_comp = 0; + AVND_SU_SI_REC *si = 0; + AVND_COMP_CSI_REC *curr_csi = 0; uint32_t rc = NCSCC_RC_SUCCESS; TRACE_ENTER2("SU Terminate event in Instantiating state:'%s'", su->name.value); @@ -1667,23 +1669,51 @@ uint32_t avnd_su_pres_insting_suterm_hdl * If pi su, pick all the instantiated/instantiating pi comps & * trigger their FSM with TermEv. */ - for (curr_comp = m_AVND_COMP_FROM_SU_DLL_NODE_GET(m_NCS_DBLIST_FIND_FIRST(&su->comp_list)); - curr_comp; curr_comp = m_AVND_COMP_FROM_SU_DLL_NODE_GET(m_NCS_DBLIST_FIND_NEXT(&curr_comp->su_dll_node))) { - /* - * skip the npi comps.. as the su is yet to be instantiated, - * there are no SIs assigned. - */ - if (!m_AVND_COMP_TYPE_IS_PREINSTANTIABLE(curr_comp)) - continue; + if (m_AVND_COMP_TYPE_IS_PREINSTANTIABLE(su)){ + for (curr_comp = m_AVND_COMP_FROM_SU_DLL_NODE_GET(m_NCS_DBLIST_FIND_FIRST(&su->comp_list)); + curr_comp; curr_comp = m_AVND_COMP_FROM_SU_DLL_NODE_GET(m_NCS_DBLIST_FIND_NEXT(&curr_comp->su_dll_node))) { + /* + * skip the npi comps.. as the su is yet to be instantiated, + * there are no SIs assigned. + */ + if (!m_AVND_COMP_TYPE_IS_PREINSTANTIABLE(curr_comp)) + continue; - /* terminate the non-uninstantiated pi comp */ - if (!m_AVND_COMP_PRES_STATE_IS_UNINSTANTIATED(curr_comp)) { - TRACE("Running the component clc FSM"); - rc = avnd_comp_clc_fsm_run(cb, curr_comp, AVND_COMP_CLC_PRES_FSM_EV_TERM); - if (NCSCC_RC_SUCCESS != rc) - goto done; + /* terminate the non-uninstantiated pi comp */ + if (!m_AVND_COMP_PRES_STATE_IS_UNINSTANTIATED(curr_comp)) { + TRACE("Running the component clc FSM"); + rc = avnd_comp_clc_fsm_run(cb, curr_comp, AVND_COMP_CLC_PRES_FSM_EV_TERM); + if (NCSCC_RC_SUCCESS != rc) + goto done; + } } - } /* for */ + } else { + TRACE("NPI SU:'%s'", su->name.value); + /* get the only si rec */ + si = (AVND_SU_SI_REC *)m_NCS_DBLIST_FIND_FIRST(&su->si_list); + osafassert(si); + /* This is a case when unlocking fails in middle and there may chance that some csi is not + assigned and are in uninstantiated state. In this case, we need to ignore those csis */ + for (curr_csi = (AVND_COMP_CSI_REC *)m_NCS_DBLIST_FIND_LAST(&si->csi_list); + curr_csi; curr_csi = + (AVND_COMP_CSI_REC *)m_NCS_DBLIST_FIND_PREV(&curr_csi->si_dll_node)) { + /* terminate the component containing non-unassigned csi */ + if (m_AVND_COMP_PRES_STATE_IS_UNINSTANTIATED(curr_csi->comp)) { + m_AVND_COMP_CSI_CURR_ASSIGN_STATE_SET(curr_csi, + AVND_COMP_CSI_ASSIGN_STATE_ASSIGNED); + } else { + rc = avnd_comp_clc_fsm_run(cb, curr_csi->comp, + (m_AVND_COMP_IS_FAILED(curr_csi->comp))? + AVND_COMP_CLC_PRES_FSM_EV_CLEANUP : + AVND_COMP_CLC_PRES_FSM_EV_TERM); + if (NCSCC_RC_SUCCESS != rc) + goto done; + else + /* We need to break as we had triggered FSM. */ + break; + } + } + } /* transition to terminating state */ avnd_su_pres_state_set(su, SA_AMF_PRESENCE_TERMINATING); ------------------------------------------------------------------------------ How ServiceNow helps IT people transform IT departments: 1. Consolidate legacy IT systems to a single system of record for IT 2. Standardize and globalize service processes across IT 3. Implement zero-touch automation to replace manual, redundant tasks http://pubads.g.doubleclick.net/gampad/clk?id=51271111&iu=/4140/ostg.clktrk _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel