Ack from me , not tested. /AndersBj
-----Original Message----- From: Zoran Milinkovic [mailto:[email protected]] Sent: den 29 september 2015 11:44 To: [email protected] Cc: [email protected] Subject: [devel] [PATCH 1 of 1] imm: fix returning error strings when ccbObjectApply is called on aborted CCB [#1508] osaf/services/saf/immsv/immnd/ImmModel.cc | 63 +++++++++++++++++++++++++++++- osaf/services/saf/immsv/immnd/immnd_evt.c | 7 ++- 2 files changed, 66 insertions(+), 4 deletions(-) The patch provides the fix for returning error string when ccbObjectApply is called on aborted CCB. The patch also contains missing error strings. diff --git a/osaf/services/saf/immsv/immnd/ImmModel.cc b/osaf/services/saf/immsv/immnd/ImmModel.cc --- a/osaf/services/saf/immsv/immnd/ImmModel.cc +++ b/osaf/services/saf/immsv/immnd/ImmModel.cc @@ -4082,6 +4082,8 @@ ImmModel::notCompatibleAtt(const std::st "class change for class: %s attr: %s. Aborting Ccb.", ccb->mId, omit->first.c_str(), className.c_str(), attName.c_str()); + setCcbErrorString(ccb, IMM_RESOURCE_ABORT "Class change for class: %s, attr: %s", + className.c_str(), + attName.c_str()); ccb->mVeto = SA_AIS_ERR_FAILED_OPERATION; } else { osafassert(ccb->mState == IMM_CCB_CRITICAL); @@ -5182,6 +5184,22 @@ ImmModel::ccbApply(SaUint32T ccbId, osafassert(reqConn==0 || (ccb->mOriginatingConn == reqConn)); if(!ccb->isOk()) { + /* At this point, CCB might already have error string with CCB abort reason. + * If none CCB abort reason can be found in error strings, + * then it's a resource abort. + */ + ImmsvAttrNameList *errStr = ccb->mErrorStrings; + while(errStr) { + if(strstr(errStr->name.buf, IMM_VALIDATION_ABORT) == errStr->name.buf + || strstr(errStr->name.buf, IMM_RESOURCE_ABORT) == errStr->name.buf) { + break; + } + errStr = errStr->next; + } + if(!errStr) { + setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an error state"); + } + err = SA_AIS_ERR_FAILED_OPERATION; } else if((sImmNodeState == IMM_NODE_LOADING) && !sMissingParents.empty()) { MissingParentsMap::iterator mpm; @@ -6235,8 +6253,21 @@ ImmModel::ccbAugmentInit(immsv_oi_ccb_up if(ccb->mVeto != SA_AIS_OK) { TRACE("Ccb %u is already in an error state %u, can not accept augmentation", ccbId, ccb->mVeto); + + /* ccb->mVeto != SA_AIS_OK, error string with abort reason can already be set */ + ImmsvAttrNameList *errStr = ccb->mErrorStrings; + while(errStr) { + if(strstr(errStr->name.buf, IMM_VALIDATION_ABORT) == errStr->name.buf + || strstr(errStr->name.buf, IMM_RESOURCE_ABORT) == errStr->name.buf) { + break; + } + errStr = errStr->next; + } + if(!errStr) { + setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an error state"); + } + err = SA_AIS_ERR_FAILED_OPERATION; /*ccb->mVeto;*/ - setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an error state"); goto done; } @@ -6988,8 +7019,21 @@ SaAisErrorT ImmModel::ccbObjectCreate(Im if(!ccb->isOk()) { LOG_NO("ERR_FAILED_OPERATION: ccb %u is in an error state " "rejecting ccbObjectCreate operation ", ccbId); + + /* !ccb->isOk(), error string with abort reason can already be set */ + ImmsvAttrNameList *errStr = ccb->mErrorStrings; + while(errStr) { + if(strstr(errStr->name.buf, IMM_VALIDATION_ABORT) == errStr->name.buf + || strstr(errStr->name.buf, IMM_RESOURCE_ABORT) == errStr->name.buf) { + break; + } + errStr = errStr->next; + } + if(!errStr) { + setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an error state"); + } + err = SA_AIS_ERR_FAILED_OPERATION; - setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an error state"); goto ccbObjectCreateExit; } @@ -8147,8 +8191,21 @@ ImmModel::ccbObjectModify(const ImmsvOmC if(!ccb->isOk()) { LOG_NO("ERR_FAILED_OPERATION: ccb %u is in an error state " "rejecting ccbObjectModify operation ", ccbId); + + /* !ccb->isOk(), error string with abort reason can already be set */ + ImmsvAttrNameList *errStr = ccb->mErrorStrings; + while(errStr) { + if(strstr(errStr->name.buf, IMM_VALIDATION_ABORT) == errStr->name.buf + || strstr(errStr->name.buf, IMM_RESOURCE_ABORT) == errStr->name.buf) { + break; + } + errStr = errStr->next; + } + if(!errStr) { + setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an error state"); + } + err = SA_AIS_ERR_FAILED_OPERATION; - setCcbErrorString(ccb, IMM_RESOURCE_ABORT "CCB is in an error state"); goto ccbObjectModifyExit; } 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 @@ -7572,6 +7572,7 @@ static void immnd_evt_proc_ccb_apply(IMM NCS_NODE_ID *pbeNodeIdPtr = NULL; SaUint32T pbeId = 0; SaUint32T pbeCtn = 0; + int bCcbFinalize = 0; TRACE_ENTER(); #if 0 /* Ticket #496 testcase immomtest 6 22 */ if((evt->info.ccbId == 10)&&(originatedAtThisNd)) { @@ -7866,7 +7867,7 @@ static void immnd_evt_proc_ccb_apply(IMM osafassert(!client || originatedAtThisNd); } TRACE_2("CCB APPLY TERMINATING CCB: %u", evt->info.ccbId); - immModel_ccbFinalize(cb, evt->info.ccbId); + bCcbFinalize = 1; immediate_reply: if (originatedAtThisNd) { @@ -7893,6 +7894,10 @@ static void immnd_evt_proc_ccb_apply(IMM immsv_evt_free_attrNames(send_evt.info.imma.info.errRsp.errStrings); } } + + if(bCcbFinalize) { + immModel_ccbFinalize(cb, evt->info.ccbId); + } } done: TRACE_LEAVE(); ------------------------------------------------------------------------------ _______________________________________________ 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
