Hi Zoran,
I still get duplicated 'resource abort' error strings when trying to add a
delete operation to a aborted CCB.
root@SC1:~# immcfg -c Test test=1
root@SC1:~# immcfg
> immcfg -c Test test=2
> (Add SA_NOTIFY to an attribute of class 'Test' to make the ccb abort)
> immcfg -d test=1
error - saImmOmCcbObjectDelete for 'test=1' FAILED: SA_AIS_ERR_FAILED_OPERATION
(21)
OI reports: IMM: Resource abort: Class change for class: Test, attr:
single OI reports: IMM: Resource abort: CCB in error state
CCB is aborted
One more minor comment.
It would be great if this trace was moved into the if block together with
immModel_ccbFinalize()
TRACE_2("CCB APPLY TERMINATING CCB: %u", evt->info.ccbId);
Best Regards,
Hung Nguyen - DEK Technologies
--------------------------------------------------------------------------------
From: Zoran Milinkovic [email protected]
Sent: Wednesday, September 30, 2015 11:10AM
To: Neelakanta Reddy
[email protected]
Cc: Opensaf-devel
[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