Hi Anders, The answer to Johan is correct. All error strings are prefixed with "IMM:" string. Only error strings for error code SA_AIS_FAILED_OPRATION have prefix "IMM: Resource abort" or "IMM: Validation abort". I made static prefix in the new patch, so the typo will not be possible.
Assertion because of missed error string would be too strict. If an error string is missing, then it would be considered as a resource abort. All validation aborts are covered. Thanks, Zoran -----Original Message----- From: Anders Widell Sent: Wednesday, September 02, 2015 1:00 PM To: Johan Mårtensson O; 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] Johan, I guess the abort classification only applies to the case when we return SA_AIS_ERR_FAILED_OPERATION, and that is the reason why some error strings have neither the "Resource abort" nor the "Validation abort" prefix in the patch below? Still I see a potential that this classification is forgotten, in some future modification of the code. Zoran, would it be possible to add some sort of assertion (or at least a log message) that can catch cases where the classification has been forgotten (or even the string has been misspelt) in the error string? / Anders Widell On 09/01/2015 10:56 AM, Johan Mårtensson O wrote: > Hi Zoran, > > See comments on the patch below. > > / Johan > > -----Original Message----- > From: Zoran Milinkovic [mailto:[email protected]] > Sent: den 28 augusti 2015 16:07 > To: [email protected] > Cc: [email protected] > 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", > Johan: Shouldn't this be "IMM: Resource abort: attr '%s' not defined" to be > consistent with the other strings? > 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'", > Johan: Should this be "IMM: Validation abort: Imm does not allow creates of > instances of class '%s'" for consistency? > 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'", > Johan: Should this also be "Validation abort" as suggested above? > 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 > " > Johan: Should this be a "Resource abort"? > "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", > Johan: Should this be a "Validation abort"? > 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"); > Johan: Should this be a "Resource abort"? > 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"); > Johan: Can this be a "Resource abort"? > 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", > Johan: Should this be a "Resource abort"? > 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", > Johan: Should this be a "Validation abort"? > 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", > Johan: This could be either a validation abort or resource abort. > 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", > Johan: Is this a resource abort? > 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", > Johan: Should this also be set in the error string in addition to logging? > 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 " > Johan: This should be a resource abort. > "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'", > Johan: Could this be a validation abort since the user is trying to do > something IMM doesn't allow? > 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 " > Johan: This should be a resource abort. > "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"); > Johan: Change Mofidy to Modify > } > } 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:"); > Johan: Should you add any information here, like "..(ERR FAILED OPERATION)"? > + } > + > 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 > [email protected] > https://lists.sourceforge.net/lists/listinfo/opensaf-devel > > ---------------------------------------------------------------------- > -------- _______________________________________________ > Opensaf-devel mailing list > [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
