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

Reply via email to