osaf/libs/agents/saf/imma/imma_oi_api.c          |    4 +-
 osaf/libs/agents/saf/imma/imma_proc.c            |   21 +--
 osaf/services/saf/immsv/immnd/ImmModel.cc        |  113 +++++++++++++++-------
 osaf/services/saf/immsv/immnd/ImmModel.hh        |    9 +-
 osaf/services/saf/immsv/immnd/immnd_evt.c        |   54 ++++++++++-
 osaf/services/saf/immsv/immnd/immnd_init.h       |    4 +-
 osaf/services/saf/immsv/immnd/immnd_proc.c       |    4 +-
 osaf/services/saf/immsv/immpbed/immpbe_daemon.cc |    6 +-
 8 files changed, 151 insertions(+), 64 deletions(-)


This is a testpatch containing a test version of the 2PBE handling of
creates 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 creates
This test-patch goes on top of the "2PBE class-handling" testpatch.

diff --git a/osaf/libs/agents/saf/imma/imma_oi_api.c 
b/osaf/libs/agents/saf/imma/imma_oi_api.c
--- a/osaf/libs/agents/saf/imma/imma_oi_api.c
+++ b/osaf/libs/agents/saf/imma/imma_oi_api.c
@@ -1248,7 +1248,9 @@ SaAisErrorT saImmOiImplementerSet(SaImmO
                   If error is returned by implementerSet then isApplier is 
reset to 0 below.
                 */
                cl_node->isApplier = 0x1;
-       } else if(strncmp(implementerName, OPENSAF_IMM_PBE_IMPL_NAME, nameLen) 
== 0) {
+       } else if((strncmp(implementerName, OPENSAF_IMM_PBE_IMPL_NAME, nameLen) 
== 0) ||
+               (strncmp(implementerName, OPENSAF_IMM_PBE_RT_IMPL_NAME_B, 
nameLen) == 0))
+               {
                /* Optimistically turn on cl-node->isPbe since callbacks may 
arrive to the mds
                   thread before reply on the implementerSet request arrives 
back here. 
                   If error is returned by implementerSet then isPbe is reset 
to 0 below.
diff --git a/osaf/libs/agents/saf/imma/imma_proc.c 
b/osaf/libs/agents/saf/imma/imma_proc.c
--- a/osaf/libs/agents/saf/imma/imma_proc.c
+++ b/osaf/libs/agents/saf/imma/imma_proc.c
@@ -2121,11 +2121,10 @@ static void imma_process_callback_info(I
                                                ccbid = callback->inv + 
0x100000000LL;
                                        } else {
                                                ccbid = callback->ccbID;
-                                       }
-
-                                       if(!(cl_node->isApplier)) {
-                                               /* Error strings are not 
relevant for PRT ops. */
-                                               
imma_oi_ccb_allow_error_string(cl_node, callback->ccbID);
+                                               if(!(cl_node->isApplier)) {
+                                                       /* Error strings are 
not relevant for PRT ops. */
+                                                       
imma_oi_ccb_allow_error_string(cl_node, callback->ccbID);
+                                               }
                                        }
 
                                        SaNameT parentName = callback->name;
@@ -2342,10 +2341,9 @@ static void imma_process_callback_info(I
                                                        ccbid, 
callback->name.value);
                                        } else {
                                                ccbid = callback->ccbID;
+                                               if(!(cl_node->isApplier)) 
{imma_oi_ccb_allow_error_string(cl_node, ccbid);}
                                        }
 
-                                       if(!(cl_node->isApplier)) 
{imma_oi_ccb_allow_error_string(cl_node, ccbid);}
-
                                        localEr = 
cl_node->o.iCallbk.saImmOiCcbObjectDeleteCallback(callback->lcl_imm_hdl,
                                                ccbid, &(callback->name));
 
@@ -2464,13 +2462,12 @@ static void imma_process_callback_info(I
                                                ccbid = callback->inv + 
0x100000000LL;
                                        } else {
                                                ccbid = callback->ccbID;
+                                               if(!(cl_node->isApplier)) {
+                                                       /* Error strings are 
not relevant for PRT ops. */
+                                                       
imma_oi_ccb_allow_error_string(cl_node, callback->ccbID);
+                                               }
                                        }                                       
 
-                                       if(!(cl_node->isApplier)) {
-                                               /* Error strings are not 
relevant for PRT ops. */
-                                               
imma_oi_ccb_allow_error_string(cl_node, callback->ccbID);
-                                       }
-
                                        SaNameT objectName = callback->name;
                                        int noOfAttrMods = 0;
 
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
@@ -248,7 +248,8 @@ struct ObjectMutation
                                              mAugmentAdmo(0),
                                              mSavedData(NULL),
                                              mWaitForImplAck(false),
-                                             mIsAugDelete(false) { }
+                                             mIsAugDelete(false),
+                                             m2PbeCount(0) { }
     ~ObjectMutation() { osafassert(mAfterImage == NULL);
                         mContinuationId=0;
                         mAugmentAdmo=0;
@@ -282,6 +283,7 @@ struct ObjectMutation
     void* mSavedData;        //For special applier PRTO. Type of data depends 
on mOpType
     bool mWaitForImplAck;  //ack required from implementer for THIS object
     bool mIsAugDelete;     //The mutation is an augmented delete.
+    SaUint8T m2PbeCount;   //How many PBE replies to wait for (2PBE only).
 };
 typedef std::map<std::string, ObjectMutation*> ObjectMutationMap;  
 
@@ -793,11 +795,11 @@ immModel_pbeOiExists(IMMND_CB *cb)
 }
 
 SaBoolT
-immModel_pbeBApplierExists(IMMND_CB *cb)
+immModel_pbeBSlaveExists(IMMND_CB *cb)
 {
     SaUint32T pbeBConn=0;
     unsigned int pbeBNode=0;
-    return (ImmModel::instance(&cb->immModel)->getPbeBApplier(&pbeBConn, 
&pbeBNode, false)) ? 
+    return (ImmModel::instance(&cb->immModel)->getPbeBSlave(&pbeBConn, 
&pbeBNode, false)) ? 
         SA_TRUE : SA_FALSE;
 }
 
@@ -1647,11 +1649,13 @@ immModel_rtObjectCreate(IMMND_CB *cb,
     SaUint32T* continuationId,
     SaUint32T* pbeConn,
     SaClmNodeIdT* pbeNodeId,
-    SaUint32T* spApplConn)
+    SaUint32T* spApplConn,
+    SaUint32T* pbe2BConn)
+
 {
     return ImmModel::instance(&cb->immModel)->
         rtObjectCreate(req, implConn, (unsigned int) implNodeId, 
continuationId, 
-            pbeConn, pbeNodeId, spApplConn);
+            pbeConn, pbeNodeId, spApplConn, pbe2BConn);
 
 }
 
@@ -1796,6 +1800,14 @@ ImmModel::immNotPbeWritable(bool isPrtoC
         return true; 
     }
 
+    /* ABT TODO need a solution for enable/disable 2-safe/1-safe 2PBE 
+       This has to be runtime data, can not be config data. 
+       There is a dilema with persistent config talking about degre of
+       persistent redundancy.
+       Catch this after loading, look up opensaf object and add an RTA
+       to reflect 2PBE status. 
+    */
+
     /* Pbe is present but Check also for backlog. */
 
     time_t now = time(NULL);
@@ -2437,28 +2449,28 @@ ImmModel::specialApplyForClass(ClassInfo
 }
 
 void *
-ImmModel::getPbeBApplier(SaUint32T* pbeConn, unsigned int* pbeNode, bool 
fevsSafe)
+ImmModel::getPbeBSlave(SaUint32T* pbeConn, unsigned int* pbeNode, bool 
fevsSafe)
 {
     *pbeConn = 0;
     *pbeNode = 0;
-    std::string pbeBApplierName(OPENSAF_IMM_2PBE_APPL_NAME);
-    ImplementerInfo* pbeBApplier = findImplementer(pbeBApplierName);
-    if(pbeBApplier == NULL || pbeBApplier->mId==0) {
+    std::string pbeBSlaveName(OPENSAF_IMM_PBE_RT_IMPL_NAME_B);
+    ImplementerInfo* pbeBSlave = findImplementer(pbeBSlaveName);
+    if(pbeBSlave == NULL || pbeBSlave->mId==0) {
         return NULL;
     }
 
-    if(pbeBApplier->mDying) {
+    if(pbeBSlave->mDying) {
         if(!fevsSafe) {
-            LOG_NO("ImmModel::getPbeBApplier reports missing PbeBApplier 
locally => unsafe");
+            LOG_NO("ImmModel::getPbeBSlave reports missing PbeBSlave locally 
=> unsafe");
             return NULL;
         }
     } else {
-        *pbeConn = pbeBApplier->mConn;
-    }
-
-    *pbeNode = pbeBApplier->mNodeId;
-
-    return pbeBApplier;
+        *pbeConn = pbeBSlave->mConn;
+    }
+
+    *pbeNode = pbeBSlave->mNodeId;
+
+    return pbeBSlave;
 }
 
 
@@ -8816,7 +8828,7 @@ SaAisErrorT ImmModel::adminOperationInvo
             TRACE_5("Updating req invocation inv:%llu conn:%u timeout:%u",
                 saInv, reqConn, timeout);
 
-           ContinuationMap2::iterator ci = sAdmReqContinuationMap.find(saInv);
+            ContinuationMap2::iterator ci = sAdmReqContinuationMap.find(saInv);
             if(ci == sAdmReqContinuationMap.end()) {
                 LOG_IN("Assuming reply for adminOp %llu arrived before 
request.", saInv);
             } else {
@@ -11361,7 +11373,8 @@ ImmModel::rtObjectCreate(struct ImmsvOmC
     SaUint32T* continuationId,
     SaUint32T* pbeConnPtr,
     unsigned int* pbeNodeIdPtr,
-    SaUint32T* spApplConnPtr)
+    SaUint32T* spApplConnPtr,
+    SaUint32T* pbe2BConnPtr)
 {
     TRACE_ENTER2("cont:%p connp:%p nodep:%p", continuationId, pbeConnPtr, 
pbeNodeIdPtr);
     SaAisErrorT err = SA_AIS_OK;
@@ -11611,6 +11624,7 @@ ImmModel::rtObjectCreate(struct ImmsvOmC
     
     if(err == SA_AIS_OK) {
         void* pbe = NULL;
+        void* pbe2B = NULL;
         object = new ObjectInfo();
         object->mClassInfo = classInfo;
         object->mImplementer = info;
@@ -11898,12 +11912,18 @@ ImmModel::rtObjectCreate(struct ImmsvOmC
         }
 
         if(isPersistent && (err == SA_AIS_OK) && pbeNodeIdPtr) {
+            unsigned int slaveNodeId=0;
             /* PBE expected. */
             pbe = getPbeOi(pbeConnPtr, pbeNodeIdPtr);
             if(!pbe) {
                 LOG_ER("Pbe is not available, can not happen here");
                 abort();
-            } 
+            }
+
+            pbe2B = getPbeBSlave(pbe2BConnPtr, &slaveNodeId);
+
+            /* If 2PBE then not both PBEs on same processor. */
+            osafassert(!((*pbeConnPtr) && (*pbe2BConnPtr)));
         }
 
         if (err != SA_AIS_OK) {
@@ -11922,7 +11942,7 @@ ImmModel::rtObjectCreate(struct ImmsvOmC
         }
 
         if(isPersistent) {
-            if(pbe) { /* Persistent back end is there. */
+            if(pbe) { /* Persistent back end is up (somewhere) */
 
                 object->mObjFlags |= IMM_CREATE_LOCK;
                 /* Dont overwrite IMM_DN_INTERNAL_REP*/
@@ -11944,6 +11964,9 @@ ImmModel::rtObjectCreate(struct ImmsvOmC
                 TRACE_5("Tentative create of PERSISTENT runtime object '%s' "
                     "by Impl %s pending PBE ack", objectName.c_str(),
                          info->mImplementerName.c_str());
+
+                oMut->m2PbeCount = pbe2B?2:1;
+
             } else { /* No pbe and no pbe expected. */
                        TRACE("Create of PERSISTENT runtime object '%s' by Impl 
%s",
                            objectName.c_str(), info->mImplementerName.c_str());
@@ -11984,28 +12007,44 @@ void ImmModel::pbePrtObjCreateContinuati
     }
 
     SaInvocationT inv = m_IMMSV_PACK_HANDLE(invocation, nodeId);
+
+    ObjectMutationMap::iterator i2;
+    for(i2=sPbeRtMutations.begin(); i2!=sPbeRtMutations.end(); ++i2) {
+        if(i2->second->mContinuationId == invocation) {break;}
+    }
+
+    if(i2 == sPbeRtMutations.end()) {
+        if(error == SA_AIS_OK) {
+            LOG_ER("PBE PRTO Create continuation missing! invoc:%u", 
invocation);
+        }
+        return;
+    }
+
+    ObjectMutation* oMut = i2->second;
+
+    osafassert(oMut->mOpType == IMM_CREATE);
+
+    if(oMut->m2PbeCount) {
+        oMut->m2PbeCount--;
+        if(oMut->m2PbeCount && error == SA_AIS_OK) {
+            TRACE("pbePrtObjCreateContinuation Wait for reply from other PBE");
+            return;
+        }
+        if(error == SA_AIS_OK) {
+            TRACE("pbePrtObjCreateContinuation: All PBEs have responded with 
OK");
+        }
+        /* If any of hte PBEs reply with error, then the PRTO create is 
aborted.
+           and this contiuation removed. 
+        */
+    }
+
     ContinuationMap2::iterator ci = sPbeRtReqContinuationMap.find(inv);
     if(ci != sPbeRtReqContinuationMap.end()) {
         /* The client was local. */
         TRACE("CLIENT WAS LOCAL continuation found");
         *reqConn = ci->second.mConn;
         sPbeRtReqContinuationMap.erase(ci);
-    } 
-
-    ObjectMutationMap::iterator i2;
-    for(i2=sPbeRtMutations.begin(); i2!=sPbeRtMutations.end(); ++i2) {
-        if(i2->second->mContinuationId == invocation) {break;}
-    }
-
-    if(i2 == sPbeRtMutations.end()) {
-        LOG_ER("PBE PRTO Create continuation missing! invoc:%u",
-            invocation);
-        return;
-    }
-
-    ObjectMutation* oMut = i2->second;
-
-    osafassert(oMut->mOpType == IMM_CREATE);
+    }
 
     oMut->mAfterImage->mObjFlags &= ~IMM_CREATE_LOCK;
 
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
@@ -397,9 +397,10 @@ public:
                                        SaUint32T conn,
                                        unsigned int nodeId,
                                        SaUint32T* continuationId,
-                                        SaUint32T* pbeConn,
-                                       unsigned int* pbeNodeId,
-                                        SaUint32T* spApplConn);
+                                      SaUint32T* pbeConn,
+                                      unsigned int* pbeNodeId,
+                                      SaUint32T* spApplConn,
+                                      SaUint32T* pbe2BConn);
 
     
     SaAisErrorT         rtObjectUpdate(
@@ -483,7 +484,7 @@ public:
     bool              immNotWritable();
     bool              immNotPbeWritable(bool isPrtoClient = true);
     void*             getPbeOi(SaUint32T* pbeConn, unsigned int* pbeNode, bool 
fevsSafe=true);
-    void*             getPbeBApplier(SaUint32T* pbeConn, unsigned int* 
pbeNode, bool fevsSafe=true);
+    void*             getPbeBSlave(SaUint32T* pbeConn, unsigned int* pbeNode, 
bool fevsSafe=true);
     ImplementerInfo*  getSpecialApplier();
     bool              specialApplyForClass(ClassInfo* classInfo);
     SaUint32T         findConnForImplementerOfObject(std::string objectDn);
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
@@ -5237,6 +5237,7 @@ static void immnd_evt_proc_rt_object_cre
        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;
@@ -5253,10 +5254,10 @@ static void immnd_evt_proc_rt_object_cre
 
        if (originatedAtThisNd) {
                err = immModel_rtObjectCreate(cb, &(evt->info.objCreate), 
reqConn, nodeId,
-                       &continuationId, &pbeConn, pbeNodeIdPtr, &spApplConn);
+                       &continuationId, &pbeConn, pbeNodeIdPtr, &spApplConn, 
&pbe2BConn);
        } else {
                err = immModel_rtObjectCreate(cb, &(evt->info.objCreate), 0, 
nodeId,
-                       &continuationId, &pbeConn, pbeNodeIdPtr, &spApplConn);
+                       &continuationId, &pbeConn, pbeNodeIdPtr, &spApplConn, 
&pbe2BConn);
        }
 
        if(pbeNodeId && err == SA_AIS_OK) {
@@ -5264,6 +5265,7 @@ static void immnd_evt_proc_rt_object_cre
                delayedReply = SA_TRUE; 
                if(pbeConn) {
                        /*The persistent back-end is executing at THIS node. */
+                       osafassert(!pbe2BConn);
                        osafassert(cb->mIsCoord);
                        osafassert(pbeNodeId);
                        osafassert(pbeNodeId == cb->node_id);
@@ -5305,7 +5307,53 @@ static void immnd_evt_proc_rt_object_cre
                        }
                        implHandle = 0LL;
                        pbe_cl_node = NULL;
-               }
+
+               } 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.");
+                       implHandle = m_IMMSV_PACK_HANDLE(pbe2BConn, 
cb->node_id);
+
+                       /*Fetch client node for 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 create is delayed!");
+                               /* ****
+                                  TODO: send a fevs faked reply from PBE SLAVE 
indicating
+                                  failure to update. This will rollback the 
rtObjCreate.
+                                  Currently it should get cleaned up by 
cleanTheBasement,
+                                  but that will typically lead to ERR_TIMEOUT 
for the 
+                                  OI client.
+                                  The primary PBE will fail to get ack from 
slave and also fail.
+                               */
+                       } else {
+                               memset(&send_evt, '\0', sizeof(IMMSV_EVT));
+                               send_evt.type = IMMSV_EVT_TYPE_IMMA;
+                               send_evt.info.imma.type = 
IMMA_EVT_ND2A_OI_OBJ_CREATE_UC;
+                               send_evt.info.imma.info.objCreate = 
evt->info.objCreate;
+                               send_evt.info.imma.info.objCreate.adminOwnerId 
= 
+                                       continuationId;
+                               /*We re-use the adminOwner member of the 
ccbCreate message
+                                 to hold the continuation id. */
+                               send_evt.info.imma.info.objCreate.immHandle = 
implHandle;
+                               osafassert(evt->info.objCreate.ccbId == 0);
+
+                               TRACE_2("MAKING PBE-SLAVE PERSISTENT RT-OBJ 
CREATE upcall");
+                               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 create "
+                                               "to PBE failed!");
+                                       /* See comment **** above. */
+                               }
+                       }
+                       implHandle = 0LL;
+                       pbe_cl_node = NULL;
+               }
+
 
                if(spApplConn) {
                        /* If we get here then there is a special applier 
attached locally
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
@@ -283,7 +283,7 @@ extern "C" {
 
        void immModel_genSpecialModify(IMMND_CB *cb, struct 
ImmsvOmCcbObjectModify *req);
 
-       SaBoolT immModel_pbeBApplierExists(IMMND_CB *cb);
+       SaBoolT immModel_pbeBSlaveExists(IMMND_CB *cb);
 
        SaBoolT immModel_protocol41Allowed(IMMND_CB *cb);
        SaBoolT immModel_protocol43Allowed(IMMND_CB *cb);
@@ -358,7 +358,7 @@ extern "C" {
            immModel_rtObjectCreate(IMMND_CB *cb,
                    struct ImmsvOmCcbObjectCreate *req,
                    SaUint32T implConn, SaClmNodeIdT implNodeId, SaUint32T 
*continuationId,
-                   SaUint32T *pbeConn, SaClmNodeIdT *pbeNodeId, SaUint32T 
*spAplConn);
+                   SaUint32T *pbeConn, SaClmNodeIdT *pbeNodeId, SaUint32T 
*spAplConn, SaUint32T *pbe2BConn);
 
        SaAisErrorT
            immModel_rtObjectDelete(IMMND_CB *cb,
diff --git a/osaf/services/saf/immsv/immnd/immnd_proc.c 
b/osaf/services/saf/immsv/immnd/immnd_proc.c
--- a/osaf/services/saf/immsv/immnd/immnd_proc.c
+++ b/osaf/services/saf/immsv/immnd/immnd_proc.c
@@ -951,9 +951,9 @@ static void immnd_cleanTheHouse(IMMND_CB
                }
 
                if(!(cb->mPbeVeteranB)) {
-                       cb->mPbeVeteranB = immModel_pbeBApplierExists(cb) && 
immModel_pbeIsInSync(cb, false);
+                       cb->mPbeVeteranB = immModel_pbeBSlaveExists(cb) && 
immModel_pbeIsInSync(cb, false);
                        if(cb->mPbeVeteranB && cb->mCanBeCoord) {
-                               LOG_NO("Secondary PBE applier established on %s 
SC. Dumping incrementally to file %s", 
+                               LOG_NO("PBE slave established on %s SC. Dumping 
incrementally to file %s", 
                                        (cb->mIsCoord)?"other":"this",  
cb->mPbeFile);
                        }
                }
diff --git a/osaf/services/saf/immsv/immpbed/immpbe_daemon.cc 
b/osaf/services/saf/immsv/immpbed/immpbe_daemon.cc
--- a/osaf/services/saf/immsv/immpbed/immpbe_daemon.cc
+++ b/osaf/services/saf/immsv/immpbed/immpbe_daemon.cc
@@ -675,7 +675,7 @@ static SaAisErrorT saImmOiCcbObjectModif
                }
        }
 
-       if(ccbId == 0) {
+       if(ccbId > 0x100000000LL) { /* PRTO update operation. */
                const SaImmAttrModificationT_2 *attMod = NULL;
                int ix=0;
                std::string objName;
@@ -752,7 +752,7 @@ static SaAisErrorT saImmOiCcbObjectModif
                }
 
 
-               ccbutil_deleteCcbData(ccbutil_findCcbData(0));
+               ccbutil_deleteCcbData(ccbutil_findCcbData(ccbId));
 
                rc = pbeCommitTrans(sDbHandle, ccbId, sEpoch, 
&sLastCcbCommitTime);
                if(rc != SA_AIS_OK) {
@@ -1126,7 +1126,7 @@ static SaAisErrorT saImmOiCcbObjectCreat
                goto done;              
        }
 
-       if(ccbId == 0) {
+       if(ccbId > 0x100000000LL) {
                TRACE("Create of PERSISTENT runtime object with DN: %s",
                        operation->objectName.value);
                rc = pbeBeginTrans(sDbHandle);

------------------------------------------------------------------------------
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