Clmd will not send sync respond to client if the node that
client resided on down. This will avoid timeout when clmd send via mds.
---
 src/clm/clmd/clms_cb.h   |  3 +++
 src/clm/clmd/clms_evt.cc | 22 +++++++++++++++++-----
 src/clm/clmd/clms_mds.cc |  2 +-
 3 files changed, 21 insertions(+), 6 deletions(-)

diff --git a/src/clm/clmd/clms_cb.h b/src/clm/clmd/clms_cb.h
index 4d7fdc7..637d53a 100644
--- a/src/clm/clmd/clms_cb.h
+++ b/src/clm/clmd/clms_cb.h
@@ -22,6 +22,7 @@
 #include "osaf/config.h"
 #endif
 #include <pthread.h>
+#include <set>
 #include <saImm.h>
 #include <saImmOi.h>
 #include <saPlm.h>
@@ -238,6 +239,8 @@ typedef struct clms_cb_t {
       *node_down_list_head; /*NODE_DOWN record - Fix when active node goes down
                              */
   NODE_DOWN_LIST *node_down_list_tail;
+  // Record node id when receive MDS node down
+  std::set<SaUint32T> mds_node_down_list;
   bool is_impl_set;
   bool nid_started;         /**< true if started by NID */
   NCS_PATRICIA_TREE iplist; /* To temporarily store ipaddress information
diff --git a/src/clm/clmd/clms_evt.cc b/src/clm/clmd/clms_evt.cc
index c2b83c2..5265002 100644
--- a/src/clm/clmd/clms_evt.cc
+++ b/src/clm/clmd/clms_evt.cc
@@ -943,6 +943,8 @@ static uint32_t proc_mds_node_evt(CLMSV_CLMS_EVT *evt) {
     goto done;
   }
 
+  clms_cb->mds_node_down_list.insert(node_id);
+
   if ((clms_cb->ha_state == SA_AMF_HA_ACTIVE) ||
       (clms_cb->ha_state == SA_AMF_HA_QUIESCED)) {
     clms_track_send_node_down(node);
@@ -1531,19 +1533,24 @@ static uint32_t proc_initialize_msg(CLMS_CB *cb, 
CLMSV_CLMS_EVT *evt) {
 
   TRACE_ENTER2("dest %" PRIx64, evt->fr_dest);
 
-  /*Handle the wrap around */
-  if (clms_cb->last_client_id == INT_MAX) clms_cb->last_client_id = 0;
-
-  clms_cb->last_client_id++;
-
   node = clms_node_get_by_id(node_id);
   TRACE("Node id = %d", node_id);
   if (node == nullptr) {
     LOG_IN("Initialize request of client on an unconfigured node: node_id = 
%d",
            node_id);
     ais_rc = SA_AIS_ERR_UNAVAILABLE;
+    std::set<SaUint32T>::iterator it =
+          clms_cb->mds_node_down_list.find(node_id);
+    if (it != clms_cb->mds_node_down_list.end()) {
+      return (uint32_t)ais_rc;
+    }
   }
 
+  /*Handle the wrap around */
+  if (clms_cb->last_client_id == INT_MAX) clms_cb->last_client_id = 0;
+
+  clms_cb->last_client_id++;
+
   if ((client = clms_client_new(evt->fr_dest, clms_cb->last_client_id)) ==
       nullptr) {
     TRACE("Creating a new client failed");
@@ -1564,6 +1571,11 @@ static uint32_t proc_initialize_msg(CLMS_CB *cb, 
CLMSV_CLMS_EVT *evt) {
     return rc;
   }
 
+  std::set<SaUint32T>::iterator it = clms_cb->mds_node_down_list.find(node_id);
+  if (it != clms_cb->mds_node_down_list.end()) {
+    clms_cb->mds_node_down_list.erase(it);
+  }
+
   if (node) {
     if (node->member == false) {
       rc = clms_send_is_member_info(clms_cb, node->node_id, node->member,
diff --git a/src/clm/clmd/clms_mds.cc b/src/clm/clmd/clms_mds.cc
index 58552cc..833d18c 100644
--- a/src/clm/clmd/clms_mds.cc
+++ b/src/clm/clmd/clms_mds.cc
@@ -1097,7 +1097,7 @@ static uint32_t clms_mds_node_event(struct 
ncsmds_callback_info *mds_info) {
     clmsv_evt->info.node_mds_info.node_id = mds_info->info.node_evt.node_id;
     clmsv_evt->info.node_mds_info.nodeup = SA_TRUE;
 
-    rc = m_NCS_IPC_SEND(&clms_cb->mbx, clmsv_evt, NCS_IPC_PRIORITY_HIGH);
+    rc = m_NCS_IPC_SEND(&clms_cb->mbx, clmsv_evt, NCS_IPC_PRIORITY_VERY_HIGH);
     if (rc != NCSCC_RC_SUCCESS) {
       TRACE("IPC send failed %d", rc);
       free(clmsv_evt);
-- 
2.7.4



_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to