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_cb.h | 1 +
src/amf/amfnd/avnd_di.h | 2 +-
src/amf/amfnd/di.cc | 46 +++++++++++++++++++++++++++++++----------
src/amf/amfnd/main.cc | 1 +
src/amf/amfnd/susm.cc | 1 +
src/amf/amfnd/term.cc | 2 +-
6 files changed, 40 insertions(+), 13 deletions(-)
diff --git a/src/amf/amfnd/avnd_cb.h b/src/amf/amfnd/avnd_cb.h
index a2e521359..8af5e5fe1 100644
--- a/src/amf/amfnd/avnd_cb.h
+++ b/src/amf/amfnd/avnd_cb.h
@@ -120,6 +120,7 @@ typedef struct avnd_cb_tag {
bool reboot_in_progress;
AVND_SU *failed_su;
bool cont_reboot_in_progress;
+ bool is_ncs_su_assigned;
/* the duration that amfnd should tolerate absence of any SC */
SaTimeT scs_absence_max_duration;
diff --git a/src/amf/amfnd/avnd_di.h b/src/amf/amfnd/avnd_di.h
index 9870ad774..f9471aa6b 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);
diff --git a/src/amf/amfnd/di.cc b/src/amf/amfnd/di.cc
index 5bff12104..20e752146 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 = cb->is_ncs_su_assigned;
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 && cb->is_ncs_su_assigned) {
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 (cb->is_ncs_su_assigned) {
// 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 (cb->is_ncs_su_assigned) {
+ 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();
diff --git a/src/amf/amfnd/main.cc b/src/amf/amfnd/main.cc
index e0ede1161..265907917 100644
--- a/src/amf/amfnd/main.cc
+++ b/src/amf/amfnd/main.cc
@@ -317,6 +317,7 @@ AVND_CB *avnd_cb_create() {
cb->oper_state = SA_AMF_OPERATIONAL_ENABLED;
cb->term_state = AVND_TERM_STATE_UP;
cb->led_state = AVND_LED_STATE_RED;
+ cb->is_ncs_su_assigned = false;
/* assign the default timeout values (in nsec) */
cb->msg_resp_intv = AVND_AVD_MSG_RESP_TIME * 1000000;
diff --git a/src/amf/amfnd/susm.cc b/src/amf/amfnd/susm.cc
index 80b35ea8f..67d4f06e6 100644
--- a/src/amf/amfnd/susm.cc
+++ b/src/amf/amfnd/susm.cc
@@ -1153,6 +1153,7 @@ uint32_t avnd_su_si_oper_done(AVND_CB *cb, AVND_SU *su,
AVND_SU_SI_REC *si) {
AVND_SU_SI_ASSIGN_STATE_ASSIGNED);
LOG_NO("Assigned '%s' %s to '%s'", curr_si->name.c_str(),
ha_state[curr_si->curr_state], su->name.c_str());
+ if (su->is_ncs) cb->is_ncs_su_assigned = true;
} else if (m_AVND_SU_SI_CURR_ASSIGN_STATE_IS_REMOVING(curr_si)) {
m_AVND_SU_SI_CURR_ASSIGN_STATE_SET(curr_si,
AVND_SU_SI_ASSIGN_STATE_REMOVED);
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