Hi Thien,

I have a few questions & comments below:

1) Use tab, not spaces to indent C source.
2) What if client down event comes to NTFS while it is handling the NTFSV_INITIALIZE_REQ msg type? 3) When will a down client be removed from the database client_down_list_head if the client has successfully done initialization ?

Regards, Vu

On 9/24/19 6:43 PM, thien.m.huynh wrote:
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 | 26 ++++++++++++++++++++++++
  src/ntf/ntfd/NtfAdmin.h  |  1 +
  src/ntf/ntfd/ntfs_cb.h   |  9 ++++++++
  src/ntf/ntfd/ntfs_com.h  |  1 +
  src/ntf/ntfd/ntfs_evt.c  | 53 +++++++++++++++++++++++++++++++++++++++++++++++-
  5 files changed, 89 insertions(+), 1 deletion(-)

diff --git a/src/ntf/ntfd/NtfAdmin.cc b/src/ntf/ntfd/NtfAdmin.cc
index 8bbee69..c7754b5 100644
--- a/src/ntf/ntfd/NtfAdmin.cc
+++ b/src/ntf/ntfd/NtfAdmin.cc
@@ -517,6 +517,27 @@ void NtfAdmin::clientRemoveMDS(MDS_DEST mds_dest) {
  }
/**
+ * @brief  Check clients are exists in clientMap
+ * @param  mds_dest
+ * @return true/false.
+ */
+bool NtfAdmin::isClientExisted(MDS_DEST mds_dest) {
+  TRACE_ENTER2("mdsDest: %" PRIx64, mds_dest);
+  bool found = false;
+  auto it = clientMap.begin();
+  while (it != clientMap.end()) {
+    NtfClient *client = it->second;
+    ++it;
+    if (client->getMdsDest() == mds_dest) {
+      found = true;
+      break;
+    }
+  }
+  TRACE_LEAVE();
+  return found;
+}
+
+/**
    * Remove the clients that belong to the ntfa down at standby node.
    *
    * @param mds_dest
@@ -1177,6 +1198,11 @@ void ClientsDownRemoved(MDS_DEST mds_dest) {
    NtfAdmin::theNtfAdmin->ClientsDownRemoved(mds_dest);
  }
+bool isClientExisted(MDS_DEST mds_dest) {
+  osafassert(NtfAdmin::theNtfAdmin != NULL);
+  return (NtfAdmin::theNtfAdmin->isClientExisted(mds_dest));
+}
+
  void SearchAndSetClientsDownFlag(MDS_DEST mds_dest) {
    osafassert(NtfAdmin::theNtfAdmin != NULL);
    NtfAdmin::theNtfAdmin->SearchAndSetClientsDownFlag(mds_dest);
diff --git a/src/ntf/ntfd/NtfAdmin.h b/src/ntf/ntfd/NtfAdmin.h
index 4808ca9..ff4b178 100644
--- a/src/ntf/ntfd/NtfAdmin.h
+++ b/src/ntf/ntfd/NtfAdmin.h
@@ -65,6 +65,7 @@ class NtfAdmin {
    void notificationLoggedConfirmed(SaNtfIdentifierT notificationId);
    void clientRemoved(unsigned int clientId);
    void clientRemoveMDS(MDS_DEST mds_dest);
+  bool isClientExisted(MDS_DEST mds_dest);
    void ClientsDownRemoved(MDS_DEST mds_dest);
    void SearchAndSetClientsDownFlag(MDS_DEST mds_dest);
    void subscriptionRemoved(unsigned int clientId,
diff --git a/src/ntf/ntfd/ntfs_cb.h b/src/ntf/ntfd/ntfs_cb.h
index 96eedc1..3b1d715 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,10 @@ 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 - fix for not respond to
+                             client if client already downs*/
+  bool client_finalized;
  } ntfs_cb_t;
extern uint32_t ntfs_cb_init(ntfs_cb_t *);
diff --git a/src/ntf/ntfd/ntfs_com.h b/src/ntf/ntfd/ntfs_com.h
index b9e37da..884eae5 100644
--- a/src/ntf/ntfd/ntfs_com.h
+++ b/src/ntf/ntfd/ntfs_com.h
@@ -77,6 +77,7 @@ void notificationSentConfirmed(unsigned int clientId,
  void notificationLoggedConfirmed(SaNtfIdentifierT notificationId);
  void clientRemoved(unsigned int clientId);
  void clientRemoveMDS(MDS_DEST mds_dest);
+bool isClientExisted(MDS_DEST mds_dest);
  void ClientsDownRemoved(MDS_DEST mds_dest);
  void SearchAndSetClientsDownFlag(MDS_DEST mds_dest);
  void subscriptionRemoved(unsigned int clientId,
diff --git a/src/ntf/ntfd/ntfs_evt.c b/src/ntf/ntfd/ntfs_evt.c
index 19b2f60..7b44cb2 100644
--- a/src/ntf/ntfd/ntfs_evt.c
+++ b/src/ntf/ntfd/ntfs_evt.c
@@ -108,8 +108,34 @@ static uint32_t proc_ntfa_updn_mds_msg(ntfsv_ntfs_evt_t 
*evt)
                if (ntfs_cb->ha_state == SA_AMF_HA_STANDBY) {
                        ClientsDownRemoved(evt->fr_dest);
                } else {
+            if (ntfs_cb->client_finalized == false &&
+                !isClientExisted(evt->fr_dest)) {
+                CLIENT_DOWN_LIST *client_down_rec = NULL;
+
+                if ((client_down_rec = (CLIENT_DOWN_LIST *)malloc(
+                         sizeof(CLIENT_DOWN_LIST))) == NULL) {
+                    LOG_ER("memory allocation for the CLIENT_DOWN_LIST 
failed");
+                    break;
+                }
+                memset(client_down_rec, 0, sizeof(CLIENT_DOWN_LIST));
+
+                client_down_rec->mds_dest = evt->fr_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);
+            }
+            ntfs_cb->client_finalized = false;
                        clientRemoveMDS(evt->fr_dest);
-               }
+        }
                break;
        default:
                TRACE("Unknown evt type!!!");
@@ -234,6 +260,7 @@ uint32_t ntfs_cb_init(ntfs_cb_t *ntfs_cb)
        ntfs_cb->fully_initialized = false;
        ntfs_cb->clm_hdl = 0;
        ntfs_cb->clm_initialized = false;
+       ntfs_cb->client_finalized = false;
        ntfs_cb->clmSelectionObject = -1;
tmp = (char *)getenv("NTFSV_ENV_CACHE_SIZE");
@@ -271,9 +298,32 @@ static uint32_t proc_initialize_msg(ntfs_cb_t *cb, 
ntfsv_ntfs_evt_t *evt)
        uint32_t rc = NCSCC_RC_SUCCESS;
        SaAisErrorT ais_rc = SA_AIS_OK;
        SaVersionT *version;
+       CLIENT_DOWN_LIST *client_down_rec = ntfs_cb->client_down_list_head;
+       CLIENT_DOWN_LIST *prev = NULL;
TRACE_ENTER2("dest %" PRIx64, evt->fr_dest); + while (client_down_rec != NULL) {
+        if (evt->fr_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;
+            goto done;
+        }
+        prev = client_down_rec;
+        client_down_rec = client_down_rec->next;
+    }
+
        /* Validate the version */
        version = &(evt->info.msg.info.api_info.param.init.version);
        if (!ntf_version_is_valid(version)) {
@@ -314,6 +364,7 @@ static uint32_t proc_finalize_msg(ntfs_cb_t *cb, 
ntfsv_ntfs_evt_t *evt)
        clientRemoved(client_id);
        client_removed_res_lib(SA_AIS_OK, client_id, evt->fr_dest,
                               &evt->mds_ctxt);
+       ntfs_cb->client_finalized = true;
        TRACE_LEAVE();
        return NCSCC_RC_SUCCESS;
  }



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

Reply via email to