A delay timer set for 60 seconds for CampaignWrapup activity
during ImmSync to avoid the failure during middleware upgrade
when a roleback element of smf campaign thread returns
SA_AIS_ERR_TRY_AGAIN
---
 src/smf/smfd/SmfCampaignWrapup.cc | 59 +++++++++++++++++++++++++++++----------
 1 file changed, 44 insertions(+), 15 deletions(-)

diff --git a/src/smf/smfd/SmfCampaignWrapup.cc 
b/src/smf/smfd/SmfCampaignWrapup.cc
index 4389ff0..0c46d08 100644
--- a/src/smf/smfd/SmfCampaignWrapup.cc
+++ b/src/smf/smfd/SmfCampaignWrapup.cc
@@ -29,6 +29,7 @@
 #include "smf/smfd/SmfRollback.h"
 #include "smf/smfd/SmfUpgradeAction.h"
 #include "smf/smfd/SmfUtils.h"
+#include "base/time.h"
 
 /* ========================================================================
  *   DEFINITIONS
@@ -213,34 +214,62 @@ bool SmfCampaignWrapup::executeCampComplete() {
   // Campaign wrapup complete actions
   LOG_NO("CAMP: Start campaign complete actions (%zu)",
          m_campCompleteAction.size());
-  SaAisErrorT result;
+  base::Timer adminOpTimer(60000);
+  SaAisErrorT ais_rc = SA_AIS_OK;
+  bool rc = true;
   std::string completeRollbackDn;
   completeRollbackDn = "smfRollbackElement=CampComplete,";
   completeRollbackDn += SmfCampaignThread::instance()->campaign()->getDn();
 
-  if ((result = smfCreateRollbackElement(
-           completeRollbackDn,
-           SmfCampaignThread::instance()->getImmHandle())) != SA_AIS_OK) {
-    LOG_ER(
-        "SmfCampaignWrapup failed to create campaign complete rollback element 
%s, rc=%s",
-        completeRollbackDn.c_str(), saf_error(result));
-    return false;
+  while (adminOpTimer.is_timeout() == false) {
+     ais_rc = smfCreateRollbackElement(completeRollbackDn,
+              SmfCampaignThread::instance()->getImmHandle());
+     if (ais_rc == SA_AIS_ERR_TRY_AGAIN) {
+        base::Sleep(base::kFiveHundredMilliseconds);
+        continue;
+     } else if (ais_rc != SA_AIS_OK) {
+        LOG_WA("%s: SmfCampaignWrapup::executeCampComplete Fail '%s'", 
__FUNCTION__,
+             saf_error(ais_rc));
+        rc = false;
+        break;
+     } else {
+      // Done
+      break;
+    }
+  }
+  if (adminOpTimer.is_timeout() == true && ais_rc != SA_AIS_OK) {
+    LOG_WA("%s: SmfCampaignWrapup::executeCampComplete()  timeout Fail '%s'", 
__FUNCTION__,
+           saf_error(ais_rc));
   }
 
   for (auto& elem : m_campCompleteAction) {
-    if ((result = 
(*elem).execute(SmfCampaignThread::instance()->getImmHandle(),
-                                  &completeRollbackDn)) != SA_AIS_OK) {
-      LOG_ER("SmfCampaignWrapup campCompleteAction %d failed, rc=%s",
-             (*elem).getId(), saf_error(result));
-      return false;
+    base::Timer adminOpTimer(60000);
+    while (adminOpTimer.is_timeout() == false) {
+      ais_rc = (*elem).execute(SmfCampaignThread::instance()->getImmHandle(),
+                                  &completeRollbackDn);
+      if (ais_rc == SA_AIS_ERR_TRY_AGAIN) {
+         base::Sleep(base::kFiveHundredMilliseconds);
+         continue;
+      }else if (ais_rc != SA_AIS_OK) {
+         LOG_WA("%s: SmfCampaignWrapup::executeCampComplete Fail '%s'", 
__FUNCTION__,
+             saf_error(ais_rc));
+         rc = false;
+         break;
+      } else {
+        // Done
+        break;
+      }
+    }
+    if (adminOpTimer.is_timeout() == true && ais_rc != SA_AIS_OK) {
+      LOG_WA("%s: SmfCampaignWrapup::executeCampComplete(): 
m_campCompleteAction timeout Fail '%s'"
+                   , __FUNCTION__, saf_error(ais_rc));
     }
   }
 
   LOG_NO("CAMP: Campaign complete actions completed");
-
   TRACE_LEAVE();
 
-  return true;
+  return rc;
 }
 
 
//------------------------------------------------------------------------------
-- 
1.9.1


------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to