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

Reply via email to