Hi Praveen, Good that you have sent them as patch series and thanks for working on this long awaited ticket. A quick question.
Can you briefly highlight during which scenario the **autorepair is taken into account by this patch. Thanks, Mathi. > -----Original Message----- > From: Praveen Malviya > Sent: Friday, June 07, 2013 12:10 PM > To: [email protected]; Mathivanan Naickan Palanivelu; Nagendra > Kumar > Cc: [email protected] > Subject: [PATCH 6 of 6] amf: handle sufailover in SU FSM and Comp FSM at > amfnd [#98] > > osaf/services/saf/avsv/avnd/avnd_clc.c | 130 ++++++++++++++++++++++- > -------- > 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 | 81 +++++++++++++------ > 4 files changed, 150 insertions(+), 64 deletions(-) > > > With this patch amfnd informs amfd for failover of assignments when all > components are terminated successfully during suFailover. If some > component faults and SU moves to > inst/term failed state, compFailover 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 > @@ -72,6 +72,7 @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_ > > static uint32_t > avnd_comp_clc_resp(NCS_OS_PROC_EXECUTE_TIMED_CB_INFO *); > static uint32_t avnd_instfail_su_failover(AVND_CB *, AVND_SU *, > AVND_COMP *); > +static bool all_comps_terminated_in_su(AVND_SU *su); > > > /********************************************************** > ***************** > ** C O M P O N E N T C L C F S M M A T R I X D E F I N I T I O N ** > @@ -840,9 +841,29 @@ uint32_t avnd_comp_clc_fsm_run(AVND_CB * > break; > } > } > - > /* get the prv presence state */ > prv_st = comp->pres; > + > + if (avnd_sufailover_in_progress(comp->su) && > + ((ev == > AVND_COMP_CLC_PRES_FSM_EV_CLEANUP_SUCC) || > + (ev == > AVND_COMP_CLC_PRES_FSM_EV_CLEANUP_FAIL))) > + { > + TRACE("SU_FAILOVER is in progress, event '%s'", > pres_state_evt[ev]); > + if (ev == AVND_COMP_CLC_PRES_FSM_EV_CLEANUP_FAIL) > + avnd_comp_pres_state_set(comp, > SA_AMF_PRESENCE_TERMINATION_FAILED); > + else > + avnd_comp_pres_state_set(comp, > SA_AMF_PRESENCE_UNINSTANTIATED); > + /* If all components terminated, finish sufailover at amfnd. > */ > + if (all_comps_terminated_in_su(comp->su)) > + { > + LOG_NO("Terminated all components in '%s'", comp- > >su->name.value); > + LOG_NO("Informing director of sufailover"); > + rc = avnd_di_oper_send(cb, comp->su, > AVSV_ERR_RCVR_SU_FAILOVER); > + osafassert(NCSCC_RC_SUCCESS == rc); > + avnd_su_si_del(cb, &comp->su->name); > + } > + } > + > > /* if already enabled, stop PM & AM */ > if (prv_st == SA_AMF_PRESENCE_INSTANTIATED && > @@ -1065,8 +1086,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 +1120,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 +1216,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 +2794,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,14 +2843,39 @@ 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; > } > > +/** > + * 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_node))) { > + > + 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; > +} > + > 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 > @@ -1411,17 +1411,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 +1437,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; > } > @@ -1445,7 +1452,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; > } > @@ -1459,7 +1466,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; > > @@ -1503,7 +1510,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); > > } > > @@ -1521,13 +1528,19 @@ uint32_t avnd_su_pres_st_chng_prc(AVND_C > 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 > + { > + 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 */ > @@ -1538,7 +1551,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); > @@ -2073,11 +2086,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); > @@ -2246,7 +2257,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; > @@ -2262,6 +2275,7 @@ uint32_t avnd_su_pres_terming_compuninst > } > } > > + > /* > * If pi su, pick the prv pi comp & trigger it's FSM with TermEv. > */ > @@ -2292,7 +2306,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)); > @@ -2718,3 +2732,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
