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