Hi Praveen,

The problem is not always happen. After #1818 is fixed, it's still happen
sometimes. I cannot reproduce this problem, just have trace log (attached
here: https://sourceforge.net/p/opensaf/tickets/1895/).

The test case in this patch may not reproduce the problem. It  just proves
that we can initialize and finalize many times normally. The finalize  keep
MDS connection and use next new initialize.

Regards,
Canh.


-----Original Message-----
From: praveen malviya [mailto:praveen.malv...@oracle.com] 
Sent: Tuesday, September 13, 2016 2:00 PM
To: Canh Van Truong
Cc: lennart.l...@ericsson.com; opensaf-devel@lists.sourceforge.net
Subject: Re: [PATCH 1 of 1] ntf: fix to keep MDS connection when last client
finalize [#1895]

Hi Canh,

Such a problem was fixed in #1818 (may be in part) and current tests in
tests/ntfsv case does not reproduce it.
Will the test case provided in this patch reproduce the problem if the fix
is not applied?

Thanks,
Praveen
On 01-Sep-16 3:12 PM, Canh Van Truong wrote:
>  osaf/libs/agents/saf/ntfa/ntfa_api.c  |   1 +
>  osaf/libs/agents/saf/ntfa/ntfa_util.c |  19 ++++++++---------
>  tests/ntfsv/tet_saNtfFinalize.c       |  36
++++++++++++++++++++++++++++++++--
>  3 files changed, 43 insertions(+), 13 deletions(-)
>
>
> Currently, when finalizing the last client, ntfa uninstall MDS connection.
> This causes that the NCSMDS_DOWN event will be sent to ntfs. ntfs will 
> remove all clients that relates to this MDS.
> But if we initializes new client immediately after finalizing, ntfs 
> may reviece the message of initialization before message of 
> NCSMDS_DOWN event. This cause new client will be removed without
finalizing and all action will be failed after that.
>
> This patch fixes that ntfa keep MDS connection when last client 
> finalized, and re-use it when next initializing call.
>
> diff --git a/osaf/libs/agents/saf/ntfa/ntfa_api.c 
> b/osaf/libs/agents/saf/ntfa/ntfa_api.c
> --- a/osaf/libs/agents/saf/ntfa/ntfa_api.c
> +++ b/osaf/libs/agents/saf/ntfa/ntfa_api.c
> @@ -35,6 +35,7 @@
>  ntfa_cb_t ntfa_cb = {
>       .cb_lock = PTHREAD_MUTEX_INITIALIZER,
>       .ntfa_ntfsv_state = NTFA_NTFSV_NONE,
> +     .mds_hdl = 0,
>  };
>
>  /* list of subscriptions for this process */ diff --git 
> a/osaf/libs/agents/saf/ntfa/ntfa_util.c 
> b/osaf/libs/agents/saf/ntfa/ntfa_util.c
> --- a/osaf/libs/agents/saf/ntfa/ntfa_util.c
> +++ b/osaf/libs/agents/saf/ntfa/ntfa_util.c
> @@ -25,7 +25,7 @@
>
>  /* Variables used during startup/shutdown only */  static 
> pthread_mutex_t ntfa_lock = PTHREAD_MUTEX_INITIALIZER; -static 
> unsigned int ntfa_use_count;
> +static unsigned int ntfa_use_count = 0;
>
>  /**
>   *
> @@ -604,21 +604,20 @@ unsigned int ntfa_startup(void)
>       pthread_mutex_lock(&ntfa_lock);
>
>       TRACE_ENTER2("ntfa_use_count: %u", ntfa_use_count);
> -     if (ntfa_use_count > 0) {
> -             /* Already created, just increment the use_count */
> -             ntfa_use_count++;
> -             goto done;
> -     } else {
> +     if (ntfa_cb.mds_hdl == 0) {
>               if ((rc = ncs_agents_startup()) != NCSCC_RC_SUCCESS) {
>                       TRACE("ncs_agents_startup FAILED");
>                       goto done;
>               }
>
>               if ((rc = ntfa_create()) != NCSCC_RC_SUCCESS) {
> +                     ntfa_cb.mds_hdl = 0;
>                       ncs_agents_shutdown();
>                       goto done;
>               } else
>                       ntfa_use_count = 1;
> +     } else {
> +             ntfa_use_count++;
>       }
>
>   done:
> @@ -639,14 +638,14 @@ unsigned int ntfa_shutdown(bool forced)
>       TRACE_ENTER2("ntfa_use_count: %u, forced: %u", ntfa_use_count,
forced);
>       pthread_mutex_lock(&ntfa_lock);
>
> -     if ((forced && (ntfa_use_count > 0)) || (ntfa_use_count == 1)) {
> +     if (ntfa_use_count > 0) {
> +             /* Decrement the use count */
> +             ntfa_use_count--;
> +     } else if (forced) {
>               ntfa_destroy();
>               rc = ncs_agents_shutdown();
>               ntfa_use_count = 0;
>               ntfa_cb.ntfa_ntfsv_state = NTFA_NTFSV_NONE;
> -     } else if (ntfa_use_count > 1) {
> -             /* Users still exist, just decrement the use count */
> -             ntfa_use_count--;
>       }
>
>       pthread_mutex_unlock(&ntfa_lock);
> diff --git a/tests/ntfsv/tet_saNtfFinalize.c 
> b/tests/ntfsv/tet_saNtfFinalize.c
> --- a/tests/ntfsv/tet_saNtfFinalize.c
> +++ b/tests/ntfsv/tet_saNtfFinalize.c
> @@ -42,7 +42,7 @@ void saNtfFinalize_03(void)
>      test_validate(rc, SA_AIS_ERR_BAD_HANDLE);  }
>
> -SaAisErrorT subscribe()
> +SaAisErrorT subscribe(SaNtfSubscriptionIdT subscriptionId)
>  {
>      SaAisErrorT ret;
>      SaNtfObjectCreateDeleteNotificationFilterT obcf; @@ -54,7 +54,7 
> @@ SaAisErrorT subscribe()
>      obcf.notificationFilterHeader.notificationClassIds->majorId = 222;
>      obcf.notificationFilterHeader.notificationClassIds->minorId = 222;
>      FilterHandles.objectCreateDeleteFilterHandle =
obcf.notificationFilterHandle;
> -    ret = saNtfNotificationSubscribe(&FilterHandles, 111);
> +    ret = saNtfNotificationSubscribe(&FilterHandles, subscriptionId);
>      return ret;
>  }
>
> @@ -69,7 +69,7 @@ void saNtfFinalize_04()  {
>      SaAisErrorT ret1, ret2;
>      safassert(saNtfInitialize(&ntfHandle, &ntfCallbacks, &ntfVersion),
SA_AIS_OK);
> -    safassert(subscribe(),SA_AIS_OK);
> +    safassert(subscribe(111),SA_AIS_OK);
>      pthread_t thread;
>      pthread_create(&thread, NULL, unsubscribe, (void *) &ret2);
>      usleep(1);
> @@ -144,6 +144,35 @@ void saNtfFinalize_05()
>
>  }
>
> +void saNtfFinalize_06()
> +{
> +    SaAisErrorT ret;
> +    unsigned int count = 100;
> +    for (int i = 0; i < count; i++) {
> +        ret = saNtfInitialize(&ntfHandle, &ntfCallbacks, &ntfVersion);
> +        if (ret != SA_AIS_OK) {
> +            fprintf(stderr, " saNtfInitialize failed rc = %d \n",
(int)ret);
> +            break;
> +        }
> +        ret = subscribe(206);
> +        if (ret != SA_AIS_OK) {
> +            fprintf(stderr, " subscribe failed rc = %d \n", (int)ret);
> +            break;
> +        }
> +        ret = saNtfNotificationUnsubscribe(206);
> +        if (ret != SA_AIS_OK) {
> +            fprintf(stderr, " saNtfNotificationUnsubscribe failed rc = %d
\n", (int)ret);
> +            break;
> +        }
> +        ret = saNtfFinalize(ntfHandle);
> +        if (ret != SA_AIS_OK) {
> +            fprintf(stderr, " saNtfFinalize failed rc = %d \n",
(int)ret);
> +            break;
> +        }
> +    }
> +    test_validate(ret, SA_AIS_OK);
> +}
> +
>  __attribute__ ((constructor)) static void 
> saNtfFinalize_constructor(void)  {
>      test_suite_add(2, "Life cycle, finalize, API 2"); @@ -152,5 
> +181,6 @@ void saNtfFinalize_05()
>      test_case_add(2, saNtfFinalize_03, "saNtfFinalize
SA_AIS_ERR_BAD_HANDLE - handle already returned");
>      test_case_add(2, saNtfFinalize_04, "Finalize and Unsubscribe in
parallel SA_AIS_OK");
>      test_case_add(2, saNtfFinalize_05, "Finalize and 
> saNtfStateChangeNotificationAllocate in parallel SA_AIS_OK");
> +    test_case_add(2, saNtfFinalize_06, "Initialize/Finalize in 
> + multiple times SA_AIS_OK");
>  }
>
>


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

Reply via email to