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;
+                       }
                        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;
+                       }
                        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");
                                        }
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
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to