Hi Minh, Thanks for your comment. I update as Thuan's comment. So we can ignore your comment.
-----Original Message----- From: Minh Hon Chau <minh.c...@dektech.com.au> Sent: Monday, March 2, 2020 10:03 AM To: Thang Duc Nguyen <thang.d.ngu...@dektech.com.au>; Thuan Tran <thuan.t...@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, Please see comments below. Thanks Minh On 27/2/20 5:19 pm, thang.d.nguyen wrote: > - 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; \ > + } \ > + } \ > + } > [M]: There are su_all_pi_comps_instantiated() and pi_su_all_comps_uninstantiated(), can we reuse them? (The naming of these two functions seems not consistent, though). > /* 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()); > + } > + } > > 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)) > /*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); [M] If m_AVND_SU_IS_INSTANTIATED_UNINSTANTIATED() is true, which means all comps may be un-instantiated, so is it ok to trigger EV_INST to SU? _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel