lcknd fails health check and restarts

When lcknd sends resource open requests to lckd it keeps them on a
list. If the open times out in lcknd because it cannot talk to lckd,
and the client finalizes or exits, lcknd attempts to clean up these
outstanding requests. But, it gets into an infinite loop traversing
the outstanding request list.

Fully traverse the list.
---
 src/lck/lckd/gld_rsc.c       | 12 ++++++------
 src/lck/lcknd/glnd_api.c     |  2 +-
 src/lck/lcknd/glnd_client.c  | 10 ++++++----
 src/lck/lcknd/glnd_res_req.c |  2 ++
 4 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/src/lck/lckd/gld_rsc.c b/src/lck/lckd/gld_rsc.c
index 7a45cd716..93a450738 100644
--- a/src/lck/lckd/gld_rsc.c
+++ b/src/lck/lckd/gld_rsc.c
@@ -296,6 +296,7 @@ void gld_free_rsc_info(GLSV_GLD_CB *gld_cb, 
GLSV_GLD_RSC_INFO *rsc_info)
 GLSV_GLD_RSC_MAP_INFO *rsc_map_info = NULL;
 SaNameT lck_name;
 SaNameT immObj_name;
+SaAisErrorT rc = SA_AIS_OK;

 TRACE_ENTER();

@@ -322,12 +323,11 @@ void gld_free_rsc_info(GLSV_GLD_CB *gld_cb, 
GLSV_GLD_RSC_INFO *rsc_info)
 memcpy(&immObj_name, &rsc_info->lck_name, sizeof(SaNameT));
 /* delete imm runtime object */
 if (gld_cb->ha_state == SA_AMF_HA_ACTIVE) {
-if (immutil_saImmOiRtObjectDelete(gld_cb->immOiHandle,
-  &immObj_name) != SA_AIS_OK) {
-LOG_ER("Deleting run time object %s FAILED",
-       lck_name.value);
-TRACE_LEAVE();
-return;
+rc = immutil_saImmOiRtObjectDelete(gld_cb->immOiHandle,
+  &immObj_name);
+if (rc != SA_AIS_OK) {
+LOG_ER("Deleting run time object %s FAILED: %i",
+       lck_name.value, rc);
 }
 }
 rsc_map_info = (GLSV_GLD_RSC_MAP_INFO *)ncs_patricia_tree_get(
diff --git a/src/lck/lcknd/glnd_api.c b/src/lck/lcknd/glnd_api.c
index 1801e5e45..55328f9fb 100644
--- a/src/lck/lcknd/glnd_api.c
+++ b/src/lck/lcknd/glnd_api.c
@@ -158,7 +158,7 @@ void glnd_process_mbx(GLND_CB *cb, SYSF_MBX *mbx)
 GLSV_GLND_EVT *evt = NULL;
 TRACE_ENTER();

-while ((evt = (GLSV_GLND_EVT *)m_NCS_IPC_NON_BLK_RECEIVE(mbx, evt))) {
+if ((evt = (GLSV_GLND_EVT *)m_NCS_IPC_NON_BLK_RECEIVE(mbx, evt))) {
 if ((evt->type >= GLSV_GLND_EVT_BASE) &&
     (evt->type < GLSV_GLND_EVT_MAX)) {
 /* process mail box */
diff --git a/src/lck/lcknd/glnd_client.c b/src/lck/lcknd/glnd_client.c
index eead1af2a..906de1408 100644
--- a/src/lck/lcknd/glnd_client.c
+++ b/src/lck/lcknd/glnd_client.c
@@ -283,6 +283,7 @@ uint32_t glnd_client_node_del(GLND_CB *glnd_cb, 
GLND_CLIENT_INFO *client_info)
 {
 GLND_CLIENT_LIST_RESOURCE *res_list, *tmp_res_list;
 GLND_RESOURCE_INFO *res_info;
+GLND_RESOURCE_REQ_LIST *req_list;
 SaLckLockModeT mode;
 bool orphan = false;
 uint32_t rc = NCSCC_RC_SUCCESS;
@@ -335,11 +336,12 @@ uint32_t glnd_client_node_del(GLND_CB *glnd_cb, 
GLND_CLIENT_INFO *client_info)
 }

 /* free up any stale res_requests from this finalized client ... */
-while (glnd_cb->res_req_list != NULL) {
-if (client_info->app_handle_id ==
-    glnd_cb->res_req_list->client_handle_id)
+for (req_list = glnd_cb->res_req_list; req_list; /*empty*/) {
+GLND_RESOURCE_REQ_LIST *tmp_req_list = req_list->next;
+if (client_info->app_handle_id == req_list->client_handle_id)
 glnd_resource_req_node_del(
-    glnd_cb, glnd_cb->res_req_list->res_req_hdl_id);
+    glnd_cb, req_list->res_req_hdl_id);
+req_list = tmp_req_list;
 }

 /* free the memory */
diff --git a/src/lck/lcknd/glnd_res_req.c b/src/lck/lcknd/glnd_res_req.c
index b5dede887..95c84e641 100644
--- a/src/lck/lcknd/glnd_res_req.c
+++ b/src/lck/lcknd/glnd_res_req.c
@@ -149,6 +149,7 @@ void glnd_resource_req_node_del(GLND_CB *glnd_cb, uint32_t 
res_req_hdl)
 GLND_RESOURCE_REQ_LIST *res_req_info;
 res_req_info = (GLND_RESOURCE_REQ_LIST *)ncshm_take_hdl(
     NCS_SERVICE_ID_GLND, res_req_hdl);
+TRACE_ENTER();

 if (res_req_info != NULL) {
 /* delete it from the list and return the pointer */
@@ -169,6 +170,7 @@ void glnd_resource_req_node_del(GLND_CB *glnd_cb, uint32_t 
res_req_hdl)
 /* free the memory */
 m_MMGR_FREE_GLND_RESOURCE_REQ_LIST(res_req_info);
 }
+TRACE_LEAVE();
 return;
 }

--
2.21.1


-----------------------------------------------------------------------------------------------------------------------
Notice: This e-mail together with any attachments may contain information of 
Ribbon Communications Inc. that
is confidential and/or proprietary for the sole use of the intended recipient.  
Any review, disclosure, reliance or
distribution by others or forwarding without express permission is strictly 
prohibited.  If you are not the intended
recipient, please notify the sender immediately and then delete all copies, 
including any attachments.
-----------------------------------------------------------------------------------------------------------------------

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

Reply via email to