Hi Hung,

The way I implemented the code in setCcbErrorString is to reduce the number of 
calls of strstr and not to have an impact on the performance. 
strstr is a costly function (comparing strings) and we don't need to call the 
function if it's not necessary.

Best regards,
Zoran

-----Original Message-----
From: Hung Nguyen [mailto:hung.d.ngu...@dektech.com.au] 
Sent: Monday, October 26, 2015 1:01 PM
To: Zoran Milinkovic; reddy.neelaka...@oracle.com
Cc: opensaf-devel@lists.sourceforge.net
Subject: Re: [devel] [PATCH 1 of 1] imm: add a precedence of validation abort 
error string over resource abort error string [#1554]

Hi Zoran,

In ::setCcbErrorString, the if(isValidationErrString) {...} block can be 
replaced with this.

         // Precendence of validation abort over resource abort error string
         if (strstr(errorString, IMM_VALIDATION_ABORT) == errorString
                 && strstr(errStr->name.buf, IMM_RESOURCE_ABORT) == 
errStr->name.buf) {
             // Validation abort error string will replace resource abort error 
string
             free(errStr->name.buf);
             errStr->name.buf = fmtError;
             errStr->name.size = len;
             return;
         } else if (strstr(errorString, IMM_RESOURCE_ABORT) == errorString
                 && (strstr(errStr->name.buf, IMM_RESOURCE_ABORT) == 
errStr->name.buf
                         || strstr(errStr->name.buf, IMM_VALIDATION_ABORT) == 
errStr->name.buf)) {
             // If validation abort or resource abort error string exist,
             // new resource abort string will not be added.
             // It can exists more validation abort error strings
             // or only the first resource abort error string
             return;
         }

It looks more clear this way.
We can also avoid declaring 'isValidationErrString' and 'if' block inside 'if' 
block.


BR,

Hung Nguyen - DEK Technologies


--------------------------------------------------------------------------------
From: Zoran Milinkovic zoran.milinko...@ericsson.com
Sent: Monday, October 26, 2015 6:47PM
To: Neelakanta Reddy
     reddy.neelaka...@oracle.com
Cc: Opensaf-devel
     opensaf-devel@lists.sourceforge.net
Subject: [devel] [PATCH 1 of 1] imm: add a precedence of validation abort error 
string over resource abort error string [#1554]


  osaf/services/saf/immsv/immnd/ImmModel.cc |  103 +++++++++--------------------
  1 files changed, 31 insertions(+), 72 deletions(-)


The patch add a precedence of validation error string over resource abort error 
string.
If resource abort error string exists, it will be overwritten by validation 
abort error string.
If at least one validation abort error string exist, new resource abort error 
string will not be adda.

Since the new check of abort error strings is done in setCcbErrorString, the 
patch removes earlier code for ignoring several abort error strings.

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
@@ -5185,22 +5185,7 @@ ImmModel::ccbApply(SaUint32T ccbId,
          osafassert(reqConn==0 || (ccb->mOriginatingConn == reqConn));
          
          if(!ccb->isOk()) {
-            /* At this point, CCB might already have error string with CCB 
abort reason.
-             * If none CCB abort reason can be found in error strings,
-             * then it's a resource abort.
-            */
-            ImmsvAttrNameList *errStr = ccb->mErrorStrings;
-            while(errStr) {
-                if(strstr(errStr->name.buf, IMM_VALIDATION_ABORT) == 
errStr->name.buf
-                        || strstr(errStr->name.buf, IMM_RESOURCE_ABORT) == 
errStr->name.buf) {
-                    break;
-                }
-                errStr = errStr->next;
-            }
-            if(!errStr) {
-                setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an error 
state");
-            }
-
+            setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an 
+ error state");
              err = SA_AIS_ERR_FAILED_OPERATION;
          } else if((sImmNodeState == IMM_NODE_LOADING) && 
!sMissingParents.empty()) {
              MissingParentsMap::iterator mpm; @@ -6254,20 +6239,7 @@ 
ImmModel::ccbAugmentInit(immsv_oi_ccb_up
      if(ccb->mVeto != SA_AIS_OK) {
          TRACE("Ccb %u is already in an error state %u, can not accept 
augmentation",
               ccbId, ccb->mVeto);
-
-        /* ccb->mVeto != SA_AIS_OK, error string with abort reason can already 
be set */
-        ImmsvAttrNameList *errStr = ccb->mErrorStrings;
-        while(errStr) {
-            if(strstr(errStr->name.buf, IMM_VALIDATION_ABORT) == 
errStr->name.buf
-                    || strstr(errStr->name.buf, IMM_RESOURCE_ABORT) == 
errStr->name.buf) {
-                break;
-            }
-            errStr = errStr->next;
-        }
-        if(!errStr) {
-            setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an error 
state");
-        }
-
+        setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an error 
+ state");
          err = SA_AIS_ERR_FAILED_OPERATION; /*ccb->mVeto;*/
          goto done;
      }
@@ -7020,21 +6992,8 @@ SaAisErrorT ImmModel::ccbObjectCreate(Im
      if(!ccb->isOk()) {
          LOG_NO("ERR_FAILED_OPERATION: ccb %u is in an error state "
              "rejecting ccbObjectCreate operation ", ccbId);
-
-        /* !ccb->isOk(), error string with abort reason can already be set */
-        ImmsvAttrNameList *errStr = ccb->mErrorStrings;
-        while(errStr) {
-            if(strstr(errStr->name.buf, IMM_VALIDATION_ABORT) == 
errStr->name.buf
-                    || strstr(errStr->name.buf, IMM_RESOURCE_ABORT) == 
errStr->name.buf) {
-                break;
-            }
-            errStr = errStr->next;
-        }
-        if(!errStr) {
-            setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an error 
state");
-        }
-
          err = SA_AIS_ERR_FAILED_OPERATION;
+        setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an error 
+ state");
          goto ccbObjectCreateExit;
      }
  
@@ -8192,21 +8151,8 @@ ImmModel::ccbObjectModify(const ImmsvOmC
      if(!ccb->isOk()) {
          LOG_NO("ERR_FAILED_OPERATION: ccb %u is in an error state "
              "rejecting ccbObjectModify operation ", ccbId);
-
-        /* !ccb->isOk(), error string with abort reason can already be set */
-        ImmsvAttrNameList *errStr = ccb->mErrorStrings;
-        while(errStr) {
-            if(strstr(errStr->name.buf, IMM_VALIDATION_ABORT) == 
errStr->name.buf
-                    || strstr(errStr->name.buf, IMM_RESOURCE_ABORT) == 
errStr->name.buf) {
-                break;
-            }
-            errStr = errStr->next;
-        }
-        if(!errStr) {
-            setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an error 
state");
-        }
-
          err = SA_AIS_ERR_FAILED_OPERATION;
+        setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an error 
+ state");
          goto ccbObjectModifyExit;
      }
      
@@ -9154,21 +9100,8 @@ ImmModel::ccbObjectDelete(const ImmsvOmC
      if(!ccb->isOk()) {
          LOG_NO("ERR_FAILED_OPERATION: ccb %u is in an error state "
              "rejecting ccbObjectDelete operation ", ccbId);
-
-        /* !ccb->isOk(), error string with abort reason can already be set */
-        ImmsvAttrNameList *errStr = ccb->mErrorStrings;
-        while(errStr) {
-            if(strstr(errStr->name.buf, IMM_VALIDATION_ABORT) == 
errStr->name.buf
-                    || strstr(errStr->name.buf, IMM_RESOURCE_ABORT) == 
errStr->name.buf) {
-                break;
-            }
-            errStr = errStr->next;
-        }
-        if(!errStr) {
-            setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an error 
state");
-        }
-
          err = SA_AIS_ERR_FAILED_OPERATION;
+        setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an error 
+ state");
          goto ccbObjectDeleteExit;
      }
      
@@ -9648,6 +9581,7 @@ ImmModel::setCcbErrorString(CcbInfo *ccb
      char *fmtError = (char *)malloc(errLen);
      int len;
      va_list args;
+    int isValidationErrString = 0;
  
      va_copy(args, vl);
      len = vsnprintf(fmtError, errLen, errorString, args); @@ -9660,6 +9594,12 
@@ ImmModel::setCcbErrorString(CcbInfo *ccb
          osafassert(vsnprintf(fmtError, len, errorString, vl) >= 0);
      }
  
+    if(strstr(errorString, IMM_VALIDATION_ABORT) == errorString) {
+        isValidationErrString = 1;
+    } else if(strstr(errorString, IMM_RESOURCE_ABORT) == errorString) {
+        isValidationErrString = 2;
+    }
+
      unsigned int ix=0;
      ImmsvAttrNameList* errStr = ccb->mErrorStrings;
      ImmsvAttrNameList** errStrTail = &(ccb->mErrorStrings); @@ -9670,6 
+9610,25 @@ ImmModel::setCcbErrorString(CcbInfo *ccb
              free(fmtError);
              return;
          }
+        if(isValidationErrString) {
+            // Precendence of validation abort over resource abort error string
+            if(isValidationErrString == 1) {
+                // Validation abort error string will replace resource abort 
error string
+                if(strstr(errStr->name.buf, IMM_RESOURCE_ABORT) == 
errStr->name.buf) {
+                    free(errStr->name.buf);
+                    errStr->name.buf = fmtError;
+                    errStr->name.size = len;
+                    return;
+                }
+            } else if(strstr(errStr->name.buf, IMM_RESOURCE_ABORT) == 
errStr->name.buf
+                    || strstr(errStr->name.buf, IMM_VALIDATION_ABORT) == 
errStr->name.buf) {
+                // If validation abort or resource abort error string exist,
+                // new resource abort string will not be added.
+                // It can exists more validation abort error strings
+                // or only the first resource abort error string
+                return;
+            }
+        }
          ++ix;
          errStrTail = &(errStr->next);
          errStr = errStr->next;

------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
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