Hi Praveen, Yes it can be reproduced. I just did si-swap safSi=SC-2N,safApp=OpenSAF
Thanks, Minh On 17/05/17 14:44, praveen malviya wrote: > Hi Minh, > > Is this reproducible all the time? > I performed 4 switchvoers on default branch but did not observed. > > Thanks > Praveen > > On 17-May-17 3:21 AM, Minh Chau wrote: >> When Opensaf 2N switchover, amfd tries to update some attributes >> to IMM. But this time, IMM is not available since Opensaf 2N SI >> is in QUIESCED. >> >> SC-1 osafamfnd[510]: NO Assigned 'safSi=SC-2N,safApp=OpenSAF' >> QUIESCED to 'safSu=SC-1,safSg=2N,safApp=OpenSAF' >> SC-1 osafamfd[496]: WA saImmOiRtObjectUpdate of >> 'safSISU=safSu=SC-1\,safSg=2N\,safApp=OpenSAF,safSi=SC-2N,safApp=OpenSAF' >> osafAmfSISUFsmState failed with 5 >> SC-1 osafimmnd[441]: WA ERR_BAD_HANDLE: Handle use is blocked by >> pending reply on syncronous call >> >> This patch corrects the problem by checking IMM service status >> before call avd_saImmOiRtXXX_sync. The problem does not appear >> previously because IMM update is queued and FiFo::execute() does >> check IMM status before executing a job. A check of @avail_state_avd >> against SA_AMF_HA_ACTIVE is not enough in avd_saImmOiRtXXX_sync. >> This patch does check IMM status in avd_saImmOiRtXXX_sync as similar >> as FiFo::execute(). >> --- >> src/amf/amfd/imm.cc | 35 ++++++++++++++++++++++++----------- >> 1 file changed, 24 insertions(+), 11 deletions(-) >> >> diff --git a/src/amf/amfd/imm.cc b/src/amf/amfd/imm.cc >> index 65df73f73..7b1aa333e 100644 >> --- a/src/amf/amfd/imm.cc >> +++ b/src/amf/amfd/imm.cc >> @@ -131,22 +131,32 @@ static char *StrDup(const char *s) { >> // >> Job::~Job() {} >> -// >> -bool ImmJob::isRunnable(const AVD_CL_CB *cb) { >> +// TODO: Make isImmServiceReady as static to limit its scope >> +// This function should belong to AVD_CB class as a method >> +static bool isImmServiceReady(const AVD_CL_CB *cb) { >> TRACE_ENTER(); >> bool rc = true; >> + >> + if (avd_cb->active_services_exist == false) { >> + TRACE("No active service"); >> + rc = false; >> + } >> if ((!avd_cb->is_implementer) && >> (avd_cb->avail_state_avd == SA_AMF_HA_STANDBY)) { >> rc = false; >> } >> - >> if (avd_cb->avd_imm_status == AVD_IMM_INIT_ONGOING) { >> TRACE("Already IMM init is going, try again after sometime"); >> rc = false; >> } >> - TRACE_LEAVE(); >> + TRACE_LEAVE2("%u:", rc); >> return rc; >> } >> + >> +// >> +bool ImmJob::isRunnable(const AVD_CL_CB *cb) { >> + return isImmServiceReady(cb); >> +} >> // >> AvdJobDequeueResultT ImmObjCreate::exec(const AVD_CL_CB *cb) { >> SaAisErrorT rc; >> @@ -1707,10 +1717,11 @@ SaAisErrorT avd_saImmOiRtObjectUpdate_sync( >> SaImmAttrModificationT_2 attrMod; >> const SaImmAttrModificationT_2 *attrMods[] = {&attrMod, nullptr}; >> SaImmAttrValueT attrValues[] = {value}; >> - >> const std::string attribute_name(attributeName); >> + bool isImmReady = isImmServiceReady(avd_cb); >> + >> TRACE_ENTER2("'%s' %s", dn.c_str(), attributeName); >> - if (avd_cb->avail_state_avd == SA_AMF_HA_ACTIVE) { >> + if (isImmReady == true) { >> attrMod.modType = modifyType; >> attrMod.modAttr.attrName = attributeName; >> attrMod.modAttr.attrValuesNumber = 1; >> @@ -1723,7 +1734,7 @@ SaAisErrorT avd_saImmOiRtObjectUpdate_sync( >> attributeName, rc); >> } >> - if (rc != SA_AIS_OK || avd_cb->avail_state_avd != >> SA_AMF_HA_ACTIVE) { >> + if (rc != SA_AIS_OK || isImmReady == false) { >> // Now it will be updated through job queue. >> avd_saImmOiRtObjectUpdate(dn, attribute_name, attrValueType, >> value); >> } >> @@ -1875,8 +1886,9 @@ void avd_saImmOiRtObjectCreate_sync(const >> std::string &className, >> TRACE_ENTER2("%s %s", className.c_str(), parentName.c_str()); >> SaAisErrorT rc = SA_AIS_OK; >> + bool isImmReady = isImmServiceReady(avd_cb); >> - if (avd_cb->avail_state_avd == SA_AMF_HA_ACTIVE) { >> + if (isImmReady == true) { >> const SaNameTWrapper parent_name(parentName); >> rc = saImmOiRtObjectCreate_2(avd_cb->immOiHandle, >> const_cast<SaImmClassNameT>(className.c_str()), >> @@ -1887,7 +1899,7 @@ void avd_saImmOiRtObjectCreate_sync(const >> std::string &className, >> } >> } >> - if (rc != SA_AIS_OK || avd_cb->avail_state_avd != >> SA_AMF_HA_ACTIVE) { >> + if (rc != SA_AIS_OK || isImmReady == false) { >> // Now it will be updated through job queue. >> avd_saImmOiRtObjectCreate(className, parentName, attrValues); >> } >> @@ -1930,14 +1942,15 @@ void avd_saImmOiRtObjectCreate(const >> std::string &className, >> void avd_saImmOiRtObjectDelete_sync(const std::string &dn) { >> TRACE_ENTER2("%s", dn.c_str()); >> SaAisErrorT rc = SA_AIS_OK; >> + bool isImmReady = isImmServiceReady(avd_cb); >> - if (avd_cb->avail_state_avd == SA_AMF_HA_ACTIVE) { >> + if (isImmReady == true) { >> rc = saImmOiRtObjectDelete_o3(avd_cb->immOiHandle, dn.c_str()); >> if (rc != SA_AIS_OK) { >> LOG_WA("saImmOiRtObjectDelete_o3 of '%s' failed with %u", >> dn.c_str(), rc); >> } >> } >> - if (rc != SA_AIS_OK || avd_cb->avail_state_avd != SA_AMF_HA_ACTIVE) { >> + if (rc != SA_AIS_OK || isImmReady == false) { >> // Now it will be updated through job queue. >> avd_saImmOiRtObjectDelete(dn); >> } >> > ------------------------------------------------------------------------------ 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