Hi Hung,

I fixed all your comments in the new patch.
Find more details in the email sent to Neelakanta.

Thanks,
Zoran

From: Hung Nguyen [mailto:[email protected]]
Sent: Monday, August 31, 2015 8:51 PM
To: Zoran Milinkovic; [email protected]
Cc: [email protected]
Subject: Re: [devel] [PATCH 1 of 1] imm: classify abort error strings and 
prefix existing error strings [#744]

Hi Zoran,

I have some inline comments, please see below for details.

Best Regards,

Hung Nguyen

DEK Technologies Vietnam


________________________________

From: Zoran Milinkovic
Sent: Friday, August 28, 2015 9:06PM
To: Neelakanta Reddy
Cc: Opensaf-devel
Subject: [devel] [PATCH 1 of 1] imm: classify abort error strings and prefix 
existing error strings [#744]

 osaf/services/saf/immsv/immnd/ImmModel.cc  |  126 +++++++++++++++++++++++-----

 osaf/services/saf/immsv/immnd/ImmModel.hh  |    5 +

 osaf/services/saf/immsv/immnd/immnd_evt.c  |   48 ++++++++++-

 osaf/services/saf/immsv/immnd/immnd_init.h |    6 +

 4 files changed, 156 insertions(+), 29 deletions(-)





The patch set prefix "IMM:" to all error string that come from IMM.

Based on CCB abort type (resource or validation abort), error strings are 
prefixed with "IMM: Resource abort:" or "IMM: Validation abort:"



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

@@ -2109,6 +2109,23 @@ immModel_resourceDisplay(IMMND_CB *cb,

         resourceDisplay(reqparams, rparams, searchcount);

 }



+void

+immModel_setCcbErrorString(IMMND_CB *cb, SaUint32T ccbId, const char 
*errorString, ...) {

+    CcbVector::iterator cvi;

+    va_list vl;

+

+    cvi = std::find_if(sCcbVector.begin(), sCcbVector.end(), CcbIdIs(ccbId));

+    if (cvi == sCcbVector.end()) {

+        /* Cannot find CCB. Error string will be ignored.

+         * This case should never happen. */

+        return;

+    }

+

+    va_start(vl, errorString);

+    ImmModel::instance(&cb->immModel)->setCcbErrorString(*cvi, errorString, 
vl);

+    va_end(vl);

+}

+

 /*====================================================================*/



 ImmModel::ImmModel() :

@@ -4982,6 +4999,8 @@ ImmModel::ccbApply(SaUint32T ccbId,

             LOG_NO("ERR_BAD_HANDLE: Admin owner id %u does not exist",

                 ccb->mAdminOwnerId);

             ccb->mVeto = SA_AIS_ERR_BAD_HANDLE;

+            /* Later in the code, error code will be set to 
SA_AIS_ERR_FAILED_OPERATION */

+            setCcbErrorString(ccb, "IMM: Resource abort: Admin owner does not 
exist");

         } else if(ccb->mState > IMM_CCB_READY) {

             if(ccb->mState == IMM_CCB_VALIDATING) {

                 LOG_IN("Ccb <%u> in incorrect state 'CCB_VALIDATING for "

@@ -5003,6 +5022,8 @@ ImmModel::ccbApply(SaUint32T ccbId,

                             /* apply callback needs to be sent to 
implementers. */

                            err = SA_AIS_ERR_INTERRUPT;

                         }

+                    } else if(err == SA_AIS_ERR_FAILED_OPERATION) {

+                        setCcbErrorString(ccb, "IMM: Validation abort: 
Completed validation failed");

                     }

                     goto done;

                }

@@ -5033,9 +5054,11 @@ ImmModel::ccbApply(SaUint32T ccbId,

             }

             err = SA_AIS_ERR_FAILED_OPERATION;

             ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION;

+            setCcbErrorString(ccb, "IMM: Validation abort: Parent is missing");

         } else if(!validateNoDanglingRefs(ccb)) {

             err = SA_AIS_ERR_FAILED_OPERATION;

             ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION;

+            setCcbErrorString(ccb, "IMM: Validation abort: No dangling 
validation failed");

         } else {

             /* sMissingParents must be empty if err is SA_AIS_OK */

             osafassert(sMissingParents.empty());

@@ -5074,6 +5097,8 @@ ImmModel::ccbApply(SaUint32T ccbId,

                         "refusing apply", impInfo->mImplementerName.c_str());

                     err = SA_AIS_ERR_FAILED_OPERATION;

                     ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION;

+                    setCcbErrorString(ccb,

+                            "IMM: Resource abort: Lost connection with 
implementer");

                     break;

                 }

                 //Wait for ack, possibly remote

@@ -5662,7 +5687,7 @@ ImmModel::ccbAbort(SaUint32T ccbId, Conn

            not really any error at all, but mVeto should not be SA_AIS_OK.

         */

         ccb->mVeto = SA_AIS_ERR_NO_RESOURCES;

-        setCcbErrorString(ccb, "Resource Error: CCB abort due to either "

+        setCcbErrorString(ccb, "IMM: Resource abort: CCB abort due to either "

             "OI timeout or explicit abort request.");

     }



@@ -6050,6 +6075,7 @@ ImmModel::ccbAugmentInit(immsv_oi_ccb_up

            rsp->inv, ccbId);

         if(ccb->mVeto == SA_AIS_OK) {

             ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION;

+            /* Note: This error code is returned to OI. Parent CCB is aborted 
*/

             err = SA_AIS_ERR_BAD_OPERATION;

         }

         goto done;

@@ -6071,6 +6097,7 @@ ImmModel::ccbAugmentInit(immsv_oi_ccb_up

         TRACE("Ccb %u is already in an error state %u, can not accept 
augmentation",

              ccbId, ccb->mVeto);

         err = SA_AIS_ERR_FAILED_OPERATION; /*ccb->mVeto;*/

+        setCcbErrorString(ccb, "IMM: Resource abort: CCB is in an error 
state");

         goto done;

     }



@@ -6823,6 +6850,7 @@ SaAisErrorT ImmModel::ccbObjectCreate(Im

         LOG_NO("ERR_FAILED_OPERATION: ccb %u is in an error state "

             "rejecting ccbObjectCreate operation ", ccbId);

         err = SA_AIS_ERR_FAILED_OPERATION;

+        setCcbErrorString(ccb, "IMM: Resource abort: CCB is in an error 
state");

         goto ccbObjectCreateExit;

     }



@@ -6830,6 +6858,7 @@ SaAisErrorT ImmModel::ccbObjectCreate(Im

         LOG_NO("ERR_FAILED_OPERATION: ccb %u is not in an expected state:%u "

             "rejecting ccbObjectCreate operation ", ccbId, ccb->mState);

         err = SA_AIS_ERR_FAILED_OPERATION;

+        setCcbErrorString(ccb, "IMM: Resource abort: CCB is not in an expected 
state");

         goto ccbObjectCreateExit;

     }



@@ -6859,13 +6888,14 @@ SaAisErrorT ImmModel::ccbObjectCreate(Im

             LOG_WA("ERR_FAILED_OPERATION: Inconsistency between Ccb admoId:%u 
and AdminOwner-id:%u",

                 adminOwner->mId, ccb->mAdminOwnerId);

             err = SA_AIS_ERR_FAILED_OPERATION;

+            setCcbErrorString(ccb, "IMM: Resource abort: Inconsistency between 
CCB and AdminOwner");

             goto ccbObjectCreateExit;

         }

     }



     if (i3 == sClassMap.end()) {

         TRACE_7("ERR_NOT_EXIST: class '%s' does not exist", className.c_str());

-        setCcbErrorString(ccb, "ERR_NOT_EXIST: class '%s' does not exist", 
className.c_str());

+        setCcbErrorString(ccb, "IMM: ERR_NOT_EXIST: class '%s' does not 
exist", className.c_str());

         err = SA_AIS_ERR_NOT_EXIST;

         goto ccbObjectCreateExit;

     } else if(sPbeRtMutations.find(className) != sPbeRtMutations.end()) {

@@ -6961,6 +6991,9 @@ SaAisErrorT ImmModel::ccbObjectCreate(Im

     if (i4 == classInfo->mAttrMap.end()) {

         LOG_WA("ERR_FAILED_OPERATION: No RDN attribute found in class!");

         err = SA_AIS_ERR_FAILED_OPERATION;     //Should never happen!

+        // Here IMMND should assert ??? It cannot happen that class does not 
have RDN.

+        // This could happen due to memory corruption or heap overflow

+        setCcbErrorString(ccb, "IMM: Resource abort: No RDN found in a class");

         goto ccbObjectCreateExit;

     }



@@ -7192,7 +7225,7 @@ SaAisErrorT ImmModel::ccbObjectCreate(Im



             if (i6 == object->mAttrValueMap.end()) {

                 TRACE_7("ERR_NOT_EXIST: attr '%s' not defined", 
attrName.c_str());

-                setCcbErrorString(ccb, "ERR_NOT_EXIST: attr '%s' not defined",

+                setCcbErrorString(ccb, "IMM: ERR_NOT_EXIST: attr '%s' not 
defined",

                         attrName.c_str());

                 err = SA_AIS_ERR_NOT_EXIST;

                 break; //out of for-loop

@@ -7493,6 +7526,7 @@ SaAisErrorT ImmModel::ccbObjectCreate(Im

                     ccb->mVeto = err;

                     LOG_WA("ERR_FAILED_OPERATION: Persistent back end is down "

                            "ccb %u is aborted", ccbId);

+                    setCcbErrorString(ccb, "IMM: Resource abort: PBE is down");

                 } else {

                     /* Pristine ccb can not start because PBE down */

                     TRACE_5("ERR_TRY_AGAIN: Persistent back end is down");

@@ -7574,7 +7608,7 @@ SaAisErrorT ImmModel::ccbObjectCreate(Im

                     }

                 } else {

                     setCcbErrorString(ccb,

-                        "ERR_BAD_OPERATION: Imm not allowing creates of 
instances of class '%s'",

+                        "IMM: ERR_BAD_OPERATION: Imm not allowing creates of 
instances of class '%s'",

                         immMngtClass.c_str());

                     err = SA_AIS_ERR_BAD_OPERATION;

                 }

@@ -7592,10 +7626,12 @@ SaAisErrorT ImmModel::ccbObjectCreate(Im

                                     "but attribute 'longDnsAllowed' is not 
defined in class %s",

                                     immClassName.c_str());

                             err = SA_AIS_ERR_FAILED_OPERATION;

+                            setCcbErrorString(ccb, "IMM: Resource abort: Long 
DN is used, but attribute longDnsAllowed in not defined");

                         } else if(!i6->second->getValue_int()) {

                             LOG_WA("ERR_FAILED_OPERATION: Long DN is used 
during the loading initial data, "

                                     "but longDnsAllowed is set to 0");

                             err = SA_AIS_ERR_FAILED_OPERATION;

+                            setCcbErrorString(ccb, "IMM: Resource abort: Long 
DN is used when longDnsAllowed is set to 0");

                         }

                     } else {

                         /* 'else' branch is not needed. Only for small 
performance issue.

@@ -7607,7 +7643,7 @@ SaAisErrorT ImmModel::ccbObjectCreate(Im

                     }

                 } else {

                     setCcbErrorString(ccb,

-                        "ERR_BAD_OPERATION: Imm not allowing creates of 
instances of class '%s'",

+                        "IMM: ERR_BAD_OPERATION: Imm not allowing creates of 
instances of class '%s'",

                         immClassName.c_str());

                     err = SA_AIS_ERR_BAD_OPERATION;

                 }

@@ -7621,7 +7657,7 @@ SaAisErrorT ImmModel::ccbObjectCreate(Im

                         "implementer and flag SA_IMM_CCB_REGISTERED_OI is set",

                         className.c_str());

                     setCcbErrorString(ccb,

-                            "ERR_NOT_EXIST: class '%s' does not have an "

+                            "IMM: ERR_NOT_EXIST: class '%s' does not have an "

                             "implementer and flag SA_IMM_CCB_REGISTERED_OI is 
set",

                             className.c_str());

                     err = SA_AIS_ERR_NOT_EXIST;

@@ -7950,6 +7986,7 @@ ImmModel::ccbObjectModify(const ImmsvOmC

         LOG_NO("ERR_FAILED_OPERATION: ccb %u is in an error state "

             "rejecting ccbObjectModify operation ", ccbId);

         err = SA_AIS_ERR_FAILED_OPERATION;

+        setCcbErrorString(ccb, "IMM: Resource abort: CCB is in an error 
state");

         goto ccbObjectModifyExit;

     }



@@ -7957,6 +7994,7 @@ ImmModel::ccbObjectModify(const ImmsvOmC

         LOG_WA("ERR_FAILED_OPERATION: ccb %u is not in an expected state: %u "

             "rejecting ccbObjectModify operation ", ccbId, ccb->mState);

         err = SA_AIS_ERR_FAILED_OPERATION;

+        setCcbErrorString(ccb, "IMM: Resource abort: CCB is not in an expected 
state");

         goto ccbObjectModifyExit;

     }



@@ -7975,6 +8013,7 @@ ImmModel::ccbObjectModify(const ImmsvOmC

         LOG_WA("ERR_FAILED_OPERATION: Inconsistency between Ccb-admoId:%u and "

             "AdminOwnerId:%u", adminOwner->mId, ccb->mAdminOwnerId);

         err = SA_AIS_ERR_FAILED_OPERATION;

+        setCcbErrorString(ccb, "IMM: Resource abort: Inconsistency between CCB 
and AdminOwner");

         goto ccbObjectModifyExit;

     }



@@ -8120,7 +8159,7 @@ ImmModel::ccbObjectModify(const ImmsvOmC

             TRACE_7("ERR_BAD_OPERATION: attr '%s' in IMM object %s is not 
supported",

                 attrName.c_str(), objectName.c_str());

             setCcbErrorString(ccb,

-                "ERR_BAD_OPERATION: attr '%s' in IMM object %s is not 
supported",

+                "IMM: ERR_BAD_OPERATION: attr '%s' in IMM object %s is not 
supported",

                 attrName.c_str(), objectName.c_str());

             err = SA_AIS_ERR_BAD_OPERATION;

             break; //out of for-loop

@@ -8130,14 +8169,14 @@ ImmModel::ccbObjectModify(const ImmsvOmC

             /* ENABLE_PBE defined in immnd.h */

             LOG_NO("ERR_BAD_OPERATION:  imm has not been built with 
--enable-imm-pbe");

             setCcbErrorString(ccb,

-                "ERR_BAD_OPERATION:  imm has not been built with 
--enable-imm-pbe");

+                "IMM: ERR_BAD_OPERATION:  imm has not been built with 
--enable-imm-pbe");

             err = SA_AIS_ERR_BAD_OPERATION;

             break;

         }



         if(modifiedRim && !pbeFile) {

             LOG_NO("ERR_BAD_OPERATION: PBE file is not configured");

-            setCcbErrorString(ccb, "ERR_BAD_OPERATION: PBE file is not 
configured");

+            setCcbErrorString(ccb, "IMM: ERR_BAD_OPERATION: PBE file is not 
configured");

             err = SA_AIS_ERR_BAD_OPERATION;

             break;

         }

@@ -8147,7 +8186,7 @@ ImmModel::ccbObjectModify(const ImmsvOmC

             TRACE_7("ERR_NOT_EXIST: attr '%s' does not exist in object %s",

                 attrName.c_str(), objectName.c_str());

             setCcbErrorString(ccb,

-                "ERR_NOT_EXIST: attr '%s' does not exist in object %s",

+                "IMM: ERR_NOT_EXIST: attr '%s' does not exist in object %s",

                 attrName.c_str(), objectName.c_str());

             err = SA_AIS_ERR_NOT_EXIST;

             break; //out of for-loop

@@ -8329,7 +8368,7 @@ ImmModel::ccbObjectModify(const ImmsvOmC

                         TRACE_7("ERR_BAD_OPERATION: attr '%s' in IMM object %s 
can not have value %u",

                             attrName.c_str(), objectName.c_str(), newRim);

                         setCcbErrorString(ccb,

-                            "ERR_BAD_OPERATION: attr '%s' in IMM object %s can 
not have value %u",

+                            "IMM: ERR_BAD_OPERATION: attr '%s' in IMM object 
%s can not have value %u",

                             attrName.c_str(), objectName.c_str(), newRim);

                         err = SA_AIS_ERR_BAD_OPERATION;

                         break;

@@ -8392,7 +8431,7 @@ ImmModel::ccbObjectModify(const ImmsvOmC

                     TRACE_7("ERR_BAD_OPERATION: attr '%s' in IMM object %s 
must not be empty",

                         attrName.c_str(), objectName.c_str());

                     setCcbErrorString(ccb,

-                        "ERR_BAD_OPERATION: attr '%s' in IMM object %s must 
not be empty",

+                        "IMM: ERR_BAD_OPERATION: attr '%s' in IMM object %s 
must not be empty",

                         attrName.c_str(), objectName.c_str());

                     err = SA_AIS_ERR_BAD_OPERATION;

                     break;

@@ -8459,6 +8498,7 @@ ImmModel::ccbObjectModify(const ImmsvOmC

                 ccb->mVeto = err;

                 LOG_WA("ERR_FAILED_OPERATION: Persistent back end is down "

                        "ccb %u is aborted", ccbId);

+                setCcbErrorString(ccb, "IMM: Resource abort: PBE is down");

             } else {

                 /* Pristine ccb can not start because PBE down */

                 TRACE_5("ERR_TRY_AGAIN: Persistent back end is down");

@@ -8616,9 +8656,9 @@ ImmModel::ccbObjectModify(const ImmsvOmC

             if(longDnsPermitted != longDnsAllowedAfter) {

                 if(ccbIdLongDnGuard) {

                     /* This case should never happen since it is guarded by 
regular ccb handling. */

-                    setCcbErrorString(ccb, "ERR_BUSY: Other Ccb (%u) already 
using %s",

+                    setCcbErrorString(ccb, "IMM: ERR_BUSY: Other Ccb (%u) 
already using %s",

                         ccbIdLongDnGuard, immLongDnsAllowed.c_str());

-                    LOG_IN("ERR_BUSY: Other Ccb (%u) already using %s",

+                    LOG_IN("IMM: ERR_BUSY: Other Ccb (%u) already using %s",

                         ccbIdLongDnGuard, immLongDnsAllowed.c_str());

                     err = SA_AIS_ERR_BUSY;

                 } else {

@@ -8730,6 +8770,7 @@ ImmModel::ccbObjectModify(const ImmsvOmC

                     err = SA_AIS_ERR_FAILED_OPERATION;

                     //Let the timeout handling take care of it on other nodes.

                     //This really needs to be tested! But how ?

+                    setCcbErrorString(ccb, "IMM: Resource abort: Lost 
connection with implementer");

                 } else {

                     *continuationId = sLastContinuationId;

                 }

@@ -8751,7 +8792,7 @@ ImmModel::ccbObjectModify(const ImmsvOmC

                     "implementer and flag SA_IMM_CCB_REGISTERED_OI is set",

                     objectName.c_str());

                 setCcbErrorString(ccb,

-                        "ERR_NOT_EXIST: object '%s' exist but "

+                        "IMM: ERR_NOT_EXIST: object '%s' exist but "

                         "no implementer (which is required)",

                         objectName.c_str());

                 err = SA_AIS_ERR_NOT_EXIST;

@@ -8788,6 +8829,7 @@ ImmModel::ccbObjectModify(const ImmsvOmC

         if(chainedOp) {

             err = SA_AIS_ERR_FAILED_OPERATION;

             ccb->mVeto = err; //Corrupted chain => corrupted ccb

+            setCcbErrorString(ccb, "IMM: Resource abort: Corrupted CCB");

         } else { //First op on this object => ccb can survive

             if(afim) {

                 //Delete the cloned afim.

@@ -8893,6 +8935,7 @@ ImmModel::ccbObjectDelete(const ImmsvOmC

         LOG_NO("ERR_FAILED_OPERATION: ccb %u is in an error state "

             "rejecting ccbObjectDelete operation ", ccbId);

         err = SA_AIS_ERR_FAILED_OPERATION;

+        setCcbErrorString(ccb, "IMM: Resource abort: CCB in error state");

         goto ccbObjectDeleteExit;

     }



@@ -8900,6 +8943,7 @@ ImmModel::ccbObjectDelete(const ImmsvOmC

         LOG_WA("ERR_FAILED_OPERATION: ccb %u is not in an expected state:%u "

             "rejecting ccbObjectDelete operation ", ccbId, ccb->mState);

         err = SA_AIS_ERR_FAILED_OPERATION;

+        setCcbErrorString(ccb, "IMM: Resource abort: CCB is not in an expected 
state");

         goto ccbObjectDeleteExit;

     }



@@ -8923,6 +8967,7 @@ ImmModel::ccbObjectDelete(const ImmsvOmC

     if(adminOwner->mId !=  ccb->mAdminOwnerId) {

         LOG_WA("ERR_FAILED_OPERATION: Inconsistency between Ccb and 
AdminOwner");

         err = SA_AIS_ERR_FAILED_OPERATION;

+        setCcbErrorString(ccb, "IMM: Resource abort: Inconsistency between CCB 
and AdminOwner");

         goto ccbObjectDeleteExit;

     }



@@ -8956,6 +9001,7 @@ ImmModel::ccbObjectDelete(const ImmsvOmC

                 ccb->mVeto = err;

                 LOG_WA("ERR_FAILED_OPERATION: Persistent back end is down "

                        "ccb %u is aborted", ccbId);

+                setCcbErrorString(ccb, "IMM: Resource abort: PBE is down");

             } else {

                 /* Pristine ccb can not start because PBE down */

                 TRACE_5("ERR_TRY_AGAIN: Persistent back end is down");

@@ -9176,7 +9222,7 @@ ImmModel::deleteObject(ObjectMap::iterat

         /* Prevent delete of imm service objects, even when there is no OI for 
them */

         if(oi->first == immManagementDn || oi->first == immObjectDn) {

             setCcbErrorString(ccb,

-                "ERR_BAD_OPERATION: Imm not allowing delete of object '%s'",

+                "IMM: ERR_BAD_OPERATION: Imm not allowing delete of object 
'%s'",

                 oi->first.c_str());

             return SA_AIS_ERR_BAD_OPERATION;

         }

@@ -9191,7 +9237,7 @@ ImmModel::deleteObject(ObjectMap::iterat

                     "and flag SA_IMM_CCB_REGISTERED_OI is set",

                     oi->first.c_str());

                 setCcbErrorString(ccb,

-                        "ERR_NOT_EXIST: object '%s' exist but "

+                        "IMM: ERR_NOT_EXIST: object '%s' exist but "

                         "no implementer (which is required)",

                         oi->first.c_str());

                 return SA_AIS_ERR_NOT_EXIST;

@@ -9364,24 +9410,21 @@ ImmModel::deleteObject(ObjectMap::iterat

 }



 void

-ImmModel::setCcbErrorString(CcbInfo *ccb, const char *errorString, ...)

-{

+ImmModel::setCcbErrorString(CcbInfo *ccb, const char *errorString, va_list vl) 
{

     int errLen = strlen(errorString) + 1;

     char *fmtError = (char *)malloc(errLen);

     int len;

-    va_list vl;

-

-    va_start(vl, errorString);

-    len = vsnprintf(fmtError, errLen, errorString, vl);

-    va_end(vl);

+    va_list args;

+

+    va_copy(args, vl);

+    len = vsnprintf(fmtError, errLen, errorString, args);

+    va_end(args);



     osafassert(len >= 0);

     len++;     /* Reserve one byte for null-terminated sign '\0' */

     if(len > errLen) {

         fmtError = (char *)realloc(fmtError, len);

-        va_start(vl, errorString);

         osafassert(vsnprintf(fmtError, len, errorString, vl) >= 0);

-        va_end(vl);

     }



     unsigned int ix=0;

@@ -9411,6 +9454,16 @@ ImmModel::setCcbErrorString(CcbInfo *ccb

     }

 }



+void

+ImmModel::setCcbErrorString(CcbInfo *ccb, const char *errorString, ...)

+{

+    va_list vl;

+

+    va_start(vl, errorString);

+    setCcbErrorString(ccb, errorString, vl);

+    va_end(vl);

+}

+

 bool

 ImmModel::hasLocalClassAppliers(ClassInfo* classInfo)

 {

@@ -9451,6 +9504,9 @@ ImmModel::ccbWaitForDeleteImplAck(SaUint

         TRACE_5("CCb %u terminated during ccbObjectDelete processing, "

             "ccb must be aborted", ccbId);

         *err = SA_AIS_ERR_FAILED_OPERATION;

+        if(i1 != sCcbVector.end()) {

+            setCcbErrorString(*i1, "IMM: Resource abort: CCB is terminated 
during ccbObjectDelete processing");

+        }

         return false;

     }

     CcbInfo* ccb = *i1;

@@ -9515,6 +9571,9 @@ ImmModel::ccbWaitForCompletedAck(SaUint3

         TRACE_5("Ccb %u terminated during ccbCompleted processing, "

             "ccb must be aborted", ccbId);

         *err = SA_AIS_ERR_FAILED_OPERATION;

+        if(i1 != sCcbVector.end()) {

+            setCcbErrorString(*i1, "IMM: Resource abort: CCB is terminated");

+        }

         return false;

     }

     CcbInfo* ccb = *i1;

@@ -9614,6 +9673,7 @@ ImmModel::ccbWaitForCompletedAck(SaUint3

             *err = ccb->mVeto;

             LOG_WA("ERR_FAILED_OPERATION: Persistent back end is down "

                            "ccb %u is aborted", ccbId);

+            setCcbErrorString(ccb, "IMM: Resource abort: PBE is down");

         }

     }



@@ -9644,6 +9704,7 @@ ImmModel::ccbObjDelContinuation(immsv_oi

         LOG_WA("Not a proper object name: %s", objectName.c_str());

         if(ccb->mVeto == SA_AIS_OK) {

             ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION;

+            setCcbErrorString(ccb, "IMM: Validation abort: Not a proper object 
name");

         }

         return;

     }

@@ -9657,6 +9718,7 @@ ImmModel::ccbObjDelContinuation(immsv_oi

             if((rsp->result == SA_AIS_OK) && ccb->isActive()) {

                 LOG_NO("Vetoing ccb %u with ERR_FAILED_OPERATION", ccbId);

                 ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION;

+                setCcbErrorString(ccb, "IMM: Resource abort: CCB is 
interrupted in augmentation");

             }

         }

         ccb->mOriginatingConn = ccb->mAugCcbParent->mOriginatingConn;

@@ -9677,6 +9739,7 @@ ImmModel::ccbObjDelContinuation(immsv_oi

             objectName.c_str());

         if(ccb->mVeto == SA_AIS_OK) {

             ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION;

+            setCcbErrorString(ccb, "IMM: Validation abort: Object is not found 
in CCB");

         }

     } else {

         osafassert(omuti->second->mWaitForImplAck);

@@ -9694,6 +9757,7 @@ ImmModel::ccbObjDelContinuation(immsv_oi

                     "implementer returned error, Ccb aborted with error: %u",

                      rsp->result);

                 ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION;

+                setCcbErrorString(ccb, "IMM: Validation abort: Implementer 
returned error: ", rsp->result);

                 //TODO: This is perhaps more drastic than the specification

                 //demands. We are here aborting the entire Ccb, whereas the 
spec

                 //seems to allow for a non-ok returnvalue from implementer

@@ -9768,6 +9832,7 @@ ImmModel::ccbCompletedContinuation(immsv

             LOG_WA("Completed continuation: implementer '%u' Not found "

                 "in ccb %u aborting ccb", rsp->implId, ccbId);

             ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION;

+            setCcbErrorString(ccb, "IMM: Resource abort: Implementer not 
found");

         } else {

             LOG_WA("Completed continuation: implementer '%u' Not found "

                 "in ccb %u in state(%u), can not abort", rsp->implId,

@@ -9811,17 +9876,20 @@ ImmModel::ccbCompletedContinuation(immsv

                     case SA_AIS_ERR_BAD_OPERATION:

                         LOG_NO("Validation error (BAD_OPERATION) reported by 
implementer '%s', "

                                "Ccb %u will be aborted", 
ix->second->mImplementer->mImplementerName.c_str(), ccbId);

+                        setCcbErrorString(ccb, "IMM: Validation abort: 
Completed validation fails (ERR_BAD_OPERATION)");

                         break;



                     case SA_AIS_ERR_NO_MEMORY:

                     case SA_AIS_ERR_NO_RESOURCES:

                            LOG_NO("Resource error %u reported by implementer 
'%s', Ccb %u will be aborted",

                                rsp->result, 
ix->second->mImplementer->mImplementerName.c_str(), ccbId);

+                           setCcbErrorString(ccb, "IMM: Validation abort: 
Completed validation fails (Error code: %u)", rsp->result);

                         break;



                    default:

                            LOG_NO("Invalid error reported implementer '%s', 
Ccb %u will be aborted",

                                
ix->second->mImplementer->mImplementerName.c_str(), ccbId);

+                           setCcbErrorString(ccb, "IMM: Validation abort: 
Completed validation fails (Error code: %u)", rsp->result);

                 }

                 ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION;

             }

@@ -9906,6 +9974,7 @@ ImmModel::ccbObjCreateContinuation(SaUin

             invocation, ccbId);

         if(ccb->mVeto == SA_AIS_OK) {

             ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION;

+            setCcbErrorString(ccb, "IMM: Resource abort: Create invocation is 
not found in CCB");

         }

     } else {

         osafassert(omuti->second->mWaitForImplAck);

@@ -9922,6 +9991,7 @@ ImmModel::ccbObjCreateContinuation(SaUin

             if((error == SA_AIS_OK) && ccb->isActive()) {

                 LOG_IN("Vetoing ccb %u with ERR_FAILED_OPERATION", ccbId);

                 error = SA_AIS_ERR_FAILED_OPERATION;

+                setCcbErrorString(ccb, "IMM: Resource abort: CCB was 
interrupted in augmentation");

             }

         }

         ccb->mOriginatingConn = ccb->mAugCcbParent->mOriginatingConn;

@@ -9941,6 +10011,7 @@ ImmModel::ccbObjCreateContinuation(SaUin

             "implementer returned error, Ccb aborted with error: %u",

             error);

         ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION;

+        setCcbErrorString(ccb, "IMM: Validation abort: Implementer returned 
error: %u", error);

         //TODO: This is perhaps more drastic than the specification demands.

         //We are here aborting the entire Ccb, whereas the spec seems to allow

         //for a non-ok returnvalue from implementer (in this callback) to

@@ -9990,6 +10061,7 @@ ImmModel::ccbObjModifyContinuation(SaUin

             invocation, ccbId);

         if(ccb->mVeto == SA_AIS_OK) {

             ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION;

+            setCcbErrorString(ccb, "IMM: Resource abort: Mofidy invocation is 
not found in CCB");

         }

     } else {

         osafassert(omuti->second->mWaitForImplAck);

@@ -10006,6 +10078,7 @@ ImmModel::ccbObjModifyContinuation(SaUin

             if((error == SA_AIS_OK) && ccb->isActive()) {

                 LOG_IN("Vetoing ccb %u with ERR_FAILED_OPERATION", ccbId);

                 error = SA_AIS_ERR_FAILED_OPERATION;

+                setCcbErrorString(ccb, "IMM: Resource abort: CCB was 
interrupted in augmentation");

             }

         }

         ccb->mOriginatingConn = ccb->mAugCcbParent->mOriginatingConn;

@@ -10024,6 +10097,7 @@ ImmModel::ccbObjModifyContinuation(SaUin

         LOG_IN("ImmModel::ccbObjModifyContinuation: "

             "implementer returned error, Ccb aborted with error: %u", error);

         ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION;

+        setCcbErrorString(ccb, "IMM: Validation abort: Implementer returned 
error: %u", error);

         //TODO: This is perhaps more drastic than the specification demands.

         //We are here aborting the entire Ccb, whereas the spec seems to allow

         //for a non-ok returnvalue from implementer (in this callback) to

diff --git a/osaf/services/saf/immsv/immnd/ImmModel.hh 
b/osaf/services/saf/immsv/immnd/ImmModel.hh

--- a/osaf/services/saf/immsv/immnd/ImmModel.hh

+++ b/osaf/services/saf/immsv/immnd/ImmModel.hh

@@ -273,6 +273,11 @@ public:

     void                setCcbErrorString(

                                           CcbInfo *ccb,

                                           const char *errorString,

+                                          va_list vl);

+

+    void                setCcbErrorString(

+                                          CcbInfo *ccb,

+                                          const char *errorString,

                                           ...);



     bool                hasLocalClassAppliers(ClassInfo* classInfo);

diff --git a/osaf/services/saf/immsv/immnd/immnd_evt.c 
b/osaf/services/saf/immsv/immnd/immnd_evt.c

--- a/osaf/services/saf/immsv/immnd/immnd_evt.c

+++ b/osaf/services/saf/immsv/immnd/immnd_evt.c

@@ -3604,7 +3604,12 @@ static void immnd_evt_proc_ccb_obj_modif

               IMMSV_ATTR_NAME_LIST strList;



               if (evt->info.ccbUpcallRsp.result != SA_AIS_OK) {

-                      evt->info.ccbUpcallRsp.result = 
SA_AIS_ERR_FAILED_OPERATION;

+                      if(evt->info.ccbUpcallRsp.result != 
SA_AIS_ERR_FAILED_OPERATION) {

+                              immModel_setCcbErrorString(cb, 
evt->info.ccbUpcallRsp.ccbId,

+                                             "IMM: Resource abort: Upcall 
failed with error code: %u",

+                                             evt->info.ccbUpcallRsp.result);

+                              evt->info.ccbUpcallRsp.result = 
SA_AIS_ERR_FAILED_OPERATION;

+                      }

[Hung] The problem here is that now we have 2 sources of error strings.

One is from the OI.

One is from IMM, they are stored in ccbInfo (by setCcbErrorString).

In immnd_evt_proc_ccb_obj_modify_rsp(), only error string from OI is forwarded 
to the agent.



We can put the error string from OI to ccbInfo then use 
immModel_ccbGrabErrStrings() to get all error strings.

That's pretty much what is done in ccbObjDelContinuation() and 
immnd_evt_proc_ccb_obj_delete_rsp().





                       if (evt->info.ccbUpcallRsp.errorString.size) {

                               osafassert(evt->type == 
IMMND_EVT_A2ND_CCB_OBJ_MODIFY_RSP_2);

                               strList.next = NULL;

@@ -3674,7 +3679,12 @@ static void immnd_evt_proc_ccb_obj_creat

               IMMSV_ATTR_NAME_LIST strList;



               if (evt->info.ccbUpcallRsp.result != SA_AIS_OK) {

-                      evt->info.ccbUpcallRsp.result = 
SA_AIS_ERR_FAILED_OPERATION;

+                      if(evt->info.ccbUpcallRsp.result != 
SA_AIS_ERR_FAILED_OPERATION) {

+                              immModel_setCcbErrorString(cb, 
evt->info.ccbUpcallRsp.ccbId,

+                                             "IMM: Resource abort: Upcall 
failed with error code: %u",

+                                             evt->info.ccbUpcallRsp.result);

+                              evt->info.ccbUpcallRsp.result = 
SA_AIS_ERR_FAILED_OPERATION;

+                      }

[Hung] The same as immnd_evt_proc_ccb_obj_modify_rsp(), both error strings from 
ccbInfo and OI must be sent.





                       if (evt->info.ccbUpcallRsp.errorString.size) {

                               osafassert(evt->type == 
IMMND_EVT_A2ND_CCB_OBJ_CREATE_RSP_2);

                               strList.next = NULL;

@@ -5902,6 +5912,8 @@ static void immnd_evt_proc_object_create

                          should prevent any apply to succeed.

                       */

                       err = SA_AIS_ERR_FAILED_OPERATION;

+                      immModel_setCcbErrorString(cb, evt->info.objCreate.ccbId,

+                                     "IMM: Resource abort: PBE is down");

                       immnd_proc_global_abort_ccb(cb, 
evt->info.objCreate.ccbId);

               } else {

                       memset(&send_evt, '\0', sizeof(IMMSV_EVT));

@@ -5921,6 +5933,8 @@ static void immnd_evt_proc_object_create

                               LOG_ER("Upcall over MDS for ccbObjectCreate "

                                      "to PBE failed! - aborting");

                               err = SA_AIS_ERR_FAILED_OPERATION;

+                              immModel_setCcbErrorString(cb, 
evt->info.objCreate.ccbId,

+                                             "IMM: Resource abort: Upcall over 
MDS to PBE failed");

                               immnd_proc_global_abort_ccb(cb, 
evt->info.objCreate.ccbId);

                       }

                       implHandle = 0LL;

@@ -5942,6 +5956,8 @@ static void immnd_evt_proc_object_create

                               LOG_WA("Client died");

                               err = SA_AIS_ERR_FAILED_OPERATION;

                               delayedReply = SA_FALSE;

+                              immModel_setCcbErrorString(cb, 
evt->info.objCreate.ccbId,

+                                             "IMM: Resource abort: Client 
died");

                       } else {

                               memset(&send_evt, '\0', sizeof(IMMSV_EVT));

                               send_evt.type = IMMSV_EVT_TYPE_IMMA;

@@ -5961,6 +5977,8 @@ static void immnd_evt_proc_object_create

                                                     
oi_cl_node->agent_mds_dest, &send_evt) != NCSCC_RC_SUCCESS) {

                                      LOG_ER("Agent upcall over MDS for 
ccbObjectCreate failed");

                                      err = SA_AIS_ERR_FAILED_OPERATION;

+                                      immModel_setCcbErrorString(cb, 
evt->info.objCreate.ccbId,

+                                                    "IMM: Resource abort: 
Agent upcall over MDS failed");

                               }

                       }

               }

@@ -6133,6 +6151,8 @@ static void immnd_evt_proc_object_modify

                          should prevent any apply to succeed.

                       */

                       err = SA_AIS_ERR_FAILED_OPERATION;

+                      immModel_setCcbErrorString(cb, evt->info.objModify.ccbId,

+                                     "IMM: Resource abort: PBE is down");

                       immnd_proc_global_abort_ccb(cb, 
evt->info.objModify.ccbId);

               } else {

                       memset(&send_evt, '\0', sizeof(IMMSV_EVT));

@@ -6153,6 +6173,8 @@ static void immnd_evt_proc_object_modify

                               LOG_ER("Upcall over MDS for ccbObjectModify "

                                      "to PBE failed! - aborting");

                               err = SA_AIS_ERR_FAILED_OPERATION;

+                              immModel_setCcbErrorString(cb, 
evt->info.objModify.ccbId,

+                                             "IMM: Resource abort: Upcall over 
MDS to PBE failed");

                               immnd_proc_global_abort_ccb(cb, 
evt->info.objModify.ccbId);

                       }

                       implHandle = 0LL;

@@ -6172,9 +6194,11 @@ static void immnd_evt_proc_object_modify

                       immnd_client_node_get(cb, implHandle, &oi_cl_node);

                       osafassert(oi_cl_node != NULL);

                       if (oi_cl_node->mIsStale) {

-                              LOG_WA("OI Client went down so nod modify 
upcall");

+                              LOG_WA("OI Client went down so no modify 
upcall");

                               err = SA_AIS_ERR_FAILED_OPERATION;

                               delayedReply = SA_FALSE;

+                              immModel_setCcbErrorString(cb, 
evt->info.objModify.ccbId,

+                                             "IMM: Resource abort: OI client 
went down");

                       } else {

                               memset(&send_evt, '\0', sizeof(IMMSV_EVT));

                               send_evt.type = IMMSV_EVT_TYPE_IMMA;

@@ -6197,6 +6221,8 @@ static void immnd_evt_proc_object_modify

                                                     
oi_cl_node->agent_mds_dest, &send_evt) != NCSCC_RC_SUCCESS) {

                                      LOG_ER("Agent upcall over MDS for 
ccbObjectModify failed");

                                      err = SA_AIS_ERR_FAILED_OPERATION;

+                                     immModel_setCcbErrorString(cb, 
evt->info.objModify.ccbId,

+                                                    "IMM: Resource abort: 
Agent upcall over MDS failed");

                               }

                       }

               }

@@ -6711,6 +6737,10 @@ static void immnd_evt_ccb_abort(IMMND_CB

                       send_evt.info.imma.info.errRsp.error =

                           timeout ? SA_AIS_ERR_TIMEOUT : 
SA_AIS_ERR_FAILED_OPERATION;



+                      if(send_evt.info.imma.info.errRsp.error == 
SA_AIS_ERR_FAILED_OPERATION) {

+                              immModel_setCcbErrorString(cb, ccbId, "IMM: 
Resource abort:");

+                      }

+

                       send_evt.info.imma.info.errRsp.errStrings =

                               immModel_ccbGrabErrStrings(cb, ccbId);

                       if(send_evt.info.imma.info.errRsp.errStrings) {

@@ -6825,6 +6855,8 @@ static void immnd_evt_proc_object_delete

                          should prevent any apply to succeed.

                       */

                       err = SA_AIS_ERR_FAILED_OPERATION;

+                      immModel_setCcbErrorString(cb, evt->info.objDelete.ccbId,

+                                     "IMM: Resource abort: PBE is down");

                       immnd_proc_global_abort_ccb(cb, 
evt->info.objDelete.ccbId);

               } else {

                       /* We have obtained PBE handle & dest info for PBE.

@@ -6850,6 +6882,8 @@ static void immnd_evt_proc_object_delete

                                              "to PBE failed! - aborting ccb 
%u",

                                              evt->info.objDelete.ccbId);

                                      err = SA_AIS_ERR_FAILED_OPERATION;

+                                     immModel_setCcbErrorString(cb, 
evt->info.objDelete.ccbId,

+                                                    "IMM: Resource abort: 
Upcall over MDS to PBE failed");

                                      immnd_proc_global_abort_ccb(cb, 
evt->info.objDelete.ccbId);

                               }

                       }

@@ -6885,6 +6919,8 @@ static void immnd_evt_proc_object_delete

                                      /* This should cause the ccb-operation to 
timeout on wait for the reply. */

                                      err = SA_AIS_ERR_FAILED_OPERATION;

                                      delayedReply = SA_FALSE;

+                                     immModel_setCcbErrorString(cb, 
evt->info.objDelete.ccbId,

+                                                    "IMM: Resource abort: 
Client went down");

                               } else {

                                      /* Generate an implementer upcall for 
each deleted config object.

                                         No implementer upcalls are generated 
for any runtime objects

@@ -6906,6 +6942,8 @@ static void immnd_evt_proc_object_delete

                                              /* This should cause the 
ccb-operation to timeout. */

                                              err = SA_AIS_ERR_FAILED_OPERATION;

                                              delayedReply = SA_FALSE;

+                                             immModel_setCcbErrorString(cb, 
evt->info.objDelete.ccbId,

+                                                            "IMM: Resource 
abort: Upcall over MDS failed");

                                      }

                               }

                       }       /*for */

@@ -7484,6 +7522,8 @@ static void immnd_evt_proc_ccb_apply(IMM

                                      LOG_WA("IMMND - Client went down so no 
response");

                                      err = SA_AIS_ERR_FAILED_OPERATION;

                                      delayedReply = SA_FALSE;

+                                     immModel_setCcbErrorString(cb, 
evt->info.ccbId,

+                                                    "IMM: Resource abort: 
Client went down");

                               } else {

                                      send_evt.info.imma.info.ccbCompl.ccbId = 
evt->info.ccbId;

                                      send_evt.info.imma.info.ccbCompl.implId = 
implIdArr[ix];

@@ -7498,6 +7538,8 @@ static void immnd_evt_proc_ccb_apply(IMM

                                              err = SA_AIS_ERR_FAILED_OPERATION;

                                              /* should abort the entire ccb */

                                              delayedReply = SA_FALSE;

+                                             immModel_setCcbErrorString(cb, 
evt->info.ccbId,

+                                                            "IMM: Resource 
abort: Upcall over MDS failed");

                                      } else {

                                              TRACE_2("IMMND UPCALL TO OI, SEND 
SUCCEEDED");

                                      }

[Hung] In immnd_evt_proc_ccb_apply(), IMMND always send IMMA_EVT_ND2A_IMM_ERROR 
message to agent.

Error strings in ccbInfo must be checked. If there's any, 
IMMA_EVT_ND2A_IMM_ERROR_2 must be sent together with the error strings.





diff --git a/osaf/services/saf/immsv/immnd/immnd_init.h 
b/osaf/services/saf/immsv/immnd/immnd_init.h

--- a/osaf/services/saf/immsv/immnd/immnd_init.h

+++ b/osaf/services/saf/immsv/immnd/immnd_init.h

@@ -423,6 +423,12 @@ extern "C" {

               const struct ImmsvAdminOperationParam *reqparams,

               struct ImmsvAdminOperationParam **rparams);



+       void

+       immModel_setCcbErrorString(IMMND_CB *cb,

+              SaUint32T ccbId,

+              const char *errorString,

+              ...);

+

 #ifdef __cplusplus

 }

 #endif



------------------------------------------------------------------------------

_______________________________________________

Opensaf-devel mailing list

[email protected]<mailto:[email protected]>

https://lists.sourceforge.net/lists/listinfo/opensaf-devel



------------------------------------------------------------------------------
Monitor Your Dynamic Infrastructure at Any Scale With Datadog!
Get real-time metrics from all of your servers, apps and tools
in one place.
SourceForge users - Click here to start your Free Trial of Datadog now!
http://pubads.g.doubleclick.net/gampad/clk?id=241902991&iu=/4140
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to