Hi Hung, You made a very good point. I checked the code again, and think that we can remove 1 sec sleep. Clean the house will be called just after admin operation is invoked.
Thanks, Zoran From: Hung Nguyen [mailto:hung.d.ngu...@dektech.com.au] Sent: Monday, August 24, 2015 9:44 AM To: Zoran Milinkovic; reddy.neelaka...@oracle.com Cc: opensaf-devel@lists.sourceforge.net Subject: Re: [devel] [PATCH 1 of 1] imm: force cleanTheHouse job on aborting non-critical CCB admin op [#1107] Hi Zoran, With this fix I think it's now safe to remove the 1 sec sleep for #1261. Best Regards, Hùng Nguyễn DEK Technologies ________________________________ From: Zoran Milinkovic Sent: Friday, August 14, 2015 4:26PM To: Neelakanta Reddy Cc: Opensaf-devel Subject: [devel] [PATCH 1 of 1] imm: force cleanTheHouse job on aborting non-critical CCB admin op [#1107] osaf/services/saf/immsv/immnd/ImmModel.cc | 28 +++++++++++++++++++--------- osaf/services/saf/immsv/immnd/immnd_cb.h | 1 + osaf/services/saf/immsv/immnd/immnd_main.c | 7 +++++-- osaf/services/saf/immsv/immnd/immnd_proc.c | 6 +++++- 4 files changed, 30 insertions(+), 12 deletions(-) When aborting non-critical CCB admin op is invoked and to avoid delay in calling cleanTheHouse job, the patch force the call to cleanTheHouse on abort non-crtitical CCB admin op. diff --git a/osaf/services/saf/immsv/immnd/ImmModel.cc b/osaf/services/saf/immsv/immnd/ImmModel.cc --- a/osaf/services/saf/immsv/immnd/ImmModel.cc +++ b/osaf/services/saf/immsv/immnd/ImmModel.cc @@ -1251,9 +1251,16 @@ immModel_adminOperationInvoke(IMMND_CB * SaBoolT pbeExpected, bool* displayRes) { - return ImmModel::instance(&cb->immModel)-> - adminOperationInvoke(req, reqConn, reply_dest, inv, - implConn, implNodeId, pbeExpected, displayRes, cb->mIsCoord); + bool wasAbortNonCritical = sAbortNonCriticalCcbs; + SaAisErrorT err = ImmModel::instance(&cb->immModel)-> + adminOperationInvoke(req, reqConn, reply_dest, inv, implConn, + implNodeId, pbeExpected, displayRes, cb->mIsCoord); + + if(sAbortNonCriticalCcbs && !wasAbortNonCritical) { + LOG_IN("ABT cb->mForceClean set to true"); + cb->mForceClean = true; + } + return err; } SaUint32T /* Returns admo-id for object if object exists and active admo exists, otherwise zero. */ @@ -11002,7 +11009,9 @@ SaAisErrorT ImmModel::adminOperationInvo SaInvocationT& saInv, SaUint32T* implConn, unsigned int* implNodeId, - bool pbeExpected, bool* displayRes, bool isAtCoord) + bool pbeExpected, + bool* displayRes, + bool isAtCoord) { TRACE_ENTER(); SaAisErrorT err = SA_AIS_OK; @@ -12511,8 +12520,9 @@ ImmModel::cleanTheBasement(InvocVector& CcbImplementerMap::iterator cim; uint32_t max_oi_timeout = DEFAULT_TIMEOUT_SEC; - if(sAbortNonCriticalCcbs) { - LOG_IN("sAbortNonCriticalCcbs is true => set max_oi_timeout to 0"); + bool abortCcb = sAbortNonCriticalCcbs && !((*i3)->mMutations.empty()); + if(abortCcb) { + LOG_IN("abortCcb is true => set max_oi_timeout to 0"); max_oi_timeout = 0; } else { for(cim = (*i3)->mImplementers.begin(); cim != (*i3)->mImplementers.end(); ++cim) { @@ -12525,20 +12535,20 @@ ImmModel::cleanTheBasement(InvocVector& uint32_t oi_timeout = ((*i3)->mState == IMM_CCB_CRITICAL) ? DEFAULT_TIMEOUT_SEC : max_oi_timeout; if(((*i3)->mWaitStartTime && (now - (*i3)->mWaitStartTime >= (int)oi_timeout)) || /* normal timeout */ ((*i3)->mPbeRestartId) || /* CCB was critical when PBE restarted => Must ask new PBE for outcome */ - sAbortNonCriticalCcbs) /* Request to abort ALL non critical CCBs */ + abortCcb) /* Request to abort ALL non critical CCBs */ { if((*i3)->mPbeRestartId) { oi_timeout = 0; TRACE_5("PBE restarted id:%u with ccb:%u in critical", (*i3)->mPbeRestartId, (*i3)->mId); - } else if(now - (*i3)->mWaitStartTime >= (int)max_oi_timeout) { + } else if((*i3)->mWaitStartTime && (now - (*i3)->mWaitStartTime >= (int)max_oi_timeout)) { oi_timeout = 0; TRACE_5("CCB %u timeout while waiting on implementer reply", (*i3)->mId); } - if(sAbortNonCriticalCcbs) { + if(abortCcb) { LOG_NO("CCB %u aborted by: immadm -o %u safRdn=immManagement,safApp=safImmService", (*i3)->mId, SA_IMM_ADMIN_ABORT_CCBS); } diff --git a/osaf/services/saf/immsv/immnd/immnd_cb.h b/osaf/services/saf/immsv/immnd/immnd_cb.h --- a/osaf/services/saf/immsv/immnd/immnd_cb.h +++ b/osaf/services/saf/immsv/immnd/immnd_cb.h @@ -127,6 +127,7 @@ typedef struct immnd_cb_tag { uint8_t m2Pbe; //If!=0 => 2PBE, 2 => fetch PBE file info. bool mIsOtherScUp; //If set & this is an SC then other SC is up(2pbe). //False=> *allow* 1safe 2pbe. May err conservatively (true) + bool mForceClean; //true => Force cleanTheHouse to run once *now*. /* Information about the IMMD */ MDS_DEST immd_mdest_id; diff --git a/osaf/services/saf/immsv/immnd/immnd_main.c b/osaf/services/saf/immsv/immnd/immnd_main.c --- a/osaf/services/saf/immsv/immnd/immnd_main.c +++ b/osaf/services/saf/immsv/immnd/immnd_main.c @@ -346,10 +346,13 @@ int main(int argc, char *argv[]) if (fds[FD_MBX].revents & POLLIN) { uint8_t wasCoord = immnd_cb->mIsCoord; immnd_process_evt(); - if (!wasCoord && immnd_cb->mIsCoord) { - TRACE("We just became Coord => Force a server job!"); + if ((!wasCoord && immnd_cb->mIsCoord) || immnd_cb->mForceClean) { + TRACE("Just became Coord or special imm admop => Force a server job!"); /* This is particularly urgent in a failover situation. */ eventCount = maxEvt; + if(immnd_cb->mForceClean) { + LOG_IN("ABT immnd-main caught mForceClean"); + } } } diff --git a/osaf/services/saf/immsv/immnd/immnd_proc.c b/osaf/services/saf/immsv/immnd/immnd_proc.c --- a/osaf/services/saf/immsv/immnd/immnd_proc.c +++ b/osaf/services/saf/immsv/immnd/immnd_proc.c @@ -2076,9 +2076,13 @@ uint32_t immnd_proc_server(uint32_t *tim } } - if((cb->mStep == 0) || (cb->mCleanedHouseAt != jobDuration)) { + if((cb->mStep == 0) || (cb->mCleanedHouseAt != jobDuration) || cb->mForceClean) { immnd_cleanTheHouse(cb, coord == 1); cb->mCleanedHouseAt = jobDuration; + if(cb->mForceClean) { + LOG_IN("ABT Cleaned the house: cb->mForceClean reset to false;"); + cb->mForceClean = false; + } } if ((coord == 1) && (cb->mStep > 1)) { ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net<mailto:Opensaf-devel@lists.sourceforge.net> https://lists.sourceforge.net/lists/listinfo/opensaf-devel ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel