osaf/services/saf/amf/amfd/imm.cc | 22 ++++++++++++++++++++++ osaf/services/saf/amf/amfd/include/imm.h | 2 ++ osaf/services/saf/amf/amfd/role.cc | 5 +++++ 3 files changed, 29 insertions(+), 0 deletions(-)
diff --git a/osaf/services/saf/amf/amfd/imm.cc b/osaf/services/saf/amf/amfd/imm.cc --- a/osaf/services/saf/amf/amfd/imm.cc +++ b/osaf/services/saf/amf/amfd/imm.cc @@ -423,6 +423,28 @@ AvdJobDequeueResultT Fifo::execute(const return ret; } +AvdJobDequeueResultT Fifo::executeAdminResp(const AVD_CL_CB *cb) +{ + Job *ajob; + AvdJobDequeueResultT ret = JOB_EXECUTED; + + TRACE_ENTER(); + + while ((ajob = peek()) != nullptr) { + if (dynamic_cast<ImmAdminResponse *>(ajob) != nullptr) { + ret = ajob->exec(cb); + } else { + ajob = dequeue(); + delete ajob; + ret = JOB_EXECUTED; + } + } + + TRACE_LEAVE2("%d", ret); + + return ret; +} + // void Fifo::empty() { diff --git a/osaf/services/saf/amf/amfd/include/imm.h b/osaf/services/saf/amf/amfd/include/imm.h --- a/osaf/services/saf/amf/amfd/include/imm.h +++ b/osaf/services/saf/amf/amfd/include/imm.h @@ -146,6 +146,8 @@ public: static AvdJobDequeueResultT execute(const AVD_CL_CB *cb); + static AvdJobDequeueResultT executeAdminResp(const AVD_CL_CB *cb); + static void empty(); static uint32_t size(); diff --git a/osaf/services/saf/amf/amfd/role.cc b/osaf/services/saf/amf/amfd/role.cc --- a/osaf/services/saf/amf/amfd/role.cc +++ b/osaf/services/saf/amf/amfd/role.cc @@ -766,6 +766,11 @@ void avd_mds_qsd_role_evh(AVD_CL_CB *cb, } try_again: + /* Execute admin op jobs before calling saImmOiImplementerClear to avoid + * SA_AIS_ERR_TIMEOUT + */ + Fifo::executeAdminResp(cb); + /* Take mutex here to sync with imm reinit thread.*/ osaf_mutex_lock_ordie(&imm_reinit_mutex); /* Give up IMM OI implementer role */ ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel