osaf/services/saf/amf/amfnd/clc.cc | 85 ++++++++++++++++++++++++++- osaf/services/saf/amf/amfnd/include/avnd_su.h | 1 + osaf/services/saf/amf/amfnd/susm.cc | 2 +- 3 files changed, 86 insertions(+), 2 deletions(-)
In reported problem, AMFD does not send state change notification for 1)SU presence state change from INSTANTIATED to RESTARTING and 2)SU presence state change from RESTARTING to INSTANTIATED when component restarts due to RESTART admin op on it or faults with comp-restart recovery. As per AMF spec, presence state of SU will be RESTARTING when all of its comp are in RESTARTING presence state. In this case when comp restarts due to fault or RESTART admin op on it, AMFND is not marking SU's presence state RESTARTING and SU remains in INSTANTIATED state. Since there is no change in presence state of SU, no state change notification for SU is sent. Patch fixes the problem by marking SU's presence state to RESTARTING when: 1)SU consists of a single restartable component and this comp restarts due to fault or RESTART admin op on it. 2)SU consists of all restartable components and all these components faults simultaneously. diff --git a/osaf/services/saf/amf/amfnd/clc.cc b/osaf/services/saf/amf/amfnd/clc.cc --- a/osaf/services/saf/amf/amfnd/clc.cc +++ b/osaf/services/saf/amf/amfnd/clc.cc @@ -993,7 +993,36 @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_ if ((SA_AMF_PRESENCE_TERMINATING == prv_st) && (SA_AMF_PRESENCE_TERMINATION_FAILED == final_st)) { /* termination failed.. log it */ } - + //Instantiated -> Restarting. + if ((prv_st == SA_AMF_PRESENCE_INSTANTIATED) && (final_st == SA_AMF_PRESENCE_RESTARTING)) { + /* + This presence state transition involving RESTARTING state may originate + with or without any SU FSM event : + a)Without SU FSM event: when component is restartable + and event is fault or RESTART admin op on component. + b)With SU FSM event: when all comps are restartable and RESTART + admin op on SU. + In the case b) SU FSM takes care of moving presence state of SU to + RESTARTING when all of its components (all restartable) are + in RESTARTING state at any given point of time. + + In case a), SU FSM never gets triggered because restart of component + is totally restricted to comp FSM. So in this case comp FSM itself + will have to mark SU's presence state RESTARTING whenever all the components + are in Restarting state. This can occur in: + -confs with single restartable component because of fault with comp-restart + recovery or RESTART admin op on comp. OR + -confs with all comp restartable when all comps faults with comp-restart recovery. + So if I am here because of case a) check if I can mark SU RESTARTING. + */ + if ((isRestartSet(comp->su) == false) && + ((m_AVND_COMP_IS_FAILED(comp)) || (comp->admin_oper == true)) && + (su_evaluate_restarting_state(comp->su) == true)) { + TRACE_1("Comp RESTARTING due to comp-restart recovery or RESTART admin op"); + avnd_su_pres_state_set(cb, comp->su, SA_AMF_PRESENCE_RESTARTING); + } + + } /* restarting -> instantiated */ if ((SA_AMF_PRESENCE_RESTARTING == prv_st) && (SA_AMF_PRESENCE_INSTANTIATED == final_st)) { /* reset the comp failed flag & set the oper state to enabled */ @@ -1021,6 +1050,16 @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_ rc = avnd_comp_csi_reassign(cb, comp); if (NCSCC_RC_SUCCESS != rc) goto done; + /* + Mark SU Instantiated when atleast one component moves to instantiated state. + Single comp restarting case or fault of all restartable comps with comp-restart + recovery. For more details read in transition from INSTANTIATED to RESTARTING. + */ + if ((comp->su->pres == SA_AMF_PRESENCE_RESTARTING) && + (isRestartSet(comp->su) == false)) { + TRACE_1("Comp INSTANTIATED due to comp-restart recovery or RESTART admin op"); + avnd_su_pres_state_set(cb, comp->su, SA_AMF_PRESENCE_INSTANTIATED); + } } /* wild case */ @@ -1193,6 +1232,22 @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_ if (NCSCC_RC_SUCCESS != rc) goto done; clear_error_report_alarm(comp); + /* + Mark SU Instantiated when atleast one component moves to instantiated state. + Single comp restarting case or fault of all restartable comps with comp-restart + recovery. Please read detailed explanation in state transition for PI + comp in PI SU from INSTANTIATED to RESTARTING in this function. + */ + if ((comp->su->pres == SA_AMF_PRESENCE_RESTARTING) + && (isRestartSet(comp->su) == false)) { + TRACE_1("Comp INSTANTIATED due to comp-restart recovery or RESTART admin op"); + avnd_su_pres_state_set(cb, comp->su, SA_AMF_PRESENCE_INSTANTIATED); + } + csi = m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(m_NCS_DBLIST_FIND_FIRST(&comp->csi_list)); + //Mark CSI ASSIGNED in case of comp-restart recovery and RESTART admin op on comp. + if ((isRestartSet(comp->su) == false) && + (m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_RESTARTING(csi))) + m_AVND_COMP_CSI_CURR_ASSIGN_STATE_SET(csi, AVND_COMP_CSI_ASSIGN_STATE_ASSIGNED); } /* terminating -> uninstantiated */ @@ -1223,6 +1278,34 @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_ if (NCSCC_RC_SUCCESS != rc) goto done; } + //Instantiated -> Restarting. + if ((prv_st == SA_AMF_PRESENCE_INSTANTIATED) && (final_st == SA_AMF_PRESENCE_RESTARTING)) { + //Please read detailed explanation in same state transition for PI comp in PI SU. + + bool su_restarting = true; + csi = m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(m_NCS_DBLIST_FIND_FIRST(&comp->csi_list)); + AVND_SU_SI_REC *si = csi->si; //NPI SU can have only one SI assigned to it. + if ((isRestartSet(comp->su) == false) && + ((m_AVND_COMP_IS_FAILED(comp)) || (comp->admin_oper == true))) { + //Check if all COMPCSIs are in RESTARTING state execpt this compcsi. + for (csi = (AVND_COMP_CSI_REC *)m_NCS_DBLIST_FIND_FIRST(&si->csi_list); + csi; csi = (AVND_COMP_CSI_REC *)m_NCS_DBLIST_FIND_NEXT(&csi->si_dll_node)) { + if (csi->comp == comp) + continue; /*skip this compcsi as CSI is lately moved to + RESTARTING state in comp_restart_initiate().*/ + if (!m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_RESTARTING(csi)) { + su_restarting = false; + break; + } + } + if (su_restarting == true) { + TRACE_1("Comp RESTARTING due to comp-restart recovery or RESTART admin op"); + avnd_su_pres_state_set(cb, comp->su, SA_AMF_PRESENCE_RESTARTING); + } + } + + } + } /* when a comp moves from inst->orph, we need to delete the diff --git a/osaf/services/saf/amf/amfnd/include/avnd_su.h b/osaf/services/saf/amf/amfnd/include/avnd_su.h --- a/osaf/services/saf/amf/amfnd/include/avnd_su.h +++ b/osaf/services/saf/amf/amfnd/include/avnd_su.h @@ -422,4 +422,5 @@ bool all_csis_in_assigned_state(const AV bool isAdminRestarted(const AVND_SU *su); bool isFailed(const AVND_SU *su); bool isRestartSet(const AVND_SU *su); +bool su_evaluate_restarting_state(AVND_SU *su); #endif diff --git a/osaf/services/saf/amf/amfnd/susm.cc b/osaf/services/saf/amf/amfnd/susm.cc --- a/osaf/services/saf/amf/amfnd/susm.cc +++ b/osaf/services/saf/amf/amfnd/susm.cc @@ -2363,7 +2363,7 @@ uint32_t avnd_su_pres_inst_suterm_hdler( * @param ptr to su. * @return true/false. */ -static bool su_evaluate_restarting_state(AVND_SU *su) +bool su_evaluate_restarting_state(AVND_SU *su) { for (AVND_COMP *comp = m_AVND_COMP_FROM_SU_DLL_NODE_GET(m_NCS_DBLIST_FIND_FIRST(&su->comp_list)); comp; ------------------------------------------------------------------------------ Find and fix application performance issues faster with Applications Manager Applications Manager provides deep performance insights into multiple tiers of your business applications. It resolves application problems quickly and reduces your MTTR. Get your free trial! https://ad.doubleclick.net/ddm/clk/302982198;130105516;z _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel