--- 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