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