osaf/services/saf/amf/amfnd/clc.cc            |  14 ++------------
 osaf/services/saf/amf/amfnd/err.cc            |  21 ++++++---------------
 osaf/services/saf/amf/amfnd/include/avnd_su.h |   1 +
 osaf/services/saf/amf/amfnd/su.cc             |  25 +++++++++++++++++++++++++
 4 files changed, 34 insertions(+), 27 deletions(-)


Problem: AMF does not update saAmfSURestartCount and saAmfCompRestartCount
when error escalation is going on and when timer related to error
escalations expires.


Reason: AMFND is not sending update of this attributes to AMFD. Because
of this, AMFD does not update them in IMM and thus user will not get
the updated values.

Fix: AMFND will sending updates of these attributes to AMFD where they
will get updated in IMM.

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(&param, 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, &param);
-               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/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;
+               avnd_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(&param, 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, &param)) {
-                       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;
+               avnd_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;
+                       avnd_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_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 avnd_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);
+               avnd_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);
+               avnd_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;
+               avnd_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,23 @@ void avnd_su_pres_state_set(AVND_SU *su,
        m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, su, AVND_CKPT_SU_PRES_STATE);
 }
 
+/**
+ * Resets component restart count for each component of the su and sends update
+ * for the corresponding runtime attribute saAmfCompRestartCount to AMF 
director.
+ * @param su
+ */
+void avnd_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))) {
+
+               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);
+               }       
+       }
+
+}

------------------------------------------------------------------------------
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

Reply via email to