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