Hi Praveen, I think it can be reproduced only when SC absence is enabled.
Thanks, Minh On 17/05/17 14:56, minh chau wrote: > 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