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
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel
------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel