Hi Vu, Thanks for your questions and comment. I answers the questions below:
1) I will update the comment. 2) I haven't thought of this case yet. I will test and update later. 3) Client just added to client_down_list_head when client hasn't been initialized and does not exists in database client map. Best Regards, Thien -----Original Message----- From: Nguyen Minh Vu <vu.m.ngu...@dektech.com.au> Sent: Thursday, September 26, 2019 12:28 PM To: thien.m.huynh <thien.m.hu...@dektech.com.au>; minh.c...@dektech.com.au Cc: opensaf-devel@lists.sourceforge.net Subject: Re: [PATCH 1/1] ntfd: Do not send response to client if client down [#3084] 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