COMP restart recovery during SU restart recovery can lead to SU
stuck in INSTANTIATING without further action. Because COMP instaniated
event in RESTARTING does not trigger avnd_su_pres_fsm_run().
---
 src/amf/amfnd/clc.cc  | 11 ++++++++++-
 src/amf/amfnd/susm.cc |  4 +++-
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/src/amf/amfnd/clc.cc b/src/amf/amfnd/clc.cc
index 675ca49..c4067f4 100644
--- a/src/amf/amfnd/clc.cc
+++ b/src/amf/amfnd/clc.cc
@@ -926,6 +926,7 @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_CB *cb, AVND_COMP 
*comp,
   AVND_SU_PRES_FSM_EV ev = AVND_SU_PRES_FSM_EV_MAX;
   AVND_COMP_CSI_REC *csi = 0;
   bool is_en;
+  bool pi_comp_recover = false;
   uint32_t rc = NCSCC_RC_SUCCESS;
   TRACE_ENTER2("Comp '%s', Prv_state '%s', Final_state '%s'",
                comp->name.c_str(), presence_state[prv_st],
@@ -947,6 +948,13 @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_CB *cb, AVND_COMP 
*comp,
                              comp->name, comp->err_info.restart_cnt);
     }
   }
+
+  if ((comp->admin_oper == false) &&
+      (prv_st == SA_AMF_PRESENCE_RESTARTING) &&
+      m_AVND_COMP_TYPE_IS_PREINSTANTIABLE(comp)) {
+    pi_comp_recover = true;
+  }
+
   /* reset the admin-oper flag to false */
   if ((comp->admin_oper == true) &&
       (final_st == SA_AMF_PRESENCE_INSTANTIATED)) {
@@ -1487,7 +1495,8 @@ uint32_t avnd_comp_clc_st_chng_prc(AVND_CB *cb, AVND_COMP 
*comp,
              (SA_AMF_PRESENCE_ORPHANED != prv_st) &&
              ((prv_st == SA_AMF_PRESENCE_INSTANTIATING) ||
               (prv_st == SA_AMF_PRESENCE_TERMINATING) ||
-              (comp->su->admin_op_Id == SA_AMF_ADMIN_RESTART)))
+              (comp->su->admin_op_Id == SA_AMF_ADMIN_RESTART) ||
+              pi_comp_recover))
       ev = AVND_SU_PRES_FSM_EV_COMP_INSTANTIATED;
     else if (SA_AMF_PRESENCE_INSTANTIATION_FAILED == final_st)
       ev = AVND_SU_PRES_FSM_EV_COMP_INST_FAIL;
diff --git a/src/amf/amfnd/susm.cc b/src/amf/amfnd/susm.cc
index c023c8d..62e2db9 100644
--- a/src/amf/amfnd/susm.cc
+++ b/src/amf/amfnd/susm.cc
@@ -2282,7 +2282,9 @@ uint32_t avnd_su_pres_insting_compinst_hdler(AVND_CB *cb, 
AVND_SU *su,
            curr_comp; curr_comp = m_AVND_COMP_FROM_SU_DLL_NODE_GET(
                           m_NCS_DBLIST_FIND_NEXT(&curr_comp->su_dll_node))) {
         /* instantiate the pi comp */
-        if (m_AVND_COMP_TYPE_IS_PREINSTANTIABLE(curr_comp)) {
+        if (m_AVND_COMP_TYPE_IS_PREINSTANTIABLE(curr_comp) &&
+           (!m_AVND_COMP_IS_FAILED(curr_comp) ||
+            curr_comp->pres != SA_AMF_PRESENCE_RESTARTING)) {
           TRACE("Running the component clc FSM");
           rc = avnd_comp_clc_fsm_run(cb, curr_comp,
                                      AVND_COMP_CLC_PRES_FSM_EV_INST);
-- 
2.7.4



_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to