Hi Thuan,
Thanks for your comment.
See my comment inline.

-----Original Message-----
From: Thuan Tran <thuan.t...@dektech.com.au> 
Sent: Monday, March 2, 2020 9:41 AM
To: Thang Duc Nguyen <thang.d.ngu...@dektech.com.au>; Minh Hon Chau 
<minh.c...@dektech.com.au>; Gary Lee <gary....@dektech.com.au>
Cc: opensaf-devel@lists.sourceforge.net
Subject: RE: [PATCH 1/1] amfnd: handle comp instantiate event with SU in 
terminating presence state [#3160]

Hi Thang,

I have 2 comments inline.

Best Regards,
ThuanTr

-----Original Message-----
From: Thang Duc Nguyen <thang.d.ngu...@dektech.com.au>
Sent: Thursday, February 27, 2020 1:19 PM
To: Minh Hon Chau <minh.c...@dektech.com.au>; Thuan Tran 
<thuan.t...@dektech.com.au>; Gary Lee <gary....@dektech.com.au>
Cc: opensaf-devel@lists.sourceforge.net; Thang Duc Nguyen 
<thang.d.ngu...@dektech.com.au>
Subject: [PATCH 1/1] amfnd: handle comp instantiate event with SU in 
terminating presence state [#3160]

- When component is instantiated with SU in terminating presence state, need 
trigger SU fsm with instantiate event if all components are either 
uninstantiated or instantiated.
- Need informing error recovery when amfnd fails to send callback parameters to 
component when component already exited.
---
 src/amf/amfnd/avnd_su.h | 19 +++++++++++++++++++
 src/amf/amfnd/comp.cc   | 23 ++++++++++++++++++++++-
 src/amf/amfnd/susm.cc   |  6 ++++--
 3 files changed, 45 insertions(+), 3 deletions(-)

diff --git a/src/amf/amfnd/avnd_su.h b/src/amf/amfnd/avnd_su.h index 
45effd6c9..eb708dce0 100644
--- a/src/amf/amfnd/avnd_su.h
+++ b/src/amf/amfnd/avnd_su.h
@@ -256,6 +256,25 @@ typedef struct avnd_su_tag {
       }                                                           \
     }                                                             \
   }
+/* macro to determine if all the pi comps in an su
+   are instantiated or uninstantiated
+*/
+#define m_AVND_SU_IS_INSTANTIATED_UNINSTANTIATED(su, is)          \
+  {                                                               \
+    AVND_COMP *curr = 0;                                          \
+    (is) = true;                                                  \
+    for (curr = m_AVND_COMP_FROM_SU_DLL_NODE_GET(                 \
+             m_NCS_DBLIST_FIND_FIRST(&su->comp_list));            \
+         curr; curr = m_AVND_COMP_FROM_SU_DLL_NODE_GET(           \
+                   m_NCS_DBLIST_FIND_NEXT(&curr->su_dll_node))) { \
+      if (m_AVND_COMP_TYPE_IS_PREINSTANTIABLE(curr) &&            \
+          (!m_AVND_COMP_PRES_STATE_IS_INSTANTIATED(curr) &&       \
+          !m_AVND_COMP_PRES_STATE_IS_UNINSTANTIATED(curr))) {     \
+        (is) = false;                                             \
+        break;                                                    \
+      }                                                           \
+    }                                                             \
+  }
 
 /* macros to manage the presence state */  #define 
m_AVND_SU_PRES_STATE_IS_INSTANTIATED(x) \ diff --git a/src/amf/amfnd/comp.cc 
b/src/amf/amfnd/comp.cc index 8a11d75fb..cef94a0d4 100644
--- a/src/amf/amfnd/comp.cc
+++ b/src/amf/amfnd/comp.cc
@@ -2031,6 +2031,7 @@ uint32_t avnd_comp_cbk_send(AVND_CB *cb, AVND_COMP *comp,
                             AVND_COMP_CSI_REC *csi_rec) {
   SaAmfCSIDescriptorT csi_desc;
   SaAmfCSIFlagsT csi_flag;
+  AVND_ERR_INFO err_info;
   std::string csi_name;
   AVSV_AMF_CBK_INFO *cbk_info = 0;
   AVND_COMP_CSI_REC *curr_csi = 0;
@@ -2039,6 +2040,7 @@ uint32_t avnd_comp_cbk_send(AVND_CB *cb, AVND_COMP *comp,
   SaAmfHandleT hdl = 0;
   SaTimeT per = 0;
   uint32_t rc = NCSCC_RC_SUCCESS;
+  uint32_t ret = NCSCC_RC_SUCCESS;
 
   TRACE_ENTER2("'%s' %u", comp->name.c_str(), type);
   /*
@@ -2201,7 +2203,26 @@ uint32_t avnd_comp_cbk_send(AVND_CB *cb, AVND_COMP *comp,
   rc = avnd_comp_cbq_send(cb, comp, dest, hdl, cbk_info, per);
 
 done:
-  if ((NCSCC_RC_SUCCESS != rc) && cbk_info) avsv_amf_cbk_free(cbk_info);
+  if ((NCSCC_RC_SUCCESS != rc) && cbk_info) {
+    avsv_amf_cbk_free(cbk_info);
+    LOG_ER("avnd_comp_cbk_send failed for comp: %s, type: %d",
+          comp->name.c_str(), type);
+    if (type == AVSV_AMF_CSI_SET) {
+      err_info.src = AVND_ERR_SRC_CBK_CSI_SET_FAILED;
+    } else if (type == AVSV_AMF_COMP_TERM) {
+      err_info.src = AVND_ERR_SRC_CMD_FAILED;
+    } else {
+      // For another callback types
+      err_info.src = AVND_ERR_SRC_MAX;
+    }
+    err_info.rec_rcvr.avsv_ext =
+        static_cast<AVSV_ERR_RCVR>(comp->err_info.def_rec);
+    ret = avnd_err_process(cb, comp, &err_info);
+    if (NCSCC_RC_SUCCESS != ret) {
+      LOG_ER("process error failed for comp: %s",
+      comp->name.c_str());
+    }
+  }
 [Thuan] Will AMF handle later as "ava down" detect? Why still need new code to 
handle send callback fail?
[Thang]: In this case failed to send due to client down. And it is stuck. It 
need to recover asap.
Moreover from the code, the timer did not start in this case.
      } else {
        /* send the message to AvA */
        rc = avnd_mds_send(cb, &msg, &rec->dest, 0); //Failed here
      }

      if (NCSCC_RC_SUCCESS == rc) {
        /* start the callback response timer */
        if (true == timer_start) {
          m_AVND_TMR_COMP_CBK_RESP_START(cb, *rec, rec->timeout, rc); // start 
timer for cb respond here.
          /* Not sure why someone has written the following line. */
          msg.info.ava = 0;
        }
      }

   TRACE_LEAVE2("%u", rc);
   return rc;
diff --git a/src/amf/amfnd/susm.cc b/src/amf/amfnd/susm.cc index 
86811f1e4..162f65625 100644
--- a/src/amf/amfnd/susm.cc
+++ b/src/amf/amfnd/susm.cc
@@ -2897,7 +2897,7 @@ uint32_t avnd_su_pres_terming_compinst_hdler(AVND_CB *cb, 
AVND_SU *su,
       su->name.c_str(), compname.c_str());
 
   if (m_AVND_SU_IS_PREINSTANTIABLE(su)) {
-    bool is;
+    bool is = false;
     osafassert(comp != nullptr);
     if (m_AVND_COMP_IS_FAILED(comp)) {
       m_AVND_COMP_FAILED_RESET(comp);
@@ -2908,8 +2908,10 @@ uint32_t avnd_su_pres_terming_compinst_hdler(AVND_CB 
*cb, AVND_SU *su,
     if (true == is) {
       avnd_su_pres_state_set(cb, su, SA_AMF_PRESENCE_INSTANTIATED);
     }
+
     if (m_AVND_SU_IS_RESTART(su)) {
-      if (su->admin_op_Id == SA_AMF_ADMIN_RESTART)
+      m_AVND_SU_IS_INSTANTIATED_UNINSTANTIATED(su, is)
+      if ((su->admin_op_Id == SA_AMF_ADMIN_RESTART) || (true == is))
[Thuan] Can the issue be solved if we just remove condition SU admin restart? 
Or check if SU restart due to escalation?
Because from description of ticket, I guess SU is not in admin restart but in a 
recovery escalation.
[Thang]: It works fine if we remove adm restart checking condition. So I will 
update in next version.

         /*This can happen when SU has both restartable and non restartable
            comps.Go for further instantiation.*/
         rc = avnd_su_pres_fsm_run(cb, su, 0, AVND_SU_PRES_FSM_EV_INST);
--
2.17.1



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

Reply via email to