Ntfd will not send response to a client when client already down.
This will avoid timeout when ntfd send via mds.
---
src/ntf/ntfd/NtfAdmin.cc | 61 ++++++++++++++++++++++++++++++++++++++++++++++++
src/ntf/ntfd/NtfAdmin.h | 1 +
src/ntf/ntfd/ntfs_cb.h | 6 +++++
src/ntf/ntfd/ntfs_com.c | 4 ++++
src/ntf/ntfd/ntfs_com.h | 1 +
src/ntf/ntfd/ntfs_evt.c | 1 +
src/ntf/ntfd/ntfs_mds.c | 2 +-
7 files changed, 75 insertions(+), 1 deletion(-)
diff --git a/src/ntf/ntfd/NtfAdmin.cc b/src/ntf/ntfd/NtfAdmin.cc
index 8bbee69..3a0e9f6 100644
--- a/src/ntf/ntfd/NtfAdmin.cc
+++ b/src/ntf/ntfd/NtfAdmin.cc
@@ -555,6 +555,28 @@ void NtfAdmin::SearchAndSetClientsDownFlag(MDS_DEST
mds_dest) {
client->SetClientDownFlag();
}
}
+
+ CLIENT_DOWN_LIST *client_down_rec = NULL;
+ if ((client_down_rec = reinterpret_cast<CLIENT_DOWN_LIST *>(
+ malloc(sizeof(CLIENT_DOWN_LIST)))) == NULL) {
+ LOG_ER("memory allocation for the CLIENT_DOWN_LIST failed");
+ return;
+ }
+ memset(client_down_rec, 0, sizeof(CLIENT_DOWN_LIST));
+ client_down_rec->mds_dest = mds_dest;
+ client_down_rec->next = NULL;
+
+ if (ntfs_cb->client_down_list_head == NULL) {
+ ntfs_cb->client_down_list_head = client_down_rec;
+ } else {
+ CLIENT_DOWN_LIST *p = ntfs_cb->client_down_list_head;
+ while (p->next != NULL) {
+ p = p->next;
+ }
+ p->next = client_down_rec;
+ }
+ TRACE_1("MDS dest added: %" PRIx64, client_down_rec->mds_dest);
+
osaf_mutex_unlock_ordie(&client_map_mutex);
TRACE_LEAVE();
}
@@ -1096,6 +1118,41 @@ bool NtfAdmin::is_stale_client(unsigned int client_id) {
return false;
}
+/**
+ * @brief Checks client added to CLIENT_DOWN_LIST.
+ * Remove client out of list if existed.
+ * @param mds_dest
+ * @return true/false.
+ */
+bool NtfAdmin::checkAddedAndRemove(MDS_DEST mds_dest) {
+ bool found = false;
+ CLIENT_DOWN_LIST *client_down_rec = ntfs_cb->client_down_list_head;
+ CLIENT_DOWN_LIST *prev = NULL;
+ TRACE_ENTER();
+ while (client_down_rec != NULL) {
+ if (mds_dest == client_down_rec->mds_dest) {
+ if (client_down_rec == ntfs_cb->client_down_list_head) {
+ if (client_down_rec->next == NULL) {
+ ntfs_cb->client_down_list_head = NULL;
+ } else {
+ ntfs_cb->client_down_list_head = client_down_rec->next;
+ }
+ } else if (prev) {
+ prev->next = client_down_rec->next;
+ }
+ TRACE("MDS dest %" PRIx64 " already delete", client_down_rec->mds_dest);
+ free(client_down_rec);
+ client_down_rec = NULL;
+ found = true;
+ break;
+ }
+ prev = client_down_rec;
+ client_down_rec = client_down_rec->next;
+ }
+ TRACE_LEAVE();
+ return found;
+}
+
// C wrapper funcions start here
/**
@@ -1300,6 +1357,10 @@ uint32_t
send_clm_node_status_change(SaClmClusterChangesT cluster_change,
cluster_change, node_id));
}
+bool checkAddedAndRemove(MDS_DEST mds_dest) {
+ return (NtfAdmin::theNtfAdmin->checkAddedAndRemove(mds_dest));
+}
+
/**
* @brief Checks CLM membership status of a client.
* A0101 clients are always CLM member.
diff --git a/src/ntf/ntfd/NtfAdmin.h b/src/ntf/ntfd/NtfAdmin.h
index 4808ca9..d0c5528 100644
--- a/src/ntf/ntfd/NtfAdmin.h
+++ b/src/ntf/ntfd/NtfAdmin.h
@@ -109,6 +109,7 @@ class NtfAdmin {
uint32_t send_cluster_membership_msg_to_clients(
SaClmClusterChangesT cluster_change, NODE_ID node_id);
bool is_stale_client(unsigned int clientId);
+ bool checkAddedAndRemove(MDS_DEST mds_dest);
private:
void processNotification(unsigned int clientId,
diff --git a/src/ntf/ntfd/ntfs_cb.h b/src/ntf/ntfd/ntfs_cb.h
index 96eedc1..e09f8fb 100644
--- a/src/ntf/ntfd/ntfs_cb.h
+++ b/src/ntf/ntfd/ntfs_cb.h
@@ -38,6 +38,11 @@ typedef struct {
MDS_DEST mds_dest;
} ntf_client_t;
+typedef struct client_down_list {
+ MDS_DEST mds_dest;
+ struct client_down_list *next;
+} CLIENT_DOWN_LIST;
+
typedef struct ntfs_cb {
SYSF_MBX mbx; /* NTFS's mailbox */
MDS_HDL mds_hdl; /* PWE Handle for interacting with NTFAs */
@@ -71,6 +76,7 @@ typedef struct ntfs_cb {
NCS_SEL_OBJ usr2_sel_obj; /* Selection object for CLM initialization.*/
uint16_t peer_mbcsv_version; /*Remeber peer NTFS MBCSV version.*/
bool clm_initialized; // For CLM init status;
+ CLIENT_DOWN_LIST *client_down_list_head; /* client down reccords */
} ntfs_cb_t;
extern uint32_t ntfs_cb_init(ntfs_cb_t *);
diff --git a/src/ntf/ntfd/ntfs_com.c b/src/ntf/ntfd/ntfs_com.c
index 35435bb..ee282dc 100644
--- a/src/ntf/ntfd/ntfs_com.c
+++ b/src/ntf/ntfd/ntfs_com.c
@@ -44,6 +44,10 @@ void client_added_res_lib(SaAisErrorT error, unsigned int
clientId,
ntfsv_msg_t msg;
ntfsv_ckpt_msg_t ckpt;
TRACE_ENTER2("clientId: %u, rv: %u", clientId, error);
+ // Not respond when client already down
+ if (checkAddedAndRemove(mdsDest))
+ return;
+
msg.type = NTFSV_NTFA_API_RESP_MSG;
msg.info.api_resp_info.type = NTFSV_INITIALIZE_RSP;
msg.info.api_resp_info.rc = error;
diff --git a/src/ntf/ntfd/ntfs_com.h b/src/ntf/ntfd/ntfs_com.h
index b9e37da..a570d95 100644
--- a/src/ntf/ntfd/ntfs_com.h
+++ b/src/ntf/ntfd/ntfs_com.h
@@ -204,6 +204,7 @@ uint32_t count_member_nodes();
bool is_client_clm_member(NODE_ID node_id, SaVersionT *client_ver);
bool is_clm_init();
bool is_stale_client(unsigned int clientId);
+bool checkAddedAndRemove(MDS_DEST mds_dest);
#ifdef __cplusplus
}
diff --git a/src/ntf/ntfd/ntfs_evt.c b/src/ntf/ntfd/ntfs_evt.c
index 19b2f60..136302e 100644
--- a/src/ntf/ntfd/ntfs_evt.c
+++ b/src/ntf/ntfd/ntfs_evt.c
@@ -110,6 +110,7 @@ static uint32_t proc_ntfa_updn_mds_msg(ntfsv_ntfs_evt_t
*evt)
} else {
clientRemoveMDS(evt->fr_dest);
}
+ checkAddedAndRemove(evt->fr_dest);
break;
default:
TRACE("Unknown evt type!!!");
diff --git a/src/ntf/ntfd/ntfs_mds.c b/src/ntf/ntfd/ntfs_mds.c
index 5f40c6e..3d2d9f0 100644
--- a/src/ntf/ntfd/ntfs_mds.c
+++ b/src/ntf/ntfd/ntfs_mds.c
@@ -953,7 +953,7 @@ static uint32_t mds_svc_event(struct ncsmds_callback_info
*info)
/* Push the event and we are done */
if (m_NCS_IPC_SEND(&ntfs_cb->mbx, evt,
- NCS_IPC_PRIORITY_HIGH) !=
+ NCS_IPC_PRIORITY_NORMAL) !=
NCSCC_RC_SUCCESS) {
TRACE("ipc send failed");
ntfs_evt_destroy(evt);
--
2.7.4
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel