Hi all,

Just friendly reminder for code review.

Regards, Vu.


>-----Original Message-----
>From: Vu Minh Nguyen [mailto:vu.m.ngu...@dektech.com.au]
>Sent: Wednesday, March 23, 2016 2:16 PM
>To: mathi.naic...@oracle.com; lennart.l...@ericsson.com
>Cc: opensaf-devel@lists.sourceforge.net
>Subject: [devel] [PATCH 1 of 1] log: miss mutex protection for common
resource
>in log agent [#1705]
>
> osaf/libs/agents/saf/lga/lga_state.c |  41
>+++++++++++++++++++++++++++++++----
> osaf/libs/agents/saf/lga/lga_state.h |   1 +
> osaf/libs/agents/saf/lga/lga_util.c  |  30 +++++++++++--------------
> 3 files changed, 50 insertions(+), 22 deletions(-)
>
>
>There was an race condition between client thread and recovery thread
>accessing to common resource `client_list`.
>
>Add mutex protection.
>
>diff --git a/osaf/libs/agents/saf/lga/lga_state.c
>b/osaf/libs/agents/saf/lga/lga_state.c
>--- a/osaf/libs/agents/saf/lga/lga_state.c
>+++ b/osaf/libs/agents/saf/lga/lga_state.c
>@@ -355,8 +355,11 @@ static void *recovery2_thread(void *dumm
>                       /* We have been signaled to exit */
>                       goto done;
>               }
>+
>               /* Recover clients one at a time */
>               rc = recover_one_client(p_client);
>+              if (p_client == NULL) goto done;
>+
>               TRACE("\t Client %d is recovered", p_client->lgs_client_id);
>               if (rc == -1) {
>                       TRACE("%s recover_one_client Fail Deleting cllient
(id
>%d)",
>@@ -593,6 +596,15 @@ int recover_one_client(lga_client_hdl_re
>
>       TRACE_ENTER();
>
>+      if (p_client == NULL) {
>+              /**
>+               * Probably the client_list has been deleted by client
thread
>+               * in context calling saLogFinalize(). So, give up
recovering.
>+               */
>+              rc = -1;
>+              goto done;
>+      }
>+
>       /* This function may be called both in the recovery thread and in
the
>        * client thread. A possible scenario is that the recovery 2 thread
>        * times out and calls this function in recovery mode 2 while there
>@@ -658,13 +670,32 @@ uint32_t delete_one_client(
>       lga_client_hdl_rec_t *rm_node
>       )
> {
>-      TRACE_ENTER2();
>-      uint32_t ncs_rc;
>+      return lga_hdl_rec_del(list_head, rm_node);
>+}
>
>+/**
>+ * Free the memory allocated for one client handle with mutext protection.
>+ *
>+ * @param p_client_hdl
>+ * @return void
>+ */
>+void free_client_hdl(lga_client_hdl_rec_t **p_client_hdl)
>+{
>+      lga_client_hdl_rec_t *client_hdl;
>+
>+      /**
>+       * To prevent race condition b/w client thread and recovery thread
>+       * accessing to common resource `client_list`. [#1705]
>+       */
>       osaf_mutex_lock_ordie(&lga_recov_mutex);
>-      ncs_rc = lga_hdl_rec_del(list_head, rm_node);
>+
>+      client_hdl = *p_client_hdl;
>+      if (client_hdl == NULL) goto done;
>+
>+      free(client_hdl);
>+      client_hdl = NULL;
>+
>+done:
>       osaf_mutex_unlock_ordie(&lga_recov_mutex);
>
>-      TRACE_LEAVE();
>-      return ncs_rc;
> }
>diff --git a/osaf/libs/agents/saf/lga/lga_state.h
>b/osaf/libs/agents/saf/lga/lga_state.h
>--- a/osaf/libs/agents/saf/lga/lga_state.h
>+++ b/osaf/libs/agents/saf/lga/lga_state.h
>@@ -32,6 +32,7 @@ uint32_t delete_one_client(
>       lga_client_hdl_rec_t **list_head,
>       lga_client_hdl_rec_t *rm_node
>       );
>+void free_client_hdl(lga_client_hdl_rec_t **p_client_hdl);
>
> #ifdef        __cplusplus
> }
>diff --git a/osaf/libs/agents/saf/lga/lga_util.c
>b/osaf/libs/agents/saf/lga/lga_util.c
>--- a/osaf/libs/agents/saf/lga/lga_util.c
>+++ b/osaf/libs/agents/saf/lga/lga_util.c
>@@ -19,6 +19,7 @@
> #include <syslog.h>
> #include "lga.h"
> #include "osaf_poll.h"
>+#include "lga_state.h"
>
> /* Variables used during startup/shutdown only */
> static pthread_mutex_t lga_lock = PTHREAD_MUTEX_INITIALIZER;
>@@ -449,11 +450,9 @@ void lga_hdl_list_del(lga_client_hdl_rec
>       /** clean up the channel records for this lga-client
>          **/
>               lga_log_stream_hdl_rec_list_del(&client_hdl->stream_list);
>-      /** remove the association with hdl-mngr
>-         **/
>-              free(client_hdl);
>-              client_hdl = 0;
>+              free_client_hdl(&client_hdl);
>       }
>+
>       TRACE_LEAVE();
> }
>
>@@ -536,38 +535,35 @@ uint32_t lga_hdl_rec_del(lga_client_hdl_
>       if (list_iter == rm_node) {
>               *list_head = rm_node->next;
>
>-      /** detach & release the IPC
>-         **/
>+              /* detach & release the IPC */
>               m_NCS_IPC_DETACH(&rm_node->mbx, lga_clear_mbx, NULL);
>               m_NCS_IPC_RELEASE(&rm_node->mbx, NULL);
>
>               ncshm_give_hdl(rm_node->local_hdl);
>               ncshm_destroy_hdl(NCS_SERVICE_ID_LGA, rm_node-
>>local_hdl);
>-      /** Free the channel records off this hdl
>-         **/
>+
>+              /* Free the channel records off this hdl */
>               lga_log_stream_hdl_rec_list_del(&rm_node->stream_list);
>+              free_client_hdl(&rm_node);
>
>-      /** free the hdl rec
>-         **/
>-              free(rm_node);
>               rc = NCSCC_RC_SUCCESS;
>               goto out;
>-      } else {                /* find the rec */
>+      } else {
>+              /* find the rec */
>               while (NULL != list_iter) {
>                       if (list_iter->next == rm_node) {
>                               list_iter->next = rm_node->next;
>
>-              /** detach & release the IPC */
>+                              /* detach & release the IPC */
>                               m_NCS_IPC_DETACH(&rm_node->mbx,
>lga_clear_mbx, NULL);
>                               m_NCS_IPC_RELEASE(&rm_node->mbx, NULL);
>
>                               ncshm_give_hdl(rm_node->local_hdl);
>                               ncshm_destroy_hdl(NCS_SERVICE_ID_LGA,
>rm_node->local_hdl);
>-              /** Free the channel records off this lga_hdl  */
>+
>+                              /* Free the channel records off this lga_hdl
*/
>                               lga_log_stream_hdl_rec_list_del(&rm_node-
>>stream_list);
>-
>-              /** free the hdl rec */
>-                              free(rm_node);
>+                              free_client_hdl(&rm_node);
>
>                               rc = NCSCC_RC_SUCCESS;
>                               goto out;
>
>---------------------------------------------------------------------------
---
>Transform Data into Opportunity.
>Accelerate data analysis in your applications with
>Intel Data Analytics Acceleration Library.
>Click to learn more.
>http://pubads.g.doubleclick.net/gampad/clk?id=278785351&iu=/4140
>_______________________________________________
>Opensaf-devel mailing list
>Opensaf-devel@lists.sourceforge.net
>https://lists.sourceforge.net/lists/listinfo/opensaf-devel


------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to