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