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

Reply via email to