---
 src/amf/amfd/cb.h   |  7 +++++++
 src/amf/amfd/clm.cc |  4 ++--
 src/amf/amfd/clm.h  |  4 ++--
 src/amf/amfd/imm.cc | 36 +++++++++++++++++++++++-------------
 src/amf/amfd/imm.h  | 18 +++++++++---------
 src/amf/amfd/ntf.cc |  2 +-
 6 files changed, 44 insertions(+), 27 deletions(-)

diff --git a/src/amf/amfd/cb.h b/src/amf/amfd/cb.h
index 60bb554de..a4863886f 100644
--- a/src/amf/amfd/cb.h
+++ b/src/amf/amfd/cb.h
@@ -232,6 +232,13 @@ typedef struct cl_cb_tag {
   bool all_nodes_synced;
   bool node_sync_window_closed;
 
+  // indicates IMM has just returned TRY_AGAIN. Any jobs that are
+  // 'synchronous' should now be pushed into the job queue, as prior
+  // IMM changes failed. Particularly if the prior failure was
+  // an objection creation. Any updates on this object would place
+  // unnecessary load on IMM.
+  bool imm_try_again_encountered{false};
+
   /*
   A list of those SIs for which SI dep tolerance timer is running.
   This is required because during controller switch-over or fail-over
diff --git a/src/amf/amfd/clm.cc b/src/amf/amfd/clm.cc
index 9d317892a..e113a65f9 100644
--- a/src/amf/amfd/clm.cc
+++ b/src/amf/amfd/clm.cc
@@ -627,7 +627,7 @@ SaAisErrorT avd_start_clm_init_bg(void) {
   return SA_AIS_OK;
 }
 
-AvdJobDequeueResultT ClmTrackStart::exec(const AVD_CL_CB* cb) {
+AvdJobDequeueResultT ClmTrackStart::exec(AVD_CL_CB* cb) {
   AvdJobDequeueResultT res;
   TRACE_ENTER();
 
@@ -648,7 +648,7 @@ AvdJobDequeueResultT ClmTrackStart::exec(const AVD_CL_CB* 
cb) {
   return res;
 }
 
-AvdJobDequeueResultT ClmTrackStop::exec(const AVD_CL_CB* cb) {
+AvdJobDequeueResultT ClmTrackStop::exec(AVD_CL_CB* cb) {
   AvdJobDequeueResultT res;
   TRACE_ENTER();
 
diff --git a/src/amf/amfd/clm.h b/src/amf/amfd/clm.h
index 2bbe320f7..f4399c62e 100644
--- a/src/amf/amfd/clm.h
+++ b/src/amf/amfd/clm.h
@@ -40,14 +40,14 @@ public:
 class ClmTrackStart : public ClmJob {
  public:
   ClmTrackStart() : ClmJob(){};
-  AvdJobDequeueResultT exec(const struct cl_cb_tag *cb);
+  AvdJobDequeueResultT exec(struct cl_cb_tag *cb);
   ~ClmTrackStart() {}
 };
 
 class ClmTrackStop : public ClmJob {
  public:
   ClmTrackStop() : ClmJob(){};
-  AvdJobDequeueResultT exec(const struct cl_cb_tag *cb);
+  AvdJobDequeueResultT exec(struct cl_cb_tag *cb);
   ~ClmTrackStop() {}
 };
 
diff --git a/src/amf/amfd/imm.cc b/src/amf/amfd/imm.cc
index 60a997943..f7a647d24 100644
--- a/src/amf/amfd/imm.cc
+++ b/src/amf/amfd/imm.cc
@@ -158,7 +158,7 @@ bool ImmJob::isRunnable(const AVD_CL_CB *cb) {
   return isImmServiceReady(cb);
 }
 //
-AvdJobDequeueResultT ImmObjCreate::exec(const AVD_CL_CB *cb) {
+AvdJobDequeueResultT ImmObjCreate::exec(AVD_CL_CB *cb) {
   SaAisErrorT rc;
   AvdJobDequeueResultT res;
   const SaImmOiHandleT immOiHandle = cb->immOiHandle;
@@ -171,15 +171,18 @@ AvdJobDequeueResultT ImmObjCreate::exec(const AVD_CL_CB 
*cb) {
     res = JOB_EXECUTED;
     goto done;
   }
+
+  cb->imm_try_again_encountered = false;
+
   rc = saImmOiRtObjectCreate_2(immOiHandle, className_, parent_name,
                                attrValues_);
-
   if ((rc == SA_AIS_OK) || (rc == SA_AIS_ERR_EXIST)) {
     delete Fifo::dequeue();
     res = JOB_EXECUTED;
   } else if (rc == SA_AIS_ERR_TRY_AGAIN) {
     TRACE("TRY-AGAIN");
     res = JOB_ETRYAGAIN;
+    cb->imm_try_again_encountered = true;
   } else if (rc == SA_AIS_ERR_TIMEOUT) {
     TRACE("TIMEOUT");
     res = JOB_ETRYAGAIN;
@@ -228,7 +231,7 @@ ImmObjCreate::~ImmObjCreate() {
 }
 
 //
-AvdJobDequeueResultT ImmObjUpdate::exec(const AVD_CL_CB *cb) {
+AvdJobDequeueResultT ImmObjUpdate::exec(AVD_CL_CB *cb) {
   SaAisErrorT rc;
   AvdJobDequeueResultT res;
   const SaImmOiHandleT immOiHandle = cb->immOiHandle;
@@ -251,14 +254,16 @@ AvdJobDequeueResultT ImmObjUpdate::exec(const AVD_CL_CB 
*cb) {
   attrMod.modAttr.attrValueType = attrValueType_;
   attrMod.modAttr.attrValues = attrValues;
 
-  rc = saImmOiRtObjectUpdate_o3(immOiHandle, dn.c_str(), attrMods);
+  cb->imm_try_again_encountered = false;
 
+  rc = saImmOiRtObjectUpdate_o3(immOiHandle, dn.c_str(), attrMods);
   if ((rc == SA_AIS_OK) || (rc == SA_AIS_ERR_NOT_EXIST)) {
     delete Fifo::dequeue();
     res = JOB_EXECUTED;
   } else if (rc == SA_AIS_ERR_TRY_AGAIN) {
     TRACE("TRY-AGAIN");
     res = JOB_ETRYAGAIN;
+    cb->imm_try_again_encountered = true;
   } else if (rc == SA_AIS_ERR_TIMEOUT) {
     TRACE("TIMEOUT");
     res = JOB_ETRYAGAIN;
@@ -286,7 +291,7 @@ ImmObjUpdate::~ImmObjUpdate() {
 }
 
 //
-AvdJobDequeueResultT ImmObjDelete::exec(const AVD_CL_CB *cb) {
+AvdJobDequeueResultT ImmObjDelete::exec(AVD_CL_CB *cb) {
   SaAisErrorT rc;
   AvdJobDequeueResultT res;
   const SaImmOiHandleT immOiHandle = cb->immOiHandle;
@@ -299,14 +304,17 @@ AvdJobDequeueResultT ImmObjDelete::exec(const AVD_CL_CB 
*cb) {
     res = JOB_EXECUTED;
     goto done;
   }
-  rc = saImmOiRtObjectDelete_o3(immOiHandle, dn.c_str());
 
+  cb->imm_try_again_encountered = false;
+
+  rc = saImmOiRtObjectDelete_o3(immOiHandle, dn.c_str());
   if ((rc == SA_AIS_OK) || (rc == SA_AIS_ERR_NOT_EXIST)) {
     delete Fifo::dequeue();
     res = JOB_EXECUTED;
   } else if (rc == SA_AIS_ERR_TRY_AGAIN) {
     TRACE("TRY-AGAIN");
     res = JOB_ETRYAGAIN;
+    cb->imm_try_again_encountered = true;
   } else if (rc == SA_AIS_ERR_TIMEOUT) {
     TRACE("TIMEOUT");
     res = JOB_ETRYAGAIN;
@@ -327,7 +335,7 @@ done:
 ImmObjDelete::~ImmObjDelete() {}
 
 //
-AvdJobDequeueResultT ImmAdminResponse::exec(const AVD_CL_CB *cb) {
+AvdJobDequeueResultT ImmAdminResponse::exec(AVD_CL_CB *cb) {
   SaAisErrorT rc;
   AvdJobDequeueResultT res;
   const SaImmOiHandleT handle = cb->immOiHandle;
@@ -404,7 +412,7 @@ void ckpt_job_queue_size() {
 }
 
 //
-AvdJobDequeueResultT Fifo::execute(const AVD_CL_CB *cb) {
+AvdJobDequeueResultT Fifo::execute(AVD_CL_CB *cb) {
   Job *ajob;
   AvdJobDequeueResultT ret;
 
@@ -428,7 +436,7 @@ AvdJobDequeueResultT Fifo::execute(const AVD_CL_CB *cb) {
   return ret;
 }
 
-AvdJobDequeueResultT Fifo::executeAll(const AVD_CL_CB *cb, AvdJobTypeT 
job_type) {
+AvdJobDequeueResultT Fifo::executeAll(AVD_CL_CB *cb, AvdJobTypeT job_type) {
 
   Job *ajob, *firstjob;
   AvdJobDequeueResultT ret = JOB_EXECUTED;
@@ -489,7 +497,7 @@ void Fifo::remove(const AVD_CL_CB *cb, AvdJobTypeT 
job_type) {
   TRACE_LEAVE();
 }
 
-AvdJobDequeueResultT Fifo::executeAdminResp(const AVD_CL_CB *cb) {
+AvdJobDequeueResultT Fifo::executeAdminResp(AVD_CL_CB *cb) {
   Job *ajob;
   AvdJobDequeueResultT ret = JOB_EXECUTED;
 
@@ -1751,7 +1759,7 @@ SaAisErrorT avd_saImmOiRtObjectUpdate_sync(
   bool isImmReady = isImmServiceReady(avd_cb);
 
   TRACE_ENTER2("'%s' %s", dn.c_str(), attributeName);
-  if (isImmReady == true) {
+  if (isImmReady == true && avd_cb->imm_try_again_encountered == false) {
     attrMod.modType = modifyType;
     attrMod.modAttr.attrName = attributeName;
     attrMod.modAttr.attrValuesNumber = 1;
@@ -1919,7 +1927,7 @@ void avd_saImmOiRtObjectCreate_sync(const std::string 
&className,
   SaAisErrorT rc = SA_AIS_OK;
   bool isImmReady = isImmServiceReady(avd_cb);
 
-  if (isImmReady == true) {
+  if (isImmReady == true && avd_cb->imm_try_again_encountered == false) {
     const SaNameTWrapper parent_name(parentName);
     rc = saImmOiRtObjectCreate_2(avd_cb->immOiHandle,
         const_cast<SaImmClassNameT>(className.c_str()),
@@ -1975,7 +1983,7 @@ void avd_saImmOiRtObjectDelete_sync(const std::string 
&dn) {
   SaAisErrorT rc = SA_AIS_OK;
   bool isImmReady = isImmServiceReady(avd_cb);
 
-  if (isImmReady == true) {
+  if (isImmReady == true && avd_cb->imm_try_again_encountered == false) {
     rc = saImmOiRtObjectDelete_o3(avd_cb->immOiHandle, dn.c_str());
     if (rc != SA_AIS_OK  && rc != SA_AIS_ERR_NOT_EXIST) {
       LOG_WA("saImmOiRtObjectDelete_o3 of '%s' failed with %u", dn.c_str(), 
rc);
@@ -2175,6 +2183,8 @@ static void *avd_imm_reinit_bg_thread(void *_cb) {
   status = m_NCS_IPC_SEND(&avd_cb->avd_mbx, evt, NCS_IPC_PRIORITY_VERY_HIGH);
   osafassert(status == NCSCC_RC_SUCCESS);
 
+  cb->imm_try_again_encountered = false;
+
   LOG_NO("Finished re-initializing with IMM");
   /* Release mutex taken.*/
   osaf_mutex_unlock_ordie(&imm_reinit_mutex);
diff --git a/src/amf/amfd/imm.h b/src/amf/amfd/imm.h
index 83c56869b..1778d27ee 100644
--- a/src/amf/amfd/imm.h
+++ b/src/amf/amfd/imm.h
@@ -64,7 +64,7 @@ typedef enum {
 // @todo move this into job.h
 class Job {
  public:
-  virtual AvdJobDequeueResultT exec(const AVD_CL_CB *cb) = 0;
+  virtual AvdJobDequeueResultT exec(AVD_CL_CB *cb) = 0;
   virtual ~Job() = 0;
   virtual AvdJobTypeT getJobType() = 0;
   virtual bool isRunnable(const AVD_CL_CB *cb) = 0;
@@ -87,7 +87,7 @@ class ImmObjCreate : public ImmJob {
 
   ImmObjCreate() : ImmJob(){};
   bool immobj_update_required();
-  AvdJobDequeueResultT exec(const AVD_CL_CB *cb);
+  AvdJobDequeueResultT exec(AVD_CL_CB *cb);
 
   ~ImmObjCreate();
 };
@@ -102,7 +102,7 @@ class ImmObjUpdate : public ImmJob {
 
   ImmObjUpdate() : ImmJob(){};
   bool immobj_update_required();
-  AvdJobDequeueResultT exec(const AVD_CL_CB *cb);
+  AvdJobDequeueResultT exec(AVD_CL_CB *cb);
   bool si_get_attr_value();
   bool siass_get_attr_value();
   bool csiass_get_attr_value();
@@ -122,7 +122,7 @@ class ImmObjDelete : public ImmJob {
   bool immobj_update_required();
   bool is_csiass_exist();
   bool is_siass_exist();
-  AvdJobDequeueResultT exec(const AVD_CL_CB *cb);
+  AvdJobDequeueResultT exec(AVD_CL_CB *cb);
 
   ~ImmObjDelete();
 };
@@ -133,7 +133,7 @@ class ImmAdminResponse : public ImmJob {
     this->invocation_ = invocation;
     this->result_ = result;
   }
-  AvdJobDequeueResultT exec(const AVD_CL_CB *cb);
+  AvdJobDequeueResultT exec(AVD_CL_CB *cb);
 
   ~ImmAdminResponse() {}
 
@@ -146,7 +146,7 @@ class ImmAdminResponse : public ImmJob {
 class NtfSend : public Job {
  public:
   NtfSend() : already_sent(false) {}
-  AvdJobDequeueResultT exec(const AVD_CL_CB *cb);
+  AvdJobDequeueResultT exec(AVD_CL_CB *cb);
   AvdJobTypeT getJobType() { return JOB_TYPE_NTF; }
   bool isRunnable(const AVD_CL_CB *cb) { return true;}
   SaNtfNotificationsT myntf;
@@ -164,12 +164,12 @@ class Fifo {
 
   static Job *dequeue();
 
-  static AvdJobDequeueResultT execute(const AVD_CL_CB *cb);
-  static AvdJobDequeueResultT executeAll(const AVD_CL_CB *cb,
+  static AvdJobDequeueResultT execute(AVD_CL_CB *cb);
+  static AvdJobDequeueResultT executeAll(AVD_CL_CB *cb,
       AvdJobTypeT job_type = JOB_TYPE_ANY);
   static void remove(const AVD_CL_CB *cb,
       AvdJobTypeT job_type = JOB_TYPE_ANY);
-  static AvdJobDequeueResultT executeAdminResp(const AVD_CL_CB *cb);
+  static AvdJobDequeueResultT executeAdminResp(AVD_CL_CB *cb);
 
   static void empty();
 
diff --git a/src/amf/amfd/ntf.cc b/src/amf/amfd/ntf.cc
index 500bc7046..b8bed1a8f 100644
--- a/src/amf/amfd/ntf.cc
+++ b/src/amf/amfd/ntf.cc
@@ -797,7 +797,7 @@ SaAisErrorT avd_start_ntf_init_bg(void) {
   return SA_AIS_OK;
 }
 
-AvdJobDequeueResultT NtfSend::exec(const AVD_CL_CB* cb) {
+AvdJobDequeueResultT NtfSend::exec(AVD_CL_CB* cb) {
   AvdJobDequeueResultT res;
   TRACE_ENTER2("Ntf Type:%x, sent status:%u", myntf.notificationType,
                already_sent);
-- 
2.14.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
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to