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

Reply via email to