Hi Canh,

Some how we were not able to open your attachment , so  my self written

a multi threaded test case ( attached `thread_LogInitializeFinalize.c` ) and reviewed/tested it is working fine.

ACK  from me with following :

- Please add such as attached multi threaded test case to logtest, before pushing

- add # before ticket number in commit message  #1396

-AVM


On 6/14/2016 2:47 PM, Canh Truong wrote:
Hi Mahesh,

I have created new test case for multiple threads. Please help check new
patch in attachment.

Thanks,
Canh.

-----Original Message-----
From: A V Mahesh [mailto:mahesh.va...@oracle.com]
Sent: Tuesday, June 14, 2016 11:03 AM
To: Canh Van Truong; vu.m.ngu...@dektech.com.au; lennart.l...@ericsson.com
Cc: opensaf-devel@lists.sourceforge.net
Subject: Re: [PATCH 1 of 1] log: fix issue with priority of messages adding
to mailbox in the server[1396]

Hi Canh Van Truong,

I hope this patch will work for multiple threads doing
saLogInitialize() , saLogStreamOpen_2()  and saLogFinalize() concurrently in
a single process and reaches lga_use_count = 0 , againg restarting
saLogInitialize() , saLogStreamOpen_2()  and
saLogFinalize()
without process exist.

If so let us have a  test case like for multiple threads doing
saLogInitialize() , saLogStreamOpen_2()  and saLogFinalize() concurrently

-AVM


On 6/13/2016 12:37 PM, Canh Van Truong wrote:
   osaf/libs/agents/saf/lga/lga_api.c  |   3 ++-
   osaf/libs/agents/saf/lga/lga_util.c |  21 ++++++++++++---------
   tests/logsv/logtest.h               |   1 +
   tests/logsv/tet_saLogStreamOpen_2.c |  29 +++++++++++++++++++++++++++++
   4 files changed, 44 insertions(+), 10 deletions(-)


Sometimes, Log service can handle LGSV_INITIALIZE_REQ before handle
LGSV_LGS_EVT_LGA_DOWN, although LGSV_LGS_EVT_LGA_DOWN was sent first
whenever
finalize() is call for last client. Because lgs can not distinguish
MDS address between new connection (initializing new client) and old
connection (finalizing last client before). This patch fixes to keep
MDS connection when last client finalized, and re-use it when next
initialize() called.
diff --git a/osaf/libs/agents/saf/lga/lga_api.c
b/osaf/libs/agents/saf/lga/lga_api.c
--- a/osaf/libs/agents/saf/lga/lga_api.c
+++ b/osaf/libs/agents/saf/lga/lga_api.c
@@ -41,7 +41,8 @@
   /* The main controle block */
   lga_cb_t lga_cb = {
        .cb_lock = PTHREAD_MUTEX_INITIALIZER,
-       .lgs_state = LGS_START
+       .lgs_state = LGS_START,
+       .mds_hdl = 0
   };
static bool is_well_know_stream(const char* dn) 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
@@ -308,21 +308,17 @@ unsigned int lga_startup(lga_cb_t *cb)
        osaf_mutex_lock_ordie(&lga_lock);
TRACE_ENTER2("lga_use_count: %u", lga_use_count);
-       if (lga_use_count > 0) {
-               /* Already created, just increment the use_count */
-               lga_use_count++;
-               goto done;
-       } else {
+
+       if (cb->mds_hdl == 0) {
                if ((rc = ncs_agents_startup()) != NCSCC_RC_SUCCESS) {
                        TRACE("ncs_agents_startup FAILED");
                        goto done;
                }
if ((rc = lga_create()) != NCSCC_RC_SUCCESS) {
+                       cb->mds_hdl = 0;
                        ncs_agents_shutdown();
                        goto done;
-               } else {
-                       lga_use_count = 1;
                }
/* Agent has successfully been started including
communication @@
-331,6 +327,9 @@ unsigned int lga_startup(lga_cb_t *cb)
                set_lga_state(LGA_NORMAL);
        }
+ /* Increase the use_count */
+       lga_use_count++;
+
    done:
        osaf_mutex_unlock_ordie(&lga_lock);
@@ -361,8 +360,12 @@ unsigned int lga_shutdown_after_last_cli
                /* Users still exist, just decrement the use count */
                lga_use_count--;
        } else if (lga_use_count == 1) {
-               lga_destroy();
-               rc = ncs_agents_shutdown();
+               /*
+                * Disable MDS_UNINSTALL and ncs agent shutdown to keep MDS
connection.
+                * Fix ticket 1396. Msg NCSMDS_DOWN and Initialize are out
of order in Mbx.
+                */
+               /* lga_destroy(); */
+               /* rc = ncs_agents_shutdown(); */
                lga_use_count = 0;
        }
diff --git a/tests/logsv/logtest.h b/tests/logsv/logtest.h
--- a/tests/logsv/logtest.h
+++ b/tests/logsv/logtest.h
@@ -27,6 +27,7 @@
   #include <utest.h>
   #include <util.h>
   #include <sys/wait.h>
+#include <unistd.h>
#include <osaf_time.h>
   #include <logtrace.h>
diff --git a/tests/logsv/tet_saLogStreamOpen_2.c
b/tests/logsv/tet_saLogStreamOpen_2.c
--- a/tests/logsv/tet_saLogStreamOpen_2.c
+++ b/tests/logsv/tet_saLogStreamOpen_2.c
@@ -704,6 +704,34 @@ done:
        }
   }
+/*
+ * Ticket 1396
+ * Verify that saLogInitialize() then saLogFinalize() multiple time
+OK  */ void saLogMultipleInitialize(void) {
+        SaLogStreamHandleT logStreamHandle1;
+        int count = 100;
+        SaAisErrorT rc = SA_AIS_OK;
+
+        while (count--) {
+                rc = saLogInitialize(&logHandle, &logCallbacks,
&logVersion);
+                if (rc != SA_AIS_OK)
+                  break;
+
+                rc = saLogStreamOpen_2(logHandle, &app1StreamName,
&appStream1LogFileCreateAttributes,
+                                       SA_LOG_STREAM_CREATE,
SA_TIME_ONE_SECOND, &logStreamHandle1);
+                safassert(rc, SA_AIS_OK);
+
+                rc = saLogFinalize(logHandle);
+                if (rc != SA_AIS_OK)
+                  break;
+
+        }
+        test_validate(rc, SA_AIS_OK);
+
+}
+
   extern void saLogStreamOpenAsync_2_01(void);
   extern void saLogStreamOpenCallbackT_01(void);
   extern void saLogWriteLog_01(void);
@@ -790,5 +818,6 @@ extern void saLogStreamClose_01(void);
       test_case_add(2, verFixLogRec_Max_Err, "saLogStreamOpen_2 with
maxLogRecordSize > MAX_RECSIZE, ERR");
       test_case_add(2, verFixLogRec_Min_Err, "saLogStreamOpen_2 with
maxLogRecordSize < 150, ERR");
       test_case_add(2, saLogStreamOpen_2_50, "saLogStreamOpen_2 with
stream number out of the limitation, ERR");
+    test_case_add(2, saLogMultipleInitialize, "saLogInitialize() then
+ saLogFinalize() multiple time. keep MDS connection, OK");
   }

#include <saAis.h>
#include <saLog.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>

#define NTHREADS 99
#define N 1
#define MEGEXTRA 1

pthread_attr_t attr;

pthread_mutex_t create_mutex;
pthread_cond_t create_cond;


SaVersionT logVersion = {'A', 0x02, 0x01};
//SaLogHandleT logHandle;
//SaLogStreamHandleT logStreamHandle;
//SaLogCallbacksT logCallbacks = {NULL, NULL, NULL};
//SaSelectionObjectT selectionObject;
SaNameT systemStreamName =
{
        .value = SA_LOG_STREAM_SYSTEM,
        .length = sizeof(SA_LOG_STREAM_SYSTEM)
};

static void dummyCallback(
    SaNtfSubscriptionIdT subscriptionId,
    const SaNtfNotificationsT *notification) {
        return;
}

static SaNtfCallbacksT dummyCallbacks = {
    dummyCallback,
    NULL
};


void log_loop(unsigned int thread_number) {

        SaAisErrorT result;
        SaLogHandleT logHandle;
        SaLogStreamHandleT logStreamHandle;
        fprintf(stderr, "I am in thread_number : %d.\n", thread_number);
        result = saLogInitialize(&logHandle, NULL, &logVersion);
        if(result != SA_AIS_OK) {
                fprintf(stderr, "saLogInitialize failed with code %d.\n", 
result);
        } else {

        result = saLogStreamOpen_2(logHandle, &systemStreamName, NULL, 0, 
SA_TIME_ONE_SECOND, &logStreamHandle);

        if(result != SA_AIS_OK) {
                fprintf(stderr, "saLogStreamOpen_2 failed with code %d.\n", 
result);
        } else {
                usleep(1000);
                result = saLogStreamClose(logStreamHandle);
                if(result != SA_AIS_OK) {
                        fprintf(stderr, "saLogStreamClose failed with code 
%d.\n", result);
                }
        }

        result = saLogFinalize(logHandle);
        if(result != SA_AIS_OK) {
                fprintf(stderr, "saLogFinalize failed with code %d.\n", result);
        }

        }
}

void* log_thread(void* nump) {
        log_loop(*(unsigned int*)nump);
        pthread_exit(NULL);
}

int main(int argc, char** argv) {
        int           result;
        pthread_t     thread[100];
        ///////////////////////////////////////////////////////
        size_t stacksize;
        pthread_attr_init(&attr);
        pthread_attr_getstacksize (&attr, &stacksize);
        //      printf("Default stack size = %li\n", stacksize);
        stacksize = sizeof(double)*N*N+MEGEXTRA;
//      printf("Amount of stack needed per thread = %li\n",stacksize);
//      pthread_attr_setstacksize (&attr, stacksize);
        printf("Creating threads with stack size = %li bytes\n",stacksize);
        
///////////////////////////////////////////////////////////////////////////////

        pthread_mutex_init(&create_mutex,NULL);
        pthread_cond_init(&create_cond,NULL);

        {

                unsigned int number;
                for(number = 1; number < NTHREADS; number++) {
                        unsigned int* nump = malloc(sizeof(unsigned int));
                        *nump = number;
                        result = pthread_create(&thread[number-1], NULL, 
log_thread, nump);
                        if(result != 0) {
                                fprintf(stderr, "pthread_create failed with 
code %d.\n", result);
                        }

                        usleep(10);
                }
                fprintf(stderr,"Waiting for all the threads to complete \n");
                for(number = 1; number < NTHREADS; number++)
                        (void) pthread_join(thread[number-1],NULL);
        }


        pthread_mutex_destroy(&create_mutex);
        pthread_cond_destroy(&create_cond);

        return result;
}
------------------------------------------------------------------------------
Attend Shape: An AT&T Tech Expo July 15-16. Meet us at AT&T Park in San
Francisco, CA to explore cutting-edge tech and listen to tech luminaries
present their vision of the future. This family event has something for
everyone, including kids. Get more information and register today.
http://sdm.link/attshape
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to