osaf/services/saf/ntfsv/ntfimcnd/ntfimcn_imm.c      |  193 ++++++++++++++-----
 osaf/services/saf/ntfsv/ntfimcnd/ntfimcn_notifier.c |   28 ++-
 2 files changed, 160 insertions(+), 61 deletions(-)


Ntfimcn was not handling all the AIS error codes properly with retry loops.
This changeset fixes some occurrences that were discovered during testing, and
thus are needed urgently. A full solution should be implemented in the context
of ticket [#1607].

diff --git a/osaf/services/saf/ntfsv/ntfimcnd/ntfimcn_imm.c 
b/osaf/services/saf/ntfsv/ntfimcnd/ntfimcn_imm.c
--- a/osaf/services/saf/ntfsv/ntfimcnd/ntfimcn_imm.c
+++ b/osaf/services/saf/ntfsv/ntfimcnd/ntfimcn_imm.c
@@ -710,7 +710,7 @@ int ntfimcn_imm_init(ntfimcn_cb_t *cb)
        int msecs_waited;
 
        TRACE_ENTER();
-       
+
        /*
         * Set IMM environment variable for synchronous timeout to 1 sec
         */
@@ -721,62 +721,126 @@ int ntfimcn_imm_init(ntfimcn_cb_t *cb)
         * -------------------------
         */
        msecs_waited = 0;
-       rc = saImmOiInitialize_2(&cb->immOiHandle, &callbacks, &imm_version);
-       while ((rc == SA_AIS_ERR_TRY_AGAIN) && (msecs_waited < 
max_waiting_time_60s)) {
-               usleep(sleep_delay_ms * 1000);
-               msecs_waited += sleep_delay_ms;
-               rc = saImmOiInitialize_2(&cb->immOiHandle, &callbacks, 
&imm_version);
-       }
-       if (rc != SA_AIS_OK) {
-               LOG_ER("%s saImmOiInitialize_2 failed 
%s",__FUNCTION__,saf_error(rc));
-               internal_rc = NTFIMCN_INTERNAL_ERROR;
-               goto done;
-       }
+       for (;;) {
+               if (msecs_waited >= max_waiting_time_60s) {
+                       LOG_ER("%s Timeout when initalizing OI", __FUNCTION__);
+                       internal_rc = NTFIMCN_INTERNAL_ERROR;
+                       goto done;
+               }
+               cb->immOiHandle = 0;
+               rc = saImmOiInitialize_2(&cb->immOiHandle, &callbacks,
+                                        &imm_version);
+               while ((rc == SA_AIS_ERR_TRY_AGAIN || rc == SA_AIS_ERR_TIMEOUT)
+                      && msecs_waited < max_waiting_time_60s) {
+                       if (rc == SA_AIS_ERR_TIMEOUT) {
+                               LOG_WA("%s saImmOiInitialize_2() returned %s",
+                                      __FUNCTION__, saf_error(rc));
+                       }
+                       usleep(sleep_delay_ms * 1000);
+                       msecs_waited += sleep_delay_ms;
+                       if (rc == SA_AIS_ERR_TIMEOUT && cb->immOiHandle != 0) {
+                               while (saImmOiFinalize(cb->immOiHandle) ==
+                                      SA_AIS_ERR_TRY_AGAIN &&
+                                      msecs_waited < max_waiting_time_60s) {
+                                       usleep(sleep_delay_ms * 1000);
+                                       msecs_waited += sleep_delay_ms;
+                               }
+                       }
+                       cb->immOiHandle = 0;
+                       rc = saImmOiInitialize_2(&cb->immOiHandle, &callbacks,
+                                                &imm_version);
+               }
+               if (rc != SA_AIS_OK) {
+                       LOG_ER("%s saImmOiInitialize_2 failed %s", __FUNCTION__,
+                              saf_error(rc));
+                       internal_rc = NTFIMCN_INTERNAL_ERROR;
+                       goto done;
+               }
 
-       /*
-        * Get a selection object for the IMM OI
-        * -------------------------------------
-        */
-       msecs_waited = 0;
-       rc = saImmOiSelectionObjectGet(cb->immOiHandle, 
&cb->immSelectionObject);
-       while ((rc == SA_AIS_ERR_TRY_AGAIN) && (msecs_waited < 
max_waiting_time_60s)) {
-               usleep(sleep_delay_ms * 1000);
-               msecs_waited += sleep_delay_ms;
-               rc = saImmOiSelectionObjectGet(cb->immOiHandle, 
&cb->immSelectionObject);
-       }
-       if (rc != SA_AIS_OK) {
-               LOG_ER("%s saImmOiSelectionObjectGet failed 
%s",__FUNCTION__,saf_error(rc));
-               internal_rc = NTFIMCN_INTERNAL_ERROR;
-               goto done;
-       }
+               /*
+                * Get a selection object for the IMM OI
+                * -------------------------------------
+                */
+               rc = saImmOiSelectionObjectGet(cb->immOiHandle,
+                                              &cb->immSelectionObject);
+               while ((rc == SA_AIS_ERR_TRY_AGAIN || rc == SA_AIS_ERR_TIMEOUT)
+                      && msecs_waited < max_waiting_time_60s) {
+                       if (rc == SA_AIS_ERR_TIMEOUT) {
+                               LOG_WA("%s saImmOiSelectionObjectGet() "
+                                      "returned %s", __FUNCTION__,
+                                      saf_error(rc));
+                       }
+                       usleep(sleep_delay_ms * 1000);
+                       msecs_waited += sleep_delay_ms;
+                       rc = saImmOiSelectionObjectGet(cb->immOiHandle,
+                                                      &cb->immSelectionObject);
+               }
+               if (rc == SA_AIS_ERR_TIMEOUT || rc == SA_AIS_ERR_BAD_HANDLE) {
+                       LOG_WA("%s saImmOiSelectionObjectGet() returned %s",
+                              __FUNCTION__, saf_error(rc));
+                       usleep(sleep_delay_ms * 1000);
+                       msecs_waited += sleep_delay_ms;
+                       while (saImmOiFinalize(cb->immOiHandle) ==
+                              SA_AIS_ERR_TRY_AGAIN &&
+                               msecs_waited < max_waiting_time_60s) {
+                               usleep(sleep_delay_ms * 1000);
+                               msecs_waited += sleep_delay_ms;
+                       }
+                       cb->immOiHandle = 0;
+                       cb->immSelectionObject = -1;
+                       continue;
+               }
+               if (rc != SA_AIS_OK) {
+                       LOG_ER("%s saImmOiSelectionObjectGet failed %s",
+                              __FUNCTION__, saf_error(rc));
+                       internal_rc = NTFIMCN_INTERNAL_ERROR;
+                       goto done;
+               }
 
-       /*
-        * Become the "configuration change" applier
-        * -----------------------------------------
-        */
-       SaImmOiImplementerNameT applier_name = applier_nameA;
-       msecs_waited = 0;
-       rc = saImmOiImplementerSet(cb->immOiHandle, applier_name);
-       while (((rc == SA_AIS_ERR_TRY_AGAIN) ||
-                       (rc == SA_AIS_ERR_EXIST)) &&
-                       (msecs_waited < max_waiting_time_60s)) {
-               usleep(sleep_delay_ms * 1000);
-               msecs_waited += sleep_delay_ms;
-               
-               if (rc == SA_AIS_ERR_EXIST) {
-                       if (strcmp( applier_name, applier_nameA) == 0) {
-                               applier_name = applier_nameB;
-                       } else {
-                               applier_name = applier_nameA;
+               /*
+                * Become the "configuration change" applier
+                * -----------------------------------------
+                */
+               SaImmOiImplementerNameT applier_name = applier_nameA;
+               rc = saImmOiImplementerSet(cb->immOiHandle, applier_name);
+               while ((rc == SA_AIS_ERR_TRY_AGAIN || rc == SA_AIS_ERR_EXIST) &&
+                      msecs_waited < max_waiting_time_60s) {
+                       usleep(sleep_delay_ms * 1000);
+                       msecs_waited += sleep_delay_ms;
+
+                       if (rc == SA_AIS_ERR_EXIST) {
+                               if (strcmp( applier_name, applier_nameA) == 0) {
+                                       applier_name = applier_nameB;
+                               } else {
+                                       applier_name = applier_nameA;
+                               }
                        }
+                       rc = saImmOiImplementerSet(cb->immOiHandle,
+                                                  applier_name);
                }
-               rc = saImmOiImplementerSet(cb->immOiHandle, applier_name);
-       }
-               
-       if (rc != SA_AIS_OK) {
-               LOG_ER("%s Becoming an applier failed 
%s",__FUNCTION__,saf_error(rc));
-               internal_rc = NTFIMCN_INTERNAL_ERROR;
-               goto done;
+               if (rc == SA_AIS_ERR_TIMEOUT || rc == SA_AIS_ERR_BAD_HANDLE) {
+                       LOG_WA("%s saImmOiImplementerSet() returned %s",
+                              __FUNCTION__, saf_error(rc));
+                       usleep(sleep_delay_ms * 1000);
+                       msecs_waited += sleep_delay_ms;
+                       while (saImmOiFinalize(cb->immOiHandle) ==
+                              SA_AIS_ERR_TRY_AGAIN &&
+                               msecs_waited < max_waiting_time_60s) {
+                               usleep(sleep_delay_ms * 1000);
+                               msecs_waited += sleep_delay_ms;
+                       }
+                       cb->immOiHandle = 0;
+                       cb->immSelectionObject = -1;
+                       continue;
+               }
+
+               if (rc != SA_AIS_OK) {
+                       LOG_ER("%s Becoming an applier failed %s", __FUNCTION__,
+                              saf_error(rc));
+                       internal_rc = NTFIMCN_INTERNAL_ERROR;
+                       goto done;
+               }
+               break;
        }
 
        /*
@@ -784,14 +848,31 @@ int ntfimcn_imm_init(ntfimcn_cb_t *cb)
         * -------------------------
         */
        msecs_waited = 0;
+       cb->immOmHandle = 0;
        rc = saImmOmInitialize(&cb->immOmHandle, &omCallbacks, &imm_version);
-       while ((rc == SA_AIS_ERR_TRY_AGAIN) && (msecs_waited < 
max_waiting_time_60s)) {
+       while ((rc == SA_AIS_ERR_TRY_AGAIN || rc == SA_AIS_ERR_TIMEOUT)
+              && msecs_waited < max_waiting_time_60s) {
+               if (rc == SA_AIS_ERR_TIMEOUT) {
+                       LOG_WA("%s saImmOmInitialize() returned %s",
+                              __FUNCTION__, saf_error(rc));
+               }
                usleep(sleep_delay_ms * 1000);
                msecs_waited += sleep_delay_ms;
-               rc = saImmOmInitialize(&cb->immOmHandle, &omCallbacks, 
&imm_version);
+               if (rc == SA_AIS_ERR_TIMEOUT && cb->immOmHandle != 0) {
+                       while (saImmOmFinalize(cb->immOmHandle) ==
+                              SA_AIS_ERR_TRY_AGAIN &&
+                              msecs_waited < max_waiting_time_60s) {
+                               usleep(sleep_delay_ms * 1000);
+                               msecs_waited += sleep_delay_ms;
+                       }
+               }
+               cb->immOmHandle = 0;
+               rc = saImmOmInitialize(&cb->immOmHandle, &omCallbacks,
+                                      &imm_version);
        }
        if (rc != SA_AIS_OK) {
-               LOG_ER("%s saImmOmInitialize failed 
%s",__FUNCTION__,saf_error(rc));
+               LOG_ER("%s saImmOmInitialize failed %s", __FUNCTION__,
+                      saf_error(rc));
                internal_rc = NTFIMCN_INTERNAL_ERROR;
                goto done;
        }
diff --git a/osaf/services/saf/ntfsv/ntfimcnd/ntfimcn_notifier.c 
b/osaf/services/saf/ntfsv/ntfimcnd/ntfimcn_notifier.c
--- a/osaf/services/saf/ntfsv/ntfimcnd/ntfimcn_notifier.c
+++ b/osaf/services/saf/ntfsv/ntfimcnd/ntfimcn_notifier.c
@@ -61,20 +61,38 @@ int ntfimcn_ntf_init(ntfimcn_cb_t *cb)
 {
        SaAisErrorT rc;
        int internal_rc = 0;
-       
+
        TRACE_ENTER();
 
-
        if (cb->haState == SA_AMF_HA_ACTIVE) {
                int msecs_waited = 0;
+               cb->ntf_handle = 0;
                rc = saNtfInitialize(&cb->ntf_handle, NULL, &ntf_version);
-               while ((rc == SA_AIS_ERR_TRY_AGAIN) && (msecs_waited < 
max_init_waiting_time_ms)) {
+               while ((rc == SA_AIS_ERR_TRY_AGAIN ||
+                       rc == SA_AIS_ERR_TIMEOUT) &&
+                      msecs_waited < max_init_waiting_time_ms) {
+                       if (rc == SA_AIS_ERR_TIMEOUT) {
+                               LOG_WA("%s saNtfInitialize( returned %s",
+                                      __FUNCTION__, saf_error(rc));
+                       }
                        usleep(sleep_delay_ms * 1000);
                        msecs_waited += sleep_delay_ms;
-                       rc = saNtfInitialize(&cb->ntf_handle, NULL, 
&ntf_version);
+                       if (rc == SA_AIS_ERR_TIMEOUT && cb->ntf_handle != 0) {
+                               while (saNtfFinalize(cb->ntf_handle) ==
+                                      SA_AIS_ERR_TRY_AGAIN &&
+                                      msecs_waited <
+                                      max_init_waiting_time_ms) {
+                                       usleep(sleep_delay_ms * 1000);
+                                       msecs_waited += sleep_delay_ms;
+                               }
+                       }
+                       cb->ntf_handle = 0;
+                       rc = saNtfInitialize(&cb->ntf_handle, NULL,
+                                            &ntf_version);
                }
                if (rc != SA_AIS_OK) {
-                       LOG_ER("%s NTF API could not be initialized: 
%s",__FUNCTION__,saf_error(rc));
+                       LOG_ER("%s NTF API could not be initialized: %s",
+                              __FUNCTION__, saf_error(rc));
                        internal_rc = (-1);
                        goto done;
                }

------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to