During SURestart, another compoenent is failovered. The SU-SI modify event message need buffering to process later. The new active assignment on SU need processing after it is instantiated. --- src/amf/amfnd/comp.cc | 3 ++- src/amf/amfnd/susm.cc | 62 ++++++++++++++++++++++++++++++------------- 2 files changed, 46 insertions(+), 19 deletions(-)
diff --git a/src/amf/amfnd/comp.cc b/src/amf/amfnd/comp.cc index d805346bb..f1e33c372 100644 --- a/src/amf/amfnd/comp.cc +++ b/src/amf/amfnd/comp.cc @@ -1083,7 +1083,8 @@ uint32_t avnd_comp_csi_assign(AVND_CB *cb, AVND_COMP *comp, if (curr_csi->curr_assign_state == AVND_COMP_CSI_ASSIGN_STATE_UNASSIGNED && curr_csi->prv_assign_state == - AVND_COMP_CSI_ASSIGN_STATE_UNASSIGNED) { + AVND_COMP_CSI_ASSIGN_STATE_UNASSIGNED && + !m_AVND_SU_IS_RESTART(comp->su)) { // Mark suspending_assignment for all unassigned csi(s) which are // going to be assigned to *curr_csi->comp* for (t_csi = m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET( diff --git a/src/amf/amfnd/susm.cc b/src/amf/amfnd/susm.cc index 86811f1e4..4ff433ea2 100644 --- a/src/amf/amfnd/susm.cc +++ b/src/amf/amfnd/susm.cc @@ -218,10 +218,13 @@ AVND_SU_SIQ_REC *avnd_su_siq_rec_buf(AVND_CB *cb, AVND_SU *su, uint32_t rc = NCSCC_RC_SUCCESS; TRACE_ENTER2("'%s'", su->name.c_str()); - /* buffer the msg, if SU is inst-failed and all comps are not terminated */ + /* buffer the msg, if SU is inst-failed and all comps are not terminated + or during SuRestart */ if (((su->pres == SA_AMF_PRESENCE_INSTANTIATION_FAILED) && (!m_AVND_SU_IS_ALL_TERM(su))) || - m_AVND_IS_SHUTTING_DOWN(cb)) { + m_AVND_IS_SHUTTING_DOWN(cb) || + (m_AVND_SU_IS_RESTART(su) && + su_all_comps_restartable(*su))) { siq = avnd_su_siq_rec_add(cb, su, param, &rc); TRACE_LEAVE(); return siq; @@ -303,15 +306,18 @@ uint32_t avnd_su_siq_prc(AVND_CB *cb, AVND_SU *su) { return rc; } - /* unlink the buffered msg from the queue */ - ncs_db_link_list_delink(&su->siq, &siq->su_dll_node); - /* initiate si asignment / removal */ rc = avnd_su_si_msg_prc(cb, su, &siq->info); - /* delete the buffered msg */ - avnd_su_siq_rec_del(cb, su, siq); - + // Siq will used to su-si respond later + // in case modify SU-SI during SURestart + if ((siq->info.msg_act != AVSV_SUSI_ACT_MOD) || + !m_AVND_SU_IS_RESTART(su)) { + /* unlink the buffered msg from the queue */ + ncs_db_link_list_delink(&su->siq, &siq->su_dll_node); + /* delete the buffered msg */ + avnd_su_siq_rec_del(cb, su, siq); + } TRACE_LEAVE2("%u", rc); return rc; } @@ -1128,6 +1134,7 @@ static bool container_contained_shutdown(const AVND_SU *su) { uint32_t avnd_su_si_oper_done(AVND_CB *cb, AVND_SU *su, AVND_SU_SI_REC *si) { AVND_SU_SI_REC *curr_si = 0; AVND_COMP_CSI_REC *curr_csi = 0, *t_csi = 0; + AVND_SU_SIQ_REC *siq = 0; uint32_t rc = NCSCC_RC_SUCCESS; bool opr_done; @@ -1199,6 +1206,18 @@ uint32_t avnd_su_si_oper_done(AVND_CB *cb, AVND_SU *su, AVND_SU_SI_REC *si) { if (NCSCC_RC_SUCCESS != rc) goto done; } + // Modify event during SURestart should be respond + siq = reinterpret_cast<AVND_SU_SIQ_REC *>(m_NCS_DBLIST_FIND_LAST(&su->siq)); + if (siq && (siq->info.msg_act == AVSV_SUSI_ACT_MOD) && + m_AVND_SU_IS_RESTART(su)) { + ncs_db_link_list_delink(&su->siq, &siq->su_dll_node); + /* delete the buffered msg */ + avnd_su_siq_rec_del(avnd_cb, su, siq); + rc = avnd_di_susi_resp_send(cb, su, + m_AVND_SU_IS_ALL_SI(su) ? nullptr : si); + if (NCSCC_RC_SUCCESS != rc) goto done; + } + if (si && (cb->term_state == AVND_TERM_STATE_OPENSAF_SHUTDOWN_INITIATED)) { (void)avnd_evt_last_step_term_evh(cb, nullptr); } else if (si && @@ -1683,16 +1702,23 @@ static uint32_t pi_su_instantiating_to_instantiated(AVND_SU *su) { /* reset the su failed flag & set the oper state to enabled */ m_AVND_SU_OPER_STATE_SET(su, SA_AMF_OPERATIONAL_ENABLED); TRACE("Setting the Oper state to Enabled"); - /* - * reassign all the sis... - * it's possible that the si was never assigned. send su-oper - * enable msg instead. - */ - if (su->si_list.n_nodes) - rc = avnd_su_si_reassign(avnd_cb, su); - else { - rc = avnd_di_oper_send(avnd_cb, su, 0); - reset_suRestart_flag(su); + + AVND_SU_SIQ_REC *siq = 0; + siq = reinterpret_cast<AVND_SU_SIQ_REC *>(m_NCS_DBLIST_FIND_LAST(&su->siq)); + if (siq && (siq->info.msg_act == AVSV_SUSI_ACT_MOD)) { + rc = avnd_su_siq_prc(avnd_cb, su); + } else { + /* + * reassign all the sis... + * it's possible that the si was never assigned. send su-oper + * enable msg instead. + */ + if (su->si_list.n_nodes) + rc = avnd_su_si_reassign(avnd_cb, su); + else { + rc = avnd_di_oper_send(avnd_cb, su, 0); + reset_suRestart_flag(su); + } } su->admin_op_Id = static_cast<SaAmfAdminOperationIdT>(0); } else { -- 2.17.1 _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel