When see AMFD UP/NEW_ACTIVE in AMFD down state TRUE, AMFND should
send sync info if any assigned NCS SUs. After msg node_up acked,
resend buffered headless msg for NCS SUs.
---
src/amf/amfnd/avnd_di.h | 3 +-
src/amf/amfnd/di.cc | 70 ++++++++++++++++++++++++++++++++++-------
src/amf/amfnd/term.cc | 2 +-
3 files changed, 62 insertions(+), 13 deletions(-)
diff --git a/src/amf/amfnd/avnd_di.h b/src/amf/amfnd/avnd_di.h
index 9870ad774..c4ba5a22d 100644
--- a/src/amf/amfnd/avnd_di.h
+++ b/src/amf/amfnd/avnd_di.h
@@ -46,7 +46,7 @@ void avnd_di_msg_ack_process(struct avnd_cb_tag *, uint32_t);
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);
+void avnd_diq_rec_send_buffered_msg(struct avnd_cb_tag *cb, bool only_ncs);
uint32_t avnd_diq_rec_send(struct avnd_cb_tag *cb, AVND_DND_MSG_LIST *rec);
uint32_t avnd_di_reg_su_rsp_snd(struct avnd_cb_tag *cb,
const std::string &su_name, uint32_t ret_code);
@@ -56,6 +56,7 @@ uint32_t avnd_di_ack_nack_msg_send(struct avnd_cb_tag *cb,
uint32_t rcv_id,
extern void avnd_di_uns32_upd_send(int class_id, int attr_id,
const std::string &dn, uint32_t value);
extern uint32_t avnd_di_resend_pg_start_track(struct avnd_cb_tag *);
+bool any_assigned_ncs_su(struct avnd_cb_tag *cb);
void avnd_sync_sisu(struct avnd_cb_tag *cb);
void avnd_sync_csicomp(struct avnd_cb_tag *cb);
diff --git a/src/amf/amfnd/di.cc b/src/amf/amfnd/di.cc
index 5bff12104..ae56bfc5c 100644
--- a/src/amf/amfnd/di.cc
+++ b/src/amf/amfnd/di.cc
@@ -543,8 +543,7 @@ void avnd_send_node_up_msg(void) {
msg.type = AVND_MSG_AVD;
msg.info.avd->msg_type = AVSV_N2D_NODE_UP_MSG;
msg.info.avd->msg_info.n2d_node_up.msg_id = ++(cb->snd_msg_id);
- msg.info.avd->msg_info.n2d_node_up.leds_set =
- cb->led_state == AVND_LED_STATE_GREEN ? true : false;
+ msg.info.avd->msg_info.n2d_node_up.leds_set = any_assigned_ncs_su(cb);
osaf_extended_name_alloc(cb->amf_nodeName.c_str(),
&msg.info.avd->msg_info.n2d_node_up.node_name);
msg.info.avd->msg_info.n2d_node_up.node_id = cb->node_info.nodeId;
@@ -652,7 +651,7 @@ uint32_t avnd_evt_mds_avd_up_evh(AVND_CB *cb, AVND_EVT
*evt) {
* node_up in both cases but only sync info is sent for recovery
*/
if (evt->info.mds.i_change == NCSMDS_UP) {
- if (cb->is_avd_down && cb->led_state == AVND_LED_STATE_GREEN) {
+ if (cb->is_avd_down && any_assigned_ncs_su(cb)) {
avnd_sync_sisu(cb);
avnd_sync_csicomp(cb);
}
@@ -665,7 +664,7 @@ uint32_t avnd_evt_mds_avd_up_evh(AVND_CB *cb, AVND_EVT
*evt) {
* only want to send node_up/sync info in case of recovery.
*/
if (evt->info.mds.i_change == NCSMDS_NEW_ACTIVE && cb->is_avd_down) {
- if (cb->led_state == AVND_LED_STATE_GREEN) {
+ if (any_assigned_ncs_su(cb)) {
// node_up, sync sisu, compcsi info to AVND for recovery
avnd_sync_sisu(cb);
avnd_sync_csicomp(cb);
@@ -1376,6 +1375,12 @@ void avnd_di_msg_ack_process(AVND_CB *cb, uint32_t mid) {
// then perform last step clean up
avnd_stop_tmr(cb, &rec->resp_tmr);
avnd_last_step_clean(cb);
+ } else if (rec->msg.info.avd->msg_type == AVSV_N2D_NODE_UP_MSG) {
+ TRACE("msg node_up acked");
+ // Resend buffered headless msg for NCS SUs
+ if (any_assigned_ncs_su(cb)) {
+ avnd_diq_rec_send_buffered_msg(cb, true);
+ }
}
TRACE("remove msg %u from queue", msg_id);
avnd_diq_rec_del(cb, rec);
@@ -1541,15 +1546,17 @@ void avnd_diq_rec_del(AVND_CB *cb, AVND_DND_MSG_LIST
*rec) {
Description : Resend buffered msg
Arguments : cb - ptr to the AvND control block
+ only_ncs - only send msg for NCS SUs
Return Values : None.
Notes : None.
******************************************************************************/
-void avnd_diq_rec_send_buffered_msg(AVND_CB *cb) {
+void avnd_diq_rec_send_buffered_msg(AVND_CB *cb, bool only_ncs) {
TRACE_ENTER();
// Resend msgs from queue because amfnd dropped during headless
// or headless-synchronization
+ std::vector<AVND_DND_MSG_LIST*> tmp_dnd_list;
for (auto iter = cb->dnd_list.begin(); iter != cb->dnd_list.end();) {
auto pending_rec = *iter;
@@ -1564,6 +1571,10 @@ void avnd_diq_rec_send_buffered_msg(AVND_CB *cb) {
// only resend if this SUSI does exist
AVND_SU *su = cb->sudb.find(Amf::to_string(
&pending_rec->msg.info.avd->msg_info.n2d_su_si_assign.su_name));
+ if (only_ncs && su && !su->is_ncs) {
+ ++iter;
+ continue;
+ }
if (su != nullptr && su->si_list.n_nodes > 0) {
pending_rec->msg.info.avd->msg_info.n2d_su_si_assign.msg_id =
++(cb->snd_msg_id);
@@ -1586,12 +1597,18 @@ void avnd_diq_rec_send_buffered_msg(AVND_CB *cb) {
iter = cb->dnd_list.erase(iter);
avnd_msg_content_free(cb, &pending_rec->msg);
delete pending_rec;
+ continue;
}
} else if (pending_rec->msg.info.avd->msg_type ==
AVSV_N2D_OPERATION_STATE_MSG &&
pending_rec->msg.info.avd->msg_info.n2d_opr_state.msg_id == 0) {
+ AVND_SU *su = cb->sudb.find(Amf::to_string(
+ &pending_rec->msg.info.avd->msg_info.n2d_opr_state.su_name));
+ if (only_ncs && su && !su->is_ncs) {
+ ++iter;
+ continue;
+ }
pending_rec->msg.info.avd->msg_info.n2d_opr_state.msg_id =
++(cb->snd_msg_id);
-
LOG_NO(
"Found and resend buffered oper_state msg for SU:'%s', "
"su_oper_state:'%u', node_oper_state:'%u', recovery:'%u'",
@@ -1606,22 +1623,29 @@ void avnd_diq_rec_send_buffered_msg(AVND_CB *cb) {
++iter;
} else if (pending_rec->msg.info.avd->msg_type ==
AVSV_N2D_DATA_REQUEST_MSG &&
pending_rec->msg.info.avd->msg_info.n2d_data_req.msg_id == 0) {
+ AVND_SU *su = cb->sudb.find(Amf::to_string(
+
&pending_rec->msg.info.avd->msg_info.n2d_data_req.param_info.name));
+ if (only_ncs && su && !su->is_ncs) {
+ ++iter;
+ continue;
+ }
pending_rec->msg.info.avd->msg_info.n2d_data_req.msg_id =
++(cb->snd_msg_id);
-
LOG_NO(
"Found and resend buffered Data Req msg for SU:'%s', msg_id:'%u'",
osaf_extended_name_borrow(&pending_rec->msg.info.avd->msg_info
.n2d_data_req.param_info.name),
pending_rec->msg.info.avd->msg_info.n2d_data_req.msg_id);
++iter;
- } else {
- ++iter;
- }
+ } else {
+ ++iter;
+ if (only_ncs) continue;
+ }
+ tmp_dnd_list.push_back(pending_rec);
}
TRACE("retransmit message to amfd");
- for (auto pending_rec : cb->dnd_list) {
+ for (auto pending_rec : tmp_dnd_list) {
avnd_diq_rec_send(cb, pending_rec);
}
TRACE_LEAVE();
@@ -1939,6 +1963,30 @@ void avnd_sync_csicomp(AVND_CB *cb) {
TRACE_LEAVE();
}
+/**
+ * Check NCS SUs assignments
+ * @param cb
+ *
+ * @return true/false
+ */
+bool any_assigned_ncs_su(AVND_CB *cb) {
+ const AVND_SU *su;
+ const AVND_SU_SI_REC *si;
+ for (su = avnd_sudb_rec_get_next(cb->sudb, ""); su != nullptr;
+ su = avnd_sudb_rec_get_next(cb->sudb, su->name)) {
+ if (su->is_ncs == false) continue;
+ for (si = reinterpret_cast<AVND_SU_SI_REC *>(
+ m_NCS_DBLIST_FIND_FIRST(&su->si_list));
+ si != nullptr;
+ si = reinterpret_cast<AVND_SU_SI_REC *>(
+ m_NCS_DBLIST_FIND_NEXT(&si->su_dll_node))) {
+ if (m_AVND_SU_SI_CURR_ASSIGN_STATE_IS_ASSIGNED(si))
+ return true;
+ }
+ }
+ return false;
+}
+
/**
* Send susi state info to amfd when cluster comes back from headless
* @param cb
diff --git a/src/amf/amfnd/term.cc b/src/amf/amfnd/term.cc
index cad5de478..84503238f 100644
--- a/src/amf/amfnd/term.cc
+++ b/src/amf/amfnd/term.cc
@@ -205,7 +205,7 @@ uint32_t avnd_evt_avd_set_leds_evh(AVND_CB *cb, AVND_EVT
*evt) {
cb->amfd_sync_required = false;
if (cb->led_state == AVND_LED_STATE_GREEN) {
// Resend buffered headless msg
- avnd_diq_rec_send_buffered_msg(cb);
+ avnd_diq_rec_send_buffered_msg(cb, false);
goto done;
}
--
2.25.1
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel