In some condition, due to the AMF implementer released
was not synced to the remain SC. So the ERR_EXIST returned
when trying invoking implementer set on the remain SC.

Add some retries on the ERR_EXIST.
---
 src/amf/amfd/role.cc     | 27 ++++++++++++++++++++++++---
 src/clm/clmd/clms_imm.cc | 25 ++++++++++++++++---------
 2 files changed, 40 insertions(+), 12 deletions(-)

diff --git a/src/amf/amfd/role.cc b/src/amf/amfd/role.cc
index 790983e..dc71665 100644
--- a/src/amf/amfd/role.cc
+++ b/src/amf/amfd/role.cc
@@ -49,12 +49,14 @@
 #include "base/osaf_utility.h"
 #include "role.h"
 #include "nid/agent/nid_api.h"
+#include "base/osaf_time.h"
 
 extern pthread_mutex_t imm_reinit_mutex;
 
 static uint32_t avd_role_failover(AVD_CL_CB *cb, SaAmfHAStateT role);
 static uint32_t avd_role_failover_qsd_actv(AVD_CL_CB *cb, SaAmfHAStateT role);
 static uint32_t avd_rde_set_role(SaAmfHAStateT role);
+extern struct ImmutilWrapperProfile immutilWrapperProfile;
 
 /****************************************************************************\
  * Function: avd_role_change
@@ -259,12 +261,31 @@ done:
 \**************************************************************************/
 uint32_t avd_active_role_initialization(AVD_CL_CB *cb, SaAmfHAStateT role) {
   uint32_t status = NCSCC_RC_FAILURE;
+  SaAisErrorT rc = SA_AIS_OK;
 
   TRACE_ENTER();
 
-  if (avd_imm_impl_set() != SA_AIS_OK) {
-    LOG_ER("avd_imm_impl_set FAILED");
-    goto done;
+  struct timespec time = {0, 0};
+  uint32_t no_of_retries = 0;
+  const uint32_t MAX_NO_RETRIES = immutilWrapperProfile.nTries;
+  osaf_millis_to_timespec(immutilWrapperProfile.retryInterval, &time);
+  /*
+   * Some retries in case takeover with consensus
+   * when OI not released/synced yet
+  */
+  while (++no_of_retries < MAX_NO_RETRIES) {
+    rc = avd_imm_impl_set();
+    if (rc != SA_AIS_OK) {
+      if (rc == SA_AIS_ERR_EXIST) {
+        osaf_nanosleep(&time);
+        continue;
+      } else {
+        LOG_ER("avd_imm_impl_set FAILED");
+        goto done;
+      }
+    } else {
+      break;
+    }
   }
 
   if (avd_imm_config_get() != NCSCC_RC_SUCCESS) {
diff --git a/src/clm/clmd/clms_imm.cc b/src/clm/clmd/clms_imm.cc
index 076890e..bfb9441 100644
--- a/src/clm/clmd/clms_imm.cc
+++ b/src/clm/clmd/clms_imm.cc
@@ -516,21 +516,28 @@ SaAisErrorT clms_imm_activate(CLMS_CB *cb) {
         goto done;
       }
 
+      /*
+      * Some retries in case takeover with consensus
+      * when OI not released/synced yet
+      */
       rc = immutil_saImmOiImplementerSet(
           cb->immOiHandle,
           const_cast<SaImmOiImplementerNameT>(IMPLEMENTER_NAME));
-      if (rc == SA_AIS_ERR_TIMEOUT || rc == SA_AIS_ERR_BAD_HANDLE) {
+      if (rc == SA_AIS_ERR_TIMEOUT || rc == SA_AIS_ERR_BAD_HANDLE
+          || rc == SA_AIS_ERR_EXIST) {
         LOG_WA("saImmOiImplementerSet returned %u", (unsigned)rc);
         usleep(sleep_delay_ms * 1000);
         msecs_waited += sleep_delay_ms;
-        saImmOiFinalize(cb->immOiHandle);
-        cb->immOiHandle = 0;
-        cb->imm_sel_obj = -1;
-        cb->is_impl_set = false;
-        if (clms_imm_init(clms_cb) != NCSCC_RC_SUCCESS) {
-          rc = SA_AIS_ERR_LIBRARY;
-          LOG_ER("clms_imm_init FAILED");
-          goto done;
+        if (rc != SA_AIS_ERR_EXIST) {
+          saImmOiFinalize(cb->immOiHandle);
+          cb->immOiHandle = 0;
+          cb->imm_sel_obj = -1;
+          cb->is_impl_set = false;
+          if (clms_imm_init(clms_cb) != NCSCC_RC_SUCCESS) {
+            rc = SA_AIS_ERR_LIBRARY;
+            LOG_ER("clms_imm_init FAILED");
+            goto done;
+          }
         }
         continue;
       }
-- 
2.7.4


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to