osaf/services/saf/amf/amfnd/clc.cc | 14 ++------------ osaf/services/saf/amf/amfnd/comp.cc | 14 ++++++++++++++ osaf/services/saf/amf/amfnd/err.cc | 21 ++++++--------------- osaf/services/saf/amf/amfnd/include/avnd_comp.h | 1 + osaf/services/saf/amf/amfnd/include/avnd_su.h | 1 + osaf/services/saf/amf/amfnd/su.cc | 19 +++++++++++++++++++ 6 files changed, 43 insertions(+), 27 deletions(-)
Problem: AMF does not update saAmfSURestartCount and saAmfCompRestartCount when error escalation is going on or when timer related to error escalations expires. Reason: AMFND is not sending update of these attributes to AMFD. Due to this, AMFD does not return updated value to IMM upon request. Fix: AMFND will send updates of these attributes to AMFD. 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 @@ -878,7 +878,6 @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_ { AVND_SU_PRES_FSM_EV ev = AVND_SU_PRES_FSM_EV_MAX; AVND_COMP_CSI_REC *csi = 0; - AVSV_PARAM_INFO param; bool is_en; uint32_t rc = NCSCC_RC_SUCCESS; TRACE_ENTER2("Comp '%s', Prv_state '%u', Final_state '%u'", comp->name.value, prv_st, final_st); @@ -895,17 +894,8 @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_ TRACE_1("Component restart not through admin operation"); /* inform avd of the change in restart count */ - memset(¶m, 0, sizeof(AVSV_PARAM_INFO)); - param.class_id = AVSV_SA_AMF_COMP; - param.attr_id = saAmfCompRestartCount_ID; - param.name = comp->name; - param.act = AVSV_OBJ_OPR_MOD; - *((uint32_t *)param.value) = m_NCS_OS_HTONL(comp->err_info.restart_cnt); - param.value_len = sizeof(uint32_t); - - rc = avnd_di_object_upd_send(cb, ¶m); - if (NCSCC_RC_SUCCESS != rc) - goto done; + avnd_di_uns32_upd_send(AVSV_SA_AMF_COMP, saAmfCompRestartCount_ID, + &comp->name, comp->err_info.restart_cnt); } /* reset the admin-oper flag to false */ if (comp->admin_oper == true) { diff --git a/osaf/services/saf/amf/amfnd/comp.cc b/osaf/services/saf/amf/amfnd/comp.cc --- a/osaf/services/saf/amf/amfnd/comp.cc +++ b/osaf/services/saf/amf/amfnd/comp.cc @@ -2738,3 +2738,17 @@ bool comp_has_quiesced_assignment(const return false; } + +/** + * @brief Resets component restart count. + * @param comp + */ +void comp_reset_restart_count(AVND_COMP *comp) +{ + if (comp->err_info.restart_cnt != 0) { + comp->err_info.restart_cnt = 0; + avnd_di_uns32_upd_send(AVSV_SA_AMF_COMP, saAmfCompRestartCount_ID, + &comp->name, comp->err_info.restart_cnt); + } +} + diff --git a/osaf/services/saf/amf/amfnd/err.cc b/osaf/services/saf/amf/amfnd/err.cc --- a/osaf/services/saf/amf/amfnd/err.cc +++ b/osaf/services/saf/amf/amfnd/err.cc @@ -1088,6 +1088,7 @@ uint32_t avnd_err_restart_esc_level_0(AV m_AVND_TMR_COMP_ERR_ESC_STOP(cb, su); m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su, AVND_CKPT_SU_ERR_ESC_TMR); su->comp_restart_cnt = 0; + su_reset_restart_count_in_comps(su); /* go to the next possible level, is su restart capable? */ if (su->su_restart_max != 0 && !m_AVND_SU_IS_SU_RESTART_DIS(su)) { @@ -1133,7 +1134,6 @@ uint32_t avnd_err_restart_esc_level_1(AV { uint32_t rc = NCSCC_RC_SUCCESS; - AVSV_PARAM_INFO param; TRACE_ENTER(); /* If the SU is still instantiating, do jump to next level */ @@ -1167,20 +1167,6 @@ uint32_t avnd_err_restart_esc_level_1(AV m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su, AVND_CKPT_SU_ERR_ESC_TMR); } su->su_restart_cnt++; - - /* send su_restart_cnt to AVD */ - memset(¶m, 0, sizeof(AVSV_PARAM_INFO)); - param.class_id = AVSV_SA_AMF_SU; - param.attr_id = saAmfSURestartCount_ID; - param.name = su->name; - param.act = AVSV_OBJ_OPR_MOD; - *((uint32_t *)param.value) = m_NCS_OS_HTONL(su->su_restart_cnt); - param.value_len = sizeof(uint32_t); - - if (NCSCC_RC_SUCCESS != avnd_di_object_upd_send(cb, ¶m)) { - TRACE_2("avnd_di_object_upd_send() failed for su_restart_cnt"); - } - goto done; } @@ -1190,6 +1176,7 @@ uint32_t avnd_err_restart_esc_level_1(AV m_AVND_TMR_SU_ERR_ESC_STOP(cb, su); m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su, AVND_CKPT_SU_ERR_ESC_TMR); su->su_restart_cnt = 0; + su_reset_restart_count_in_comps(su); /* go to the next possible level, get escalted recovery and modify count */ if ((cb->su_failover_max != 0) || (true == su->su_is_external)) { @@ -1206,6 +1193,7 @@ uint32_t avnd_err_restart_esc_level_1(AV } done: + avnd_di_uns32_upd_send(AVSV_SA_AMF_SU, saAmfSURestartCount_ID, &su->name, su->su_restart_cnt); m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su, AVND_CKPT_SU_RESTART_CNT); TRACE_LEAVE2("retval=%u", rc); return rc; @@ -1373,6 +1361,9 @@ uint32_t avnd_evt_tmr_node_err_esc_evh(A if (su->su_err_esc_level == AVND_ERR_ESC_LEVEL_2) { su->comp_restart_cnt = 0; su->su_restart_cnt = 0; + su_reset_restart_count_in_comps(su); + avnd_di_uns32_upd_send(AVSV_SA_AMF_SU, saAmfSURestartCount_ID, + &su->name, su->su_restart_cnt); su->su_err_esc_level = AVND_ERR_ESC_LEVEL_0; } su = (AVND_SU *)ncs_patricia_tree_getnext(&cb->sudb, (uint8_t *)&su->name); diff --git a/osaf/services/saf/amf/amfnd/include/avnd_comp.h b/osaf/services/saf/amf/amfnd/include/avnd_comp.h --- a/osaf/services/saf/amf/amfnd/include/avnd_comp.h +++ b/osaf/services/saf/amf/amfnd/include/avnd_comp.h @@ -888,5 +888,6 @@ bool comp_has_quiesced_assignment(const * * Faulty NPI/PI components: launch the cleanup CLC CLI script */ extern uint32_t comp_restart_initiate(AVND_COMP *comp); +extern void comp_reset_restart_count(AVND_COMP *comp); #endif /* !AVND_COMP_H */ 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 @@ -406,5 +406,6 @@ extern struct avnd_su_si_rec *avnd_silis extern bool sufailover_in_progress(const AVND_SU *su); extern bool sufailover_during_nodeswitchover(const AVND_SU *su); extern bool all_csis_in_removed_state(const AVND_SU *su); +extern void su_reset_restart_count_in_comps(const AVND_SU *su); #endif diff --git a/osaf/services/saf/amf/amfnd/su.cc b/osaf/services/saf/amf/amfnd/su.cc --- a/osaf/services/saf/amf/amfnd/su.cc +++ b/osaf/services/saf/amf/amfnd/su.cc @@ -473,12 +473,15 @@ uint32_t avnd_evt_tmr_su_err_esc_evh(AVN su->comp_restart_cnt = 0; su->su_err_esc_level = AVND_ERR_ESC_LEVEL_0; m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su, AVND_CKPT_SU_COMP_RESTART_CNT); + su_reset_restart_count_in_comps(su); break; case AVND_ERR_ESC_LEVEL_1: su->su_restart_cnt = 0; su->su_err_esc_level = AVND_ERR_ESC_LEVEL_0; cb->node_err_esc_level = AVND_ERR_ESC_LEVEL_0; m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su, AVND_CKPT_SU_RESTART_CNT); + su_reset_restart_count_in_comps(su); + avnd_di_uns32_upd_send(AVSV_SA_AMF_SU, saAmfSURestartCount_ID, &su->name, su->su_restart_cnt); break; case AVND_ERR_ESC_LEVEL_2: cb->su_failover_cnt = 0; @@ -554,7 +557,9 @@ uint32_t avnd_su_curr_info_del(AVND_CB * if (!m_AVND_SU_IS_FAILED(su)) { su->su_err_esc_level = AVND_ERR_ESC_LEVEL_0; su->comp_restart_cnt = 0; + su_reset_restart_count_in_comps(su); su->su_restart_cnt = 0; + avnd_di_uns32_upd_send(AVSV_SA_AMF_SU, saAmfSURestartCount_ID, &su->name, su->su_restart_cnt); m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su, AVND_CKPT_SU_CONFIG); /* stop su_err_esc_tmr TBD Later */ @@ -670,3 +675,17 @@ void avnd_su_pres_state_set(AVND_SU *su, m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su, AVND_CKPT_SU_PRES_STATE); } +/** + * @brief Resets component restart count for each component of SU. + * @param su + */ +void su_reset_restart_count_in_comps(const 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))) { + comp_reset_restart_count(comp); + } + +} ------------------------------------------------------------------------------ Learn Graph Databases - Download FREE O'Reilly Book "Graph Databases" is the definitive new guide to graph databases and their applications. Written by three acclaimed leaders in the field, this first edition is now available. Download your free book today! http://p.sf.net/sfu/NeoTech _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel