Hi Thang,

The patch looks ok, but I'm thinking of not introducing mds_node_down_list.

In SAI-AIS-CLM-B.04.01:

"The term unconfigured node is used in this document to designate an execution environment that is not configured to host a CLM node."

May we add a check if a node is unconfigured because it's not in ee_lookup, to distinguish with if a node is down?

Thanks

Minh

On 1/2/19 2:34 pm, Tran Thuan wrote:
Hi Thang,

ACK from me for code review, not tested.

Best Regards,
ThuanTr

-----Original Message-----
From: thang.d.nguyen <thang.d.ngu...@dektech.com.au>
Sent: Wednesday, January 30, 2019 1:20 AM
To: gary....@dektech.com.au; minh.c...@dektech.com.au;
thuan.t...@dektech.com.au
Cc: opensaf-devel@lists.sourceforge.net; thang.d.nguyen
<thang.d.ngu...@dektech.com.au>
Subject: [PATCH 1/1] clmd: not send sync respond to client if node down
[#3004]

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