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
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to