Ack. Thanks Praveen
On 19-May-17 12:48 PM, Minh Chau wrote: > When amfnd-payload responds susi assignment response just before both SC > go down, and that response message does not come to director. Therefore, > the status of that assignment could be seen as "modifying" in IMM. When > SC comes back, active amfd will be waiting for that response forever. > > Patch checks if a susi assignment response is sent but not-ack just before > both SC come down, amfnd-payload will buffer it in a way as a susi get > assigned during SC absence > --- > src/amf/amfnd/avnd_di.h | 2 +- > src/amf/amfnd/di.cc | 85 > +++++++++++++++++++++++++++++++++++++++---------- > 2 files changed, 70 insertions(+), 17 deletions(-) > > diff --git a/src/amf/amfnd/avnd_di.h b/src/amf/amfnd/avnd_di.h > index 07222eb67..d7ccd68fd 100644 > --- a/src/amf/amfnd/avnd_di.h > +++ b/src/amf/amfnd/avnd_di.h > @@ -79,7 +79,7 @@ uint32_t avnd_di_pg_act_send(struct avnd_cb_tag *, const > std::string &, > AVSV_PG_TRACK_ACT, bool); > uint32_t avnd_di_msg_send(struct avnd_cb_tag *, AVND_MSG *); > void avnd_di_msg_ack_process(struct avnd_cb_tag *, uint32_t); > -void avnd_diq_del(struct avnd_cb_tag *); > +void avnd_diq_rec_check_buffered_msg(struct avnd_cb_tag *); > AVND_DND_MSG_LIST *avnd_diq_rec_add(struct avnd_cb_tag *cb, AVND_MSG *msg); > void avnd_diq_rec_del(struct avnd_cb_tag *cb, AVND_DND_MSG_LIST *rec); > void avnd_diq_rec_send_buffered_msg(struct avnd_cb_tag *cb); > diff --git a/src/amf/amfnd/di.cc b/src/amf/amfnd/di.cc > index e06b9260d..6f0a76cda 100644 > --- a/src/amf/amfnd/di.cc > +++ b/src/amf/amfnd/di.cc > @@ -698,8 +698,8 @@ uint32_t avnd_evt_mds_avd_dn_evh(AVND_CB *cb, AVND_EVT > *evt) { > } > } > } else { > - TRACE("Delete all pending messages to be sent to AMFD"); > - avnd_diq_del(cb); > + TRACE("Delete/Buffer pending messages to be sent to AMFD"); > + avnd_diq_rec_check_buffered_msg(cb); > } > > // check for pending messages FROM director > @@ -1271,9 +1271,15 @@ void avnd_di_msg_ack_process(AVND_CB *cb, uint32_t > mid) { > } > > > /**************************************************************************** > - Name : avnd_diq_del > + Name : avnd_diq_rec_check_buffered_msg > + > + Description : The routine buffers messages that are waiting for ack and > will > + resend to AMFD when AMFD is up. > + All messages are deleted, except following messages to be > + buffered: > + - AVSV_N2D_INFO_SU_SI_ASSIGN_MSG > + - AVSV_N2D_OPERATION_STATE_MSG > > - Description : This routine clears the AvD msg list. > > Arguments : cb - ptr to the AvND control block > > @@ -1281,18 +1287,65 @@ void avnd_di_msg_ack_process(AVND_CB *cb, uint32_t > mid) { > > Notes : None. > > ******************************************************************************/ > -void avnd_diq_del(AVND_CB *cb) { > - AVND_DND_MSG_LIST *rec = 0; > - > - do { > - /* pop the record */ > - m_AVND_DIQ_REC_POP(cb, rec); > - if (!rec) break; > - > - /* delete the record */ > - avnd_diq_rec_del(cb, rec); > - } while (1); > - > +void avnd_diq_rec_check_buffered_msg(AVND_CB *cb) { > + if ((cb->dnd_list.head != nullptr)) { > + AVND_DND_MSG_LIST *rec = 0; > + bool found = true; > + while (found) { > + found = false; > + for (rec = cb->dnd_list.head; rec != nullptr;) { > + osafassert(rec->msg.type == AVND_MSG_AVD); > + m_AVND_DIQ_REC_POP(cb, rec); > + // Assignment response had been sent, but not ack because > + // last controller go down, reset msg_id and will be resent later > + if (rec->msg.info.avd->msg_type == AVSV_N2D_INFO_SU_SI_ASSIGN_MSG) { > + if (rec->msg.info.avd->msg_info.n2d_su_si_assign.msg_id != 0) { > + rec->msg.info.avd->msg_info.n2d_su_si_assign.msg_id = 0; > + found = true; > + LOG_NO( > + "Found not-ack su_si_assign msg for SU:'%s', " > + "SI:'%s', ha_state:'%u', msg_act:'%u', single_csi:'%u', " > + "error:'%u', msg_id:'%u'", > + osaf_extended_name_borrow(&rec->msg.info.avd->msg_info > + .n2d_su_si_assign.su_name), > + osaf_extended_name_borrow(&rec->msg.info.avd->msg_info > + .n2d_su_si_assign.si_name), > + rec->msg.info.avd->msg_info.n2d_su_si_assign.ha_state, > + rec->msg.info.avd->msg_info.n2d_su_si_assign.msg_act, > + rec->msg.info.avd->msg_info.n2d_su_si_assign > + .single_csi, > + rec->msg.info.avd->msg_info.n2d_su_si_assign.error, > + rec->msg.info.avd->msg_info.n2d_su_si_assign.msg_id); > + } > + m_AVND_DIQ_REC_PUSH(cb, rec); > + break; > + } else if (rec->msg.info.avd->msg_type == > + AVSV_N2D_OPERATION_STATE_MSG) { > + if (rec->msg.info.avd->msg_info.n2d_opr_state.msg_id != 0) { > + rec->msg.info.avd->msg_info.n2d_opr_state.msg_id = 0; > + found = true; > + LOG_NO( > + "Found not-ack oper_state msg for SU:'%s', " > + "su_oper_state:'%u', node_oper_state:'%u', recovery:'%u'", > + osaf_extended_name_borrow(&rec->msg.info.avd->msg_info > + .n2d_opr_state.su_name), > + rec->msg.info.avd->msg_info.n2d_opr_state > + .su_oper_state, > + rec->msg.info.avd->msg_info.n2d_opr_state > + .node_oper_state, > + rec->msg.info.avd->msg_info.n2d_opr_state.rec_rcvr > + .raw); > + } > + m_AVND_DIQ_REC_PUSH(cb, rec); > + break; > + } else { > + // delete other messages for now > + avnd_diq_rec_del(cb, rec); > + rec = cb->dnd_list.head; > + } > + } > + } > + } > return; > } > > ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel