osaf/services/saf/immsv/immnd/ImmModel.cc    |   36 ++++++-
 osaf/services/saf/immsv/immnd/ImmModel.hh    |    3 +-
 osaf/services/saf/immsv/immnd/ImmSearchOp.cc |    5 -
 osaf/services/saf/immsv/immnd/immnd_evt.c    |   97 ++++++++++++++++++---
 osaf/services/saf/immsv/immnd/immnd_init.h   |    2 +-
 tests/immsv/implementer/applier.c            |  121 +++++++++++++++++++++-----
 6 files changed, 212 insertions(+), 52 deletions(-)


This is a testpatch containing a test version of the 2PBE handling of
deletes of persistent runtime objects (PRTOs).
This patch will not be pushed. The intent with this patch is to allow
testing and obtaining feedback on the 2PBE handling of PRTO deletes
This test-patch goes on top of the "2PBE PRTO-create" testpatch.

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
@@ -1669,7 +1669,8 @@ immModel_rtObjectDelete(IMMND_CB *cb,
     SaClmNodeIdT* pbeNodeId,
     SaStringT **objNameArr,
     SaUint32T* arrSizePtr,
-    SaUint32T* spApplConn)
+    SaUint32T* spApplConn,
+    SaUint32T* pbe2BConn)
 {
     ObjectNameVector ov;
     ObjectNameVector::iterator oni;
@@ -1678,7 +1679,7 @@ immModel_rtObjectDelete(IMMND_CB *cb,
 
     SaAisErrorT err = ImmModel::instance(&cb->immModel)->
         rtObjectDelete(req, implConn, (unsigned int) implNodeId,
-            continuationId, pbeConn, pbeNodeId, ov, spApplConn);
+            continuationId, pbeConn, pbeNodeId, ov, spApplConn, pbe2BConn);
 
     (*arrSizePtr) = (SaUint32T) ov.size();
     if((err == SA_AIS_OK) && (*arrSizePtr)) {
@@ -12156,6 +12157,20 @@ void ImmModel::pbePrtObjDeletesContinuat
         ObjectMutation* oMut = i2->second;
         osafassert(oMut->mOpType == IMM_DELETE);
 
+        if(oMut->m2PbeCount) {
+           oMut->m2PbeCount--;
+            if(oMut->m2PbeCount && error == SA_AIS_OK) {
+                TRACE("pbePrtObjDeletesContinuation Wait for reply from other 
PBE");
+                return;
+            }
+            if(error == SA_AIS_OK) {
+                TRACE("pbePrtObjDeletesContinuation: All PBEs have responded 
with OK");
+            }
+            /* If any of hte PBEs reply with error, then the PRTO delete is 
aborted.
+               and this contiuation removed. 
+            */
+        }
+
         oMut->mAfterImage->mObjFlags &= ~IMM_DELETE_LOCK;
 
         if(error == SA_AIS_OK) {
@@ -13075,7 +13090,8 @@ ImmModel::rtObjectDelete(const ImmsvOmCc
         SaUint32T* pbeConnPtr,
         unsigned int* pbeNodeIdPtr,
         ObjectNameVector& objNameVector,
-        SaUint32T* spApplConnPtr)
+        SaUint32T* spApplConnPtr,
+        SaUint32T* pbe2BConnPtr)
 {
     osafassert(spApplConnPtr);
     (*spApplConnPtr) = 0;
@@ -13093,6 +13109,8 @@ ImmModel::rtObjectDelete(const ImmsvOmCc
         (*continuationIdPtr) = 0;
         osafassert(pbeConnPtr);
         (*pbeConnPtr) = 0;
+        osafassert(pbe2BConnPtr);
+        (*pbe2BConnPtr) = 0;
     }
 
     if(immNotWritable()) { /*Check for persistent RTOs further down. */
@@ -13167,9 +13185,11 @@ ImmModel::rtObjectDelete(const ImmsvOmCc
     
     for(int doIt=0; (doIt < 2) && (err == SA_AIS_OK); ++doIt) {
         void* pbe = NULL;
+        void* pbe2B = NULL;
         SaUint32T childCount = oi->second->mChildCount;
 
         if(doIt && pbeNodeIdPtr && subTreeHasPersistent) {
+            unsigned int slaveNodeId=0;
             TRACE("PRTO DELETE case, deferred deletes until ACK from PBE");
             /* We expect a PBE and the recursive RTO delete includes
                some PERSISETENT RTOs, then dont delete the RTOs now,
@@ -13195,6 +13215,11 @@ ImmModel::rtObjectDelete(const ImmsvOmCc
                 */
             }
 
+            pbe2B = getPbeBSlave(pbe2BConnPtr, &slaveNodeId);
+           TRACE("getPbeBSlave returned: %p", pbe2B);
+            /* If 2PBE then not both PBEs on same processor. */
+            osafassert(!((*pbeConnPtr) && (*pbe2BConnPtr)));
+
             /* If the subtree to delete includes PRTOs then we use a 
continuationId
                as a common pseudo ccbId for all the RTOs in the subtree.
             */
@@ -13220,8 +13245,9 @@ ImmModel::rtObjectDelete(const ImmsvOmCc
             ObjectMutation* oMut = new ObjectMutation(IMM_DELETE);
             oMut->mContinuationId = (*continuationIdPtr);
             oMut->mAfterImage = oi->second;
+            oMut->m2PbeCount = pbe2B?2:1;
             sPbeRtMutations[oi->first] = oMut;
-            if((oi->second->mObjFlags & IMM_PRTO_FLAG) && (*pbeConnPtr)) {
+            if((oi->second->mObjFlags & IMM_PRTO_FLAG) && ((*pbeConnPtr) 
||(*pbe2BConnPtr))) {
                 TRACE("PRTO flag was set for root of subtree to delete");
                 if(oi->second->mObjFlags & IMM_DN_INTERNAL_REP) {
                     std::string tmpName(oi->first);
@@ -13292,7 +13318,7 @@ ImmModel::rtObjectDelete(const ImmsvOmCc
                         oMut->mContinuationId = (*continuationIdPtr);
                         oMut->mAfterImage = oi2->second;
                         sPbeRtMutations[subObjName] = oMut;
-                        if((oi2->second->mObjFlags & IMM_PRTO_FLAG) && 
(*pbeConnPtr)) {
+                        if((oi2->second->mObjFlags & IMM_PRTO_FLAG) && 
((*pbeConnPtr) ||(*pbe2BConnPtr))) {
                             TRACE("PRTO flag was set for subobj: %s", 
subObjName.c_str());
                             if(oi2->second->mObjFlags & IMM_DN_INTERNAL_REP) {
                                 std::string tmpName(subObjName);
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
@@ -424,7 +424,8 @@ public:
                                        SaUint32T* pbeConnPtr,
                                        unsigned int* pbeNodeIdPtr,
                                        ObjectNameVector& objNameVector,
-                                       SaUint32T* specialApplCon);
+                                       SaUint32T* specialApplCon,
+                                      SaUint32T* pbe2BConn);
                   
     
     SaAisErrorT         deleteRtObject(
diff --git a/osaf/services/saf/immsv/immnd/ImmSearchOp.cc 
b/osaf/services/saf/immsv/immnd/ImmSearchOp.cc
--- a/osaf/services/saf/immsv/immnd/ImmSearchOp.cc
+++ b/osaf/services/saf/immsv/immnd/ImmSearchOp.cc
@@ -89,7 +89,6 @@ ImmSearchOp::setImplementer(SaUint32T co
 SaAisErrorT
 ImmSearchOp::testTopResult(unsigned int* nodeIdp, SaBoolT* bRtsToFetch)
 {
-    TRACE_ENTER();
     SaAisErrorT err = SA_AIS_ERR_NOT_EXIST;
 
     if (!mResultList.empty()) {
@@ -109,8 +108,6 @@ ImmSearchOp::testTopResult(unsigned int*
         }
     }
 
-    TRACE_LEAVE();
-
     return err;
 }
 
@@ -120,7 +117,6 @@ ImmSearchOp::nextResult(IMMSV_OM_RSP_SEA
     AttributeList** rtsToFetch,
     SaUint64T* implDest)
 {
-    TRACE_ENTER();
     SaAisErrorT err = SA_AIS_ERR_NOT_EXIST;
     if(!mRtsToFetch.empty()) {mRtsToFetch.clear();}
     
@@ -198,7 +194,6 @@ ImmSearchOp::nextResult(IMMSV_OM_RSP_SEA
     } else {
         mLastResult=NULL;
     }
-    TRACE_LEAVE();
     return err;
 }
 
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
@@ -5267,7 +5267,6 @@ static void immnd_evt_proc_rt_object_cre
                        /*The persistent back-end is executing at THIS node. */
                        osafassert(!pbe2BConn);
                        osafassert(cb->mIsCoord);
-                       osafassert(pbeNodeId);
                        osafassert(pbeNodeId == cb->node_id);
                        implHandle = m_IMMSV_PACK_HANDLE(pbeConn, pbeNodeId);
 
@@ -5310,12 +5309,11 @@ static void immnd_evt_proc_rt_object_cre
 
                } else if(pbe2BConn) {
                        osafassert(!(cb->mIsCoord));
-                       osafassert(pbeNodeId);
                        osafassert(pbeNodeId != cb->node_id);                   
-                       LOG_IN("The persistent back-end SLAVE is executing at 
THIS node.");
+                       TRACE("PBE SLAVE at THIS node.");
                        implHandle = m_IMMSV_PACK_HANDLE(pbe2BConn, 
cb->node_id);
 
-                       /*Fetch client node for PBE */
+                       /*Fetch client node for Slave PBE */
                        immnd_client_node_get(cb, implHandle, &pbe_cl_node);
                        osafassert(pbe_cl_node);
                        if (pbe_cl_node->mIsStale) {
@@ -5346,7 +5344,7 @@ static void immnd_evt_proc_rt_object_cre
                                        NCSCC_RC_SUCCESS) 
                                {
                                        LOG_WA("Upcall over MDS for persistent 
rt obj create "
-                                               "to PBE failed!");
+                                               "to Slave PBE failed!");
                                        /* See comment **** above. */
                                }
                        }
@@ -6611,6 +6609,7 @@ static void immnd_evt_proc_rt_object_del
        SaUint32T nodeId = m_IMMSV_UNPACK_HANDLE_LOW(clnt_hdl);
        SaBoolT delayedReply = SA_FALSE;
        SaUint32T pbeConn = 0;
+       SaUint32T pbe2BConn = 0;
        NCS_NODE_ID pbeNodeId = 0;
        NCS_NODE_ID *pbeNodeIdPtr = NULL;
        SaUint32T continuationId = 0;
@@ -6619,11 +6618,6 @@ static void immnd_evt_proc_rt_object_del
        SaUint32T spApplConn=0;
        TRACE_ENTER();
 
-#if 0                          /*ABT DEBUG PRINTOUTS START */
-       TRACE_2("ABT immnd_evt_proc_rt_object_delete object:%s", 
evt->info.objDelete.objectName.buf);
-       TRACE_2("ABT immnd_evt_proc_rt_object_delete IMPLID:%u", 
evt->info.objDelete.adminOwnerId);
-#endif   /*ABT DEBUG PRINTOUTS STOP */
-
        if(cb->mPbeFile && (cb->mRim == SA_IMM_KEEP_REPOSITORY)) {
                pbeNodeIdPtr = &pbeNodeId;
                TRACE("We expect there to be a PBE");
@@ -6634,10 +6628,12 @@ static void immnd_evt_proc_rt_object_del
 
        if (originatedAtThisNd) {
                err = immModel_rtObjectDelete(cb, &(evt->info.objDelete), 
reqConn, nodeId,
-                       &continuationId, &pbeConn, pbeNodeIdPtr, &objNameArr, 
&arrSize, &spApplConn);
+                       &continuationId, &pbeConn, pbeNodeIdPtr, &objNameArr, 
&arrSize,
+                       &spApplConn, &pbe2BConn);
        } else {
                err = immModel_rtObjectDelete(cb, &(evt->info.objDelete), 0, 
nodeId,
-                       &continuationId, &pbeConn, pbeNodeIdPtr, &objNameArr, 
&arrSize, &spApplConn);
+                       &continuationId, &pbeConn, pbeNodeIdPtr, &objNameArr, 
&arrSize,
+                       &spApplConn, &pbe2BConn);
        }
 
        if(pbeNodeId && (err == SA_AIS_OK) && arrSize) {
@@ -6646,8 +6642,8 @@ static void immnd_evt_proc_rt_object_del
                if(pbeConn) {
                        TRACE("PBE at this node arrSize:%u", arrSize);
                        /*The persistent back-end is executing at THIS node. */
+                       osafassert(!pbe2BConn);
                        osafassert(cb->mIsCoord);
-                       osafassert(pbeNodeId);
                        osafassert(pbeNodeId == cb->node_id);
                        implHandle = m_IMMSV_PACK_HANDLE(pbeConn, pbeNodeId);
                        memset(&send_evt, '\0', sizeof(IMMSV_EVT));
@@ -6686,7 +6682,6 @@ static void immnd_evt_proc_rt_object_del
                                        {
                                                LOG_WA("Upcall over MDS for 
persistent rt obj delete "
                                                        "to PBE failed!");
-                                               /* See comment **** above. */
                                                /* TODO: we could possibly 
revert the delete
                                                   here an return TRY_AGAIN. We 
may have
                                                   succeeded in sending some 
deletes, but
@@ -6723,6 +6718,80 @@ static void immnd_evt_proc_rt_object_del
                        }
                        implHandle = 0LL;
                        pbe_cl_node = NULL;
+               } else if(pbe2BConn) {
+                       TRACE("PBE SLAVE at this node arrSize:%u", arrSize);
+                       /*The persistent back-end is executing at THIS node. */
+                       osafassert(!(cb->mIsCoord));
+                       osafassert(pbeNodeId != cb->node_id);
+                       implHandle = m_IMMSV_PACK_HANDLE(pbe2BConn, 
cb->node_id);
+
+                       memset(&send_evt, '\0', sizeof(IMMSV_EVT));
+                       send_evt.type = IMMSV_EVT_TYPE_IMMA;
+                       send_evt.info.imma.type = 
IMMA_EVT_ND2A_OI_OBJ_DELETE_UC;
+                       send_evt.info.imma.info.objDelete.ccbId = 0;
+                       send_evt.info.imma.info.objDelete.adminOwnerId = 
continuationId;
+                       send_evt.info.imma.info.objDelete.immHandle = 
implHandle;
+
+                       /*Fetch client node for Slave PBE */
+                       immnd_client_node_get(cb, implHandle, &pbe_cl_node);
+                       osafassert(pbe_cl_node);
+                       if (pbe_cl_node->mIsStale) {
+                               LOG_WA("SLAVE PBE is down => persistify of 
rtObj delete is dropped!");
+                               goto done;
+                       } else {
+                               /* We have obtained handle & dest info for 
Slave PBE. 
+                                  Iterate through objNameArray and send delete 
upcalls to Slave PBE.
+                               */
+                               int ix = 0;
+                               for (; ix < arrSize && err == SA_AIS_OK; ++ix) {
+                                       
send_evt.info.imma.info.objDelete.objectName.size = 
+                                               (SaUint32T) 
strlen(objNameArr[ix]);
+                                       
send_evt.info.imma.info.objDelete.objectName.buf = 
+                                               objNameArr[ix];
+
+                                       TRACE_2("MAKING PBE-SLAVE PERSISTENT 
RT-OBJ DELETE upcalls");
+                                       if (immnd_mds_msg_send(cb, 
NCSMDS_SVC_ID_IMMA_OI,
+                                                   
pbe_cl_node->agent_mds_dest, &send_evt) != 
+                                               NCSCC_RC_SUCCESS) 
+                                       {
+                                               LOG_WA("Upcall over MDS for 
persistent rt obj delete "
+                                                       "to Slave PBE failed!");
+                                               /* TODO: we could possibly 
revert the delete
+                                                  here an return TRY_AGAIN. We 
may have
+                                                  succeeded in sending some 
deletes, but
+                                                  since we did not send the 
completed,
+                                                  the PRTO deletes will not be 
commited 
+                                                  by the PBE.
+                                                */
+                                               goto done;
+                                       }
+                               }
+
+                               send_evt.info.imma.type = 
IMMA_EVT_ND2A_OI_CCB_COMPLETED_UC;
+                               send_evt.info.imma.info.ccbCompl.ccbId = 0;
+                               send_evt.info.imma.info.ccbCompl.immHandle = 
implHandle;
+                               send_evt.info.imma.info.ccbCompl.implId = 
arrSize;
+                                 /* ^^Hack: Use implId to store objCount, see 
#1809.^^
+                                   This avoids having to change the protocol. 
+                                 */
+                               send_evt.info.imma.info.ccbCompl.invocation = 
continuationId;
+
+                               TRACE_2("MAKING PBE PRTO DELETE COMPLETED 
upcall to PBE Slave");
+                               if (immnd_mds_msg_send(cb, 
NCSMDS_SVC_ID_IMMA_OI,
+                                           pbe_cl_node->agent_mds_dest, 
&send_evt) != 
+                                       NCSCC_RC_SUCCESS) 
+                               {
+                                       LOG_WA("Upcall over MDS for persistent 
rt obj deletes "
+                                               "completed, to PBE slave 
failed!");
+                                       /* See comment **** above. */
+                                       /* TODO: we could actually revert the 
delete here an return TRY_AGAIN*/
+                                       goto done;
+                                       
+                               }
+
+                       }
+                       implHandle = 0LL;
+                       pbe_cl_node = NULL;
                }
        } 
 
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
@@ -366,7 +366,7 @@ extern "C" {
                    SaUint32T implConn, SaClmNodeIdT implNodeId,
                    SaUint32T *continuationId, SaUint32T *pbeConn,
                    SaClmNodeIdT *pbeNodeId, SaStringT **objNameArr,
-                   SaUint32T* arrSize, SaUint32T* spApplConn);
+                   SaUint32T* arrSize, SaUint32T* spApplConn, SaUint32T 
*pbe2BConn);
 
        SaAisErrorT
            immModel_rtObjectUpdate(IMMND_CB *cb,
diff --git a/tests/immsv/implementer/applier.c 
b/tests/immsv/implementer/applier.c
--- a/tests/immsv/implementer/applier.c
+++ b/tests/immsv/implementer/applier.c
@@ -76,6 +76,30 @@ static SaAisErrorT saImmOiCcbObjectModif
        SaAisErrorT rc = SA_AIS_OK;
        printf("Modify callback on %s - object:%s ccbId:%llu\n", implName, 
objectName->value, ccbId);
 
+       int ix=0;
+       for(;attrMods[ix]!=NULL;++ix) {
+               const SaImmAttrModificationT_2 *att = attrMods[ix];
+               printf("\tAttribute: %s type:%u, nrofvals:%u\n",
+                       att->modAttr.attrName, att->modAttr.attrValueType, 
att->modAttr.attrValuesNumber);
+               if(strcmp(att->modAttr.attrName, 
SA_IMM_ATTR_ADMIN_OWNER_NAME)==0 && att->modAttr.attrValuesNumber) {
+                       SaStringT stVal = *((SaStringT*) 
att->modAttr.attrValues[0]);
+                       printf("\tAdminOwnerName:%s\n", stVal);
+               } else if(strcmp(att->modAttr.attrName, 
SA_IMM_ATTR_CLASS_NAME)==0 && att->modAttr.attrValuesNumber) {
+                       SaStringT stVal = *((SaStringT*) 
att->modAttr.attrValues[0]);
+                       printf("\tClassName:%s\n", stVal);
+               } else if(att->modAttr.attrValueType == SA_IMM_ATTR_SASTRINGT) {
+                       SaStringT stVal = *((SaStringT*) 
att->modAttr.attrValues[0]);
+                       printf("\t%s:%s\n", att->modAttr.attrName, stVal);
+               } else if((att->modAttr.attrValueType == SA_IMM_ATTR_SAUINT32T) 
||
+                       (att->modAttr.attrValueType == SA_IMM_ATTR_SAINT32T)) {
+                       SaUint32T intVal = *((SaUint32T*) 
att->modAttr.attrValues[0]);
+                       printf("\t%s:%u\n", att->modAttr.attrName, intVal);
+               }
+
+       }
+
+
+
        struct CcbUtilCcbData *ccbUtilCcbData;
        if ((ccbUtilCcbData = ccbutil_findCcbData(ccbId)) == NULL) {
                if ((ccbUtilCcbData = ccbutil_getCcbData(ccbId)) == NULL) {
@@ -99,9 +123,33 @@ static SaAisErrorT saImmOiCcbObjectCreat
 {
        SaAisErrorT rc = SA_AIS_OK;
        struct CcbUtilCcbData *ccbUtilCcbData;
+       int ix=0;
 
        printf("Create callback on %s - parent:%s ccbId:%llu\n", implName, 
parentName->value, ccbId);
 
+       for(;attr[ix]!=NULL;++ix) {
+               const SaImmAttrValuesT_2 *att = attr[ix];
+               printf("\tAttribute: %s type:%u, nrofvals:%u\n",
+                       att->attrName, att->attrValueType, 
att->attrValuesNumber);
+               if(strcmp(att->attrName, SA_IMM_ATTR_ADMIN_OWNER_NAME)==0 && 
att->attrValuesNumber) {
+                       SaStringT stVal = *((SaStringT*) att->attrValues[0]);
+                       printf("\tAdminOwnerName:%s\n", stVal);
+               } else if(strcmp(att->attrName, SA_IMM_ATTR_CLASS_NAME)==0 && 
att->attrValuesNumber) {
+                       SaStringT stVal = *((SaStringT*) att->attrValues[0]);
+                       printf("\tClassName:%s\n", stVal);
+               } else if(strcmp(att->attrName, 
SA_IMM_ATTR_IMPLEMENTER_NAME)==0 && att->attrValuesNumber) {
+                       SaStringT stVal = *((SaStringT*) att->attrValues[0]);
+                       printf("\tImplementerName:%s\n", stVal);
+               } else if(att->attrValueType == SA_IMM_ATTR_SASTRINGT) {
+                       SaStringT stVal = *((SaStringT*) att->attrValues[0]);
+                       printf("\t%s:%s\n", att->attrName, stVal);
+               } else if((att->attrValueType == SA_IMM_ATTR_SAUINT32T) ||
+                       (att->attrValueType == SA_IMM_ATTR_SAINT32T)) {
+                       SaUint32T intVal = *((SaUint32T*) att->attrValues[0]);
+                       printf("\t%s:%u\n", att->attrName, intVal);
+               }
+       }
+
        if ((ccbUtilCcbData = ccbutil_findCcbData(ccbId)) == NULL) {
                if ((ccbUtilCcbData = ccbutil_getCcbData(ccbId)) == NULL) {
                        fprintf(stderr, "Failed to get CCB object for %llu\n", 
ccbId);
@@ -182,18 +230,6 @@ static SaAisErrorT saImmOiRtAttrUpdateCa
     return SA_AIS_OK;
 }
 
-static void saImmOiAdminOperationCallback(SaImmOiHandleT immOiHandle, 
SaInvocationT invocation,
-       const SaNameT *objectName, SaImmAdminOperationIdT operationId, 
-       const SaImmAdminOperationParamsT_2 **params)
-{
-       printf("AdminOperationCallback received by impl %s on object %s 
operation:%llu invocation:%llu\n", 
-               implName, (char *) objectName->value, operationId, invocation);
-       SaAisErrorT err = saImmOiAdminOperationResult(immOiHandle, invocation, 
SA_AIS_OK);
-       if(err != SA_AIS_OK) {
-               fprintf(stderr, "Reply on admin operation failed, err:%u\n", 
err);
-       }
-}
-
 int main(int argc, char *argv[])
 {
        int c;
@@ -209,7 +245,7 @@ int main(int argc, char *argv[])
        SaNameT objectName;
        const SaImmAdminOperationParamsT_2 **params;
        const SaImmOiCallbacksT_2 callbacks = {
-               .saImmOiAdminOperationCallback = saImmOiAdminOperationCallback,
+               .saImmOiAdminOperationCallback = NULL,
                .saImmOiCcbAbortCallback = saImmOiCcbAbortCallback,
                .saImmOiCcbApplyCallback = saImmOiCcbApplyCallback,
                .saImmOiCcbCompletedCallback = saImmOiCcbCompletedCallback,
@@ -271,6 +307,7 @@ int main(int argc, char *argv[])
                exit(EXIT_FAILURE);
        }
 
+       printf("HERE\n");
        /* Remaining arguments should be class names for which implementer is 
set. */
        while (optind < argc) {
                strncpy((char *)objectName.value, argv[optind], 
SA_MAX_NAME_LENGTH);
@@ -278,24 +315,56 @@ int main(int argc, char *argv[])
 
                printf("Class: %s\n", objectName.value);
 
-               if(!strcmp((const char *) objectName.value, 
"OpensafImmRtTest")) {
+               if(!strcmp((const char *) objectName.value, "OpensafImmRtTest") 
||
+                       !strcmp((const char *) objectName.value, 
"OpensafImmRt2Test")) {
                        /* Special test case for RTO's. 
                           Class OpensafImmRtTest foundd at 
samples/immsv/immsv_test_classes_rtobj.xml
                        */
-                       SaStringT str1="testRdn=ZZZ";
-                       SaImmAttrValueT strValues[] = {&str1};
-                       SaImmAttrValuesT_2 v1 = { "testRdn",  
SA_IMM_ATTR_SASTRINGT, 1, (void**)strValues };
-                       const SaImmAttrValuesT_2* attrValues[] = {&v1, NULL};
+                       SaNameT myName;
+                       strncpy((char *)myName.value, "testRdn=ZZZ", 
SA_MAX_NAME_LENGTH);
+                       myName.length = strlen((char *)myName.value);
+                       if(1) {
+                               printf("HERE 2\n");
 
-                       error = saImmOiRtObjectCreate_2(immOiHandle, 
(SaImmClassNameT) objectName.value, NULL, attrValues);
-                       if (error != SA_AIS_OK && error != SA_AIS_ERR_EXIST) {
-                               fprintf(stderr, "error - 
saImmOiClassImplementerSet FAILED: %s\n", saf_error(error));
-                               exit(EXIT_FAILURE);
+                               /* First try to delete the RTO */
+                               error = saImmOiRtObjectDelete(immOiHandle, 
&myName);
                        }
-                       if(error == SA_AIS_OK) {
-                               printf("Runtime object: %s created\n", str1);
-                       } else {
-                               printf("Runtime object: %s exists\n", str1);
+
+                       if (error == SA_AIS_OK) {
+                                       printf("Object %s deletedt\n", 
myName.value);
+                       } else if(error == SA_AIS_ERR_NOT_EXIST) {
+                               printf("Object %s does not exist\n", 
myName.value);
+                               SaStringT str1="testRdn=ZZZ";
+                               SaImmAttrValueT strValues[] = {&str1};
+                               SaImmAttrValuesT_2 v1 = { "testRdn",  
SA_IMM_ATTR_SASTRINGT, 1, (void**)strValues };
+                               const SaImmAttrValuesT_2* attrValues[] = {&v1, 
NULL};
+
+                               error = saImmOiRtObjectCreate_2(immOiHandle, 
(SaImmClassNameT) objectName.value, NULL, attrValues);
+                               if (error != SA_AIS_OK && error != 
SA_AIS_ERR_EXIST) {
+                                       fprintf(stderr, "error - 
saImmOiRtObjectCreate FAILED: %s\n", saf_error(error));
+                                       exit(EXIT_FAILURE);
+                               }
+                               if(error == SA_AIS_OK) {
+
+                                       SaUint64T uint64Val = 5502120230;
+                                       SaImmAttrValueT val = &uint64Val;
+                                       SaImmAttrModificationT_2 attrMod;
+                                       attrMod.modType = 
SA_IMM_ATTR_VALUES_REPLACE;
+                                       attrMod.modAttr.attrName = "testUint64";
+                                       attrMod.modAttr.attrValueType = 
SA_IMM_ATTR_SAUINT64T;
+                                       attrMod.modAttr.attrValuesNumber = 1;
+                                       attrMod.modAttr.attrValues = &val;
+                                       const SaImmAttrModificationT_2* 
attrMods[2] = {&attrMod, NULL};
+                                       printf("Runtime object: %s created\n", 
str1);
+                                       sleep(2);
+                                       error = 
saImmOiRtObjectUpdate_2(immOiHandle, &myName, attrMods);
+                                       sleep(2);
+                                       strncpy((char *)myName.value, 
"testRdn=0", SA_MAX_NAME_LENGTH);
+                                       myName.length = strlen((char 
*)myName.value);
+                                       error = 
saImmOiRtObjectUpdate_2(immOiHandle, &myName, attrMods);
+                               } else {
+                                       printf("Runtime object: %s exists\n", 
str1);
+                               }
                        }
                } else {
                        error = saImmOiClassImplementerSet(immOiHandle, 
(SaImmClassNameT) objectName.value);

------------------------------------------------------------------------------
See everything from the browser to the database with AppDynamics
Get end-to-end visibility with application monitoring from AppDynamics
Isolate bottlenecks and diagnose root cause in seconds.
Start your free trial of AppDynamics Pro today!
http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to