osaf/libs/common/immsv/immpbe_dump.cc            |   57 +++-
 osaf/libs/common/immsv/include/immsv_api.h       |    4 +-
 osaf/services/saf/immsv/immloadd/imm_loader.cc   |    7 +-
 osaf/services/saf/immsv/immnd/ImmModel.cc        |  106 ++++---
 osaf/services/saf/immsv/immnd/ImmModel.hh        |    3 +-
 osaf/services/saf/immsv/immnd/immnd_evt.c        |    2 +-
 osaf/services/saf/immsv/immnd/immnd_proc.c       |   10 +-
 osaf/services/saf/immsv/immpbed/immpbe_daemon.cc |  302 +++++++++++++++++-----
 8 files changed, 353 insertions(+), 138 deletions(-)


This is a testpatch containing a test version of the 2PBE class-handling.
This patch will not be pushed. The intent with this patch is to allow
testing and obtaining feedback on the 2PBE handling of imm classes.
This test-patch goes on top of the "2PBE ccb-handling" testpatch.

diff --git a/osaf/libs/common/immsv/immpbe_dump.cc 
b/osaf/libs/common/immsv/immpbe_dump.cc
--- a/osaf/libs/common/immsv/immpbe_dump.cc
+++ b/osaf/libs/common/immsv/immpbe_dump.cc
@@ -122,6 +122,8 @@ static const char *preparedSql[] = {

 static sqlite3_stmt *preparedStmt[SQL_STMT_SIZE] = { NULL };

+static unsigned int sqliteTransLock=0; /* advisory lock */
+

 static int prepareSqlStatements(sqlite3 *dbHandle) {
        int i;
@@ -2592,6 +2594,33 @@ SaAisErrorT pbeBeginTrans(void* db_handl
        sqlite3* dbHandle = (sqlite3 *) db_handle;
        char *execErr=NULL;
        int rc=0;
+       unsigned int try_count=0;
+       unsigned int maxTries=20;
+
+       /* This is not true safe lock handling between threads.
+          Sqlite is supposedly threadsafe, but we dont want to
+          rely on that. With 2PBE, the single sqlite handle is
+          used from both the main thread and the runtime thread.
+          This particularly in the SLAVE PBE.
+          The distributed protocol between primary PBE and slave PBE
+          has been designed so that the two threads (in the slave PBE)
+          "should" never end up using the sqlite handle at the same
+          time. In essence only one "job" at a time is being commited
+          to sqlite by the PBEs, by either thread but not both.
+          This advisory lock is used only to detect interference
+          that should not occurr.  */
+       while(sqliteTransLock) {
+               LOG_WA("Sqlite db locked by other thread.");
+               if(try_count < maxTries) {
+                       usleep(500000);
+                       ++try_count;
+               } else {
+                       LOG_ER("Sqlite db bussy with other transaction");
+                       return SA_AIS_ERR_FAILED_OPERATION;
+               }
+       }
+
+       ++sqliteTransLock;

        rc = sqlite3_exec(dbHandle, "BEGIN EXCLUSIVE TRANSACTION", NULL, NULL, 
&execErr);
        if(rc != SQLITE_OK) {
@@ -2610,6 +2639,9 @@ SaAisErrorT pbeCommitTrans(void* db_hand
        int rc=0;
        unsigned int commitTime=0;
        time_t now = time(NULL);
+       SaAisErrorT err = SA_AIS_OK;
+
+       assert(sqliteTransLock);

        if(ccbId) {
                sqlite3_stmt *stmt = preparedStmt[SQL_INS_CCB_COMMITS];
@@ -2619,22 +2651,26 @@ SaAisErrorT pbeCommitTrans(void* db_hand

                if((rc = sqlite3_bind_int64(stmt, 1, ccbId)) != SQLITE_OK) {
                        LOG_ER("Failed to bind ccb_id with error code: %d", rc);
-                       return SA_AIS_ERR_FAILED_OPERATION;
+                       err = SA_AIS_ERR_FAILED_OPERATION;
+                       goto done;
                }
                if((rc = sqlite3_bind_int(stmt, 2, currentEpoch)) != SQLITE_OK) 
{
                        LOG_ER("Failed to bind epoch with error code: %d", rc);
-                       return SA_AIS_ERR_FAILED_OPERATION;
+                       err = SA_AIS_ERR_FAILED_OPERATION;
+                       goto done;
                }
                if((rc = sqlite3_bind_int(stmt, 3, commitTime)) != SQLITE_OK) {
                        LOG_ER("Failed to bind commit_time with error code: 
%d", rc);
-                       return SA_AIS_ERR_FAILED_OPERATION;
+                       err = SA_AIS_ERR_FAILED_OPERATION;
+                       goto done;
                }
                rc = sqlite3_step(stmt);
                if(rc != SQLITE_DONE) {
                        LOG_ER("SQL statement ('%s') failed because:\n %s",
                                preparedSql[SQL_INS_CCB_COMMITS], 
sqlite3_errmsg(dbHandle));
                        pbeAbortTrans(db_handle);
-                       return SA_AIS_ERR_FAILED_OPERATION;
+                       err = SA_AIS_ERR_FAILED_OPERATION;
+                       goto done;
                }
                sqlite3_reset(stmt);
        }
@@ -2644,12 +2680,14 @@ SaAisErrorT pbeCommitTrans(void* db_hand
                LOG_ER("SQL statement ('COMMIT TRANSACTION') failed because:\n 
%s",
                        execErr);
                sqlite3_free(execErr);
-               return SA_AIS_ERR_FAILED_OPERATION;
+               err = SA_AIS_ERR_FAILED_OPERATION;
+               goto done;
        }

-       fsyncPbeJournalFile();
-
-       return SA_AIS_OK;
+ done:
+       --sqliteTransLock;
+       fsyncPbeJournalFile(); /* This should not be needed. sqlite does double 
fsync itself */
+       return err;
 }

 void purgeCcbCommitsFromPbe(void* db_handle, SaUint32T currentEpoch)
@@ -2688,6 +2726,8 @@ void pbeAbortTrans(void* db_handle)
        char *execErr=NULL;
        int rc=0;

+       assert(sqliteTransLock);
+
        rc = sqlite3_exec(dbHandle, "ROLLBACK", NULL, NULL, &execErr);
        if(rc != SQLITE_OK) {
                LOG_ER("SQL statement ('ROLLBACK') failed because:\n %s",
@@ -2697,6 +2737,7 @@ void pbeAbortTrans(void* db_handle)
                LOG_ER("Exiting (line:%u)", __LINE__);
                exit(1);
        }
+       --sqliteTransLock;
 }

 SaAisErrorT getCcbOutcomeFromPbe(void* db_handle, SaUint64T ccbId, SaUint32T 
currentEpoch)
diff --git a/osaf/libs/common/immsv/include/immsv_api.h 
b/osaf/libs/common/immsv/include/immsv_api.h
--- a/osaf/libs/common/immsv/include/immsv_api.h
+++ b/osaf/libs/common/immsv/include/immsv_api.h
@@ -97,8 +97,8 @@ extern "C" {
 #define OPENSAF_IMM_PBE_CLASS_DELETE 0x20000000
 #define OPENSAF_IMM_PBE_UPDATE_EPOCH 0x30000000
 #define OPENSAF_IMM_2PBE_PRELOAD_STAT 0x40000000
-/* Internal Admin operation names. */
-#define OPENSAF_IMM_PBE_CCB_PREPARE  "OsafImmPrepare"
+#define OPENSAF_IMM_PBE_CCB_PREPARE 0x50000000
+
 /* Public operation ids on OpenSafImmPBE */
 #define OPENSAF_IMM_NOST_FLAG_ON     0x00000001
 #define OPENSAF_IMM_NOST_FLAG_OFF    0x00000002
diff --git a/osaf/services/saf/immsv/immloadd/imm_loader.cc 
b/osaf/services/saf/immsv/immloadd/imm_loader.cc
--- a/osaf/services/saf/immsv/immloadd/imm_loader.cc
+++ b/osaf/services/saf/immsv/immloadd/imm_loader.cc
@@ -2588,7 +2588,12 @@ int main(int argc, char* argv[])
             }
         }
     }
-    LOG_NO("Load ending normally");
+
+    if(preload) {
+           LOG_IN("Pre-load ending normally");
+    } else {
+           LOG_NO("Load ending normally");
+    }
     return 0;

 err:
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
@@ -487,7 +487,7 @@ SaAisErrorT
 immModel_adminOwnerDelete(IMMND_CB *cb, SaUint32T ownerId, SaUint32T hard)
 {
     return ImmModel::instance(&cb->immModel)->
-        adminOwnerDelete(ownerId, hard);
+        adminOwnerDelete(ownerId, hard, cb->m2Pbe);
 }


@@ -3677,7 +3677,7 @@ ImmModel::adminOwnerCreate(const ImmsvOm
  * Deletes and admin owner.
  */
 SaAisErrorT
-ImmModel::adminOwnerDelete(SaUint32T ownerId, bool hard)
+ImmModel::adminOwnerDelete(SaUint32T ownerId, bool hard, bool pbe2)
 {
     SaAisErrorT err = SA_AIS_OK;

@@ -3703,20 +3703,21 @@ ImmModel::adminOwnerDelete(SaUint32T own
             //In coord the loader-pid was positive.
             //In non-coords the loader-pid was negative.
             if(hard) {
-                if(this->loaderPid > 0) {
-                    LOG_WA("Hard close of admin owner IMMLOADER "
-                        "=> Loading must have failed");
+                if((this->loaderPid > 0) && (!pbe2 || (ownerId >2))) {
+                    LOG_WA("Hard close of admin owner IMMLOADER id(%u)"
+                        "=> Loading must have failed", ownerId);
                 } else if(this->loaderPid == (-1)) {
                     LOG_IN("Hard close of admin owner IMMLOADER id(%u) "
-                        "=> Must be from pre-loader", ownerId);
-                } else {
+                           "=> Must be from pre-loader ? %u", ownerId, pbe2);
+                    //osafassert(pbe2);
+                } else if(loaderPid==0){
                     LOG_IN("Hard close of admin owner IMMLOADER id(%u) "
                         "but loading is done", ownerId);
                 }
             } else {
                 if(this->getLoader() && (sImmNodeState == IMM_NODE_LOADING)) {
-                    LOG_NO("Closing admin owner IMMLOADER, "
-                        "loading of IMM done");
+                    LOG_NO("Closing admin owner IMMLOADER id(%u), "
+                        "loading of IMM done", ownerId);
                     this->setLoader(0);
                     /* BEGIN Temporary code for enabling opensaf imm 4.1
                        protocol when cluster has been loaded.
@@ -8730,18 +8731,21 @@ SaAisErrorT ImmModel::adminOperationInvo
     SaUint32T adminOwnerId = req->adminOwnerId;

     AdminOwnerInfo* adminOwner = 0;
-    //ClassInfo* classInfo = 0;
     ObjectInfo* object = 0;

     ImplementerEvtMap::iterator iem;
     AdminOwnerVector::iterator i2;
     ObjectMap::iterator oi;
     std::string objAdminOwnerName;
-
+    CcbVector::iterator i3;
+    SaUint32T ccbIdOfObj = 0;
+    bool admoMissmatch=false;
+    bool ccbBusy=false;
+
     if(! (nameCheck(objectName)||nameToInternal(objectName)) ) {
         LOG_NO("ERR_INVALID_PARAM: Not a proper object name");
-        TRACE_LEAVE();
-        return SA_AIS_ERR_INVALID_PARAM;
+        err = SA_AIS_ERR_INVALID_PARAM;
+        goto done;
     }

     i2 = std::find_if(sOwnerVector.begin(), sOwnerVector.end(),
@@ -8752,15 +8756,15 @@ SaAisErrorT ImmModel::adminOperationInvo
     }
     if (i2 == sOwnerVector.end()) {
         LOG_NO("ERR_BAD_HANDLE: admin owner id %u does not exist", 
adminOwnerId);
-        TRACE_LEAVE();
-        return SA_AIS_ERR_BAD_HANDLE;
+        err = SA_AIS_ERR_BAD_HANDLE;
+        goto done;
     }
     adminOwner = *i2;

     if (objectName.empty()) {
         LOG_NO("ERR_INVALID_PARAM: Empty DN attribute value");
-        TRACE_LEAVE();
-        return SA_AIS_ERR_INVALID_PARAM;
+        err = SA_AIS_ERR_INVALID_PARAM;
+        goto done;
     }

     oi = sObjectMap.find(objectName);
@@ -8768,14 +8772,13 @@ SaAisErrorT ImmModel::adminOperationInvo
         /*ESCAPE SPECIAL CASE FOR HANDLING PRELOAD. */
         if((sImmNodeState == IMM_NODE_UNKNOWN) && (objectName == immObjectDn) 
&&
            (req->operationId == OPENSAF_IMM_2PBE_PRELOAD_STAT)) {
-            TRACE_5("Bouncing special preload admin-op");
-            TRACE_LEAVE();
-            return SA_AIS_ERR_REPAIR_PENDING;
-        }
-
-        TRACE_7("ERR_NOT_EXIST: object '%s' does not exist", 
objectName.c_str());
-        TRACE_LEAVE();
-        return SA_AIS_ERR_NOT_EXIST;
+            TRACE_7("Bouncing special preload admin-op");
+            err = SA_AIS_ERR_REPAIR_PENDING;
+        } else {
+            TRACE_7("ERR_NOT_EXIST: object '%s' does not exist", 
objectName.c_str());
+            err = SA_AIS_ERR_NOT_EXIST;
+        }
+        goto done;
     }

     object = oi->second;
@@ -8783,27 +8786,18 @@ SaAisErrorT ImmModel::adminOperationInvo

     if(objAdminOwnerName != adminOwner->mAdminOwnerName)
     {
-        LOG_NO("ERR_BAD_OPERATION: Mismatch on administrative owner %s/%u != 
%s/%u",
-            objAdminOwnerName.c_str(),
-            (unsigned int) objAdminOwnerName.size(),
-            adminOwner->mAdminOwnerName.c_str(),
-            (unsigned int) adminOwner->mAdminOwnerName.size());
-        TRACE_LEAVE();
-        return SA_AIS_ERR_BAD_OPERATION;
-    }
-
-    CcbVector::iterator i3;
-    SaUint32T ccbIdOfObj = object->mCcbId;
+        /* Let implementer errors overide this error. */
+        admoMissmatch=true;
+    }
+
+    ccbIdOfObj = object->mCcbId;
     if(ccbIdOfObj) {//check for ccb interference
         i3 = std::find_if(sCcbVector.begin(), sCcbVector.end(), 
CcbIdIs(ccbIdOfObj));
         if (i3 != sCcbVector.end() && (*i3)->isActive()) {
-            LOG_NO("ERR_BUSY: ccb id %u is active on object %s",
-                ccbIdOfObj, objectName.c_str());
-            TRACE_LEAVE();
-            return SA_AIS_ERR_BUSY;
-        }
-    }
-
+            /* Let implementer errors overide this error. */
+            ccbBusy=true;
+        }
+    }

     // Check for call on object implementer
     if(object->mImplementer && object->mImplementer->mNodeId) {
@@ -8822,9 +8816,9 @@ 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_WA("Assuming reply for adminOp %llu arrived before 
request.", saInv);
+                LOG_IN("Assuming reply for adminOp %llu arrived before 
request.", saInv);
             } else {
                 TRACE("Located pre request continuation %llu adjusting timeout"
                     " to %u", saInv, timeout);
@@ -8843,9 +8837,6 @@ SaAisErrorT ImmModel::adminOperationInvo
                 err = (iem != sImplDetachTime.end())?
                     SA_AIS_ERR_TRY_AGAIN:SA_AIS_ERR_NOT_EXIST;

-                if(reqConn) {
-                    fetchAdmReqContinuation(saInv, &reqConn);/* Remove any 
request cont. */
-                }
                 *implConn = 0;
             } else {
                 if(object->mImplementer->mAdminOpBusy) {
@@ -8884,6 +8875,25 @@ SaAisErrorT ImmModel::adminOperationInvo
             }
         }
     }
+
+    if((err == SA_AIS_OK) && ccbBusy) {
+        LOG_NO("ERR_BUSY: ccb id %u is active on object %s",
+            ccbIdOfObj, objectName.c_str());
+        err = SA_AIS_ERR_BUSY;
+    }
+
+    if((err == SA_AIS_OK) && admoMissmatch) {
+        LOG_NO("ERR_BAD_OPERATION: Mismatch on administrative owner '%s' != 
'%s'",
+            objAdminOwnerName.c_str(), adminOwner->mAdminOwnerName.c_str());
+        err= SA_AIS_ERR_BAD_OPERATION;
+    }
+
+ done:
+
+    if(err != SA_AIS_OK) {
+        fetchAdmReqContinuation(saInv, &reqConn);/* Remove any request cont. */
+    }
+
     TRACE_LEAVE();
     return err;
 }
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
@@ -146,7 +146,8 @@ public:
                                          SaUint32T conn,
                                          unsigned int nodeId);

-    SaAisErrorT         adminOwnerDelete(SaUint32T ownerId, bool hard);
+    SaAisErrorT         adminOwnerDelete(SaUint32T ownerId, bool hard,
+                                         bool pbe2=false);

     SaAisErrorT         adminOwnerChange(
                                          const immsv_a2nd_admown_set* req,
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
@@ -773,7 +773,7 @@ static uint32_t immnd_evt_proc_imm_init(
        if (sync_pid && (cl_node->client_pid == sync_pid)) {
                TRACE_2("Sync agent attached, pid: %u", sync_pid);
                cl_node->mIsSync = 1;
-       } else  if (pbe_pid && (cl_node->client_pid == pbe_pid) && !isOm) {
+       } else  if (pbe_pid && (cl_node->client_pid == pbe_pid) && !isOm && 
!(cl_node->mIsPbe)) {
                LOG_NO("Persistent Back End OI attached, pid: %u", pbe_pid);
                cl_node->mIsPbe = 1;
        }
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
@@ -1649,6 +1649,8 @@ uint32_t immnd_proc_server(uint32_t *tim
                        if (waitpid(cb->preLoadPid, &status, WNOHANG) > 0) {
                                cb->preLoadPid = 0;
                                LOG_NO("Local preloader at %x completed 
successfully", cb->node_id);
+                       } else {
+                               break; /* Wait for preloader to terminate 
before starting loader. */
                        }
                }

@@ -2053,7 +2055,7 @@ uint32_t immnd_proc_server(uint32_t *tim
                                        kill(cb->pbePid2, SIGKILL);
                                }
                        }
-               } else if(coord != 1 && cb->mCanBeCoord) {/* => this is standby 
immnd. */
+               } else if(coord != 1 && cb->mCanBeCoord) {/* => this is standby 
for coord immnd. */
                        osafassert(cb->pbePid <= 0); /* Primary PBE must never 
have been started at non coord. */
                        if (cb->mPbeFile && cb->m2Pbe) { /* 2PBE configured => 
impacts non coord sc immnd */
                                if (cb->mRim == SA_IMM_KEEP_REPOSITORY) {
@@ -2062,14 +2064,14 @@ uint32_t immnd_proc_server(uint32_t *tim
                                                /* Primary PBE is available. */
                                                if(cb->pbePid2 <= 0) {
                                                        /* SLAVE PBE is not 
running, try to start it. */
-                                                       LOG_NO("STARTING 
STANDBY PBE process.");
+                                                       LOG_NO("STARTING SLAVE 
PBE process.");
                                                        cb->pbePid2 = 
immnd_forkPbe(cb);
                                                }
                                        } else if(cb->pbePid2 <= 0) {
-                                               LOG_IN("Postponing start of 
STANDBY PBE until primary PBE has atached.");
+                                               LOG_IN("Postponing start of 
SLAVE PBE until primary PBE has atached.");
                                        }
                                } else if(cb->pbePid2 > 0) {
-                                       /* PBE disabled, yet STANDBY PBE is 
running => STOP it. */
+                                       /* PBE disabled, yet SLAVE PBE is 
running => STOP it. */
                                        if((cb->mPbeKills++)==0) {
                                                LOG_NO("STOPPING SLAVE PBE 
process at non coord because PBE is disabled");
                                                kill(cb->pbePid2, SIGTERM);
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
@@ -68,67 +68,60 @@ static SaTimeT sLastCcbCommitTime=0LL;

 extern struct ImmutilWrapperProfile immutilWrapperProfile;

-static bool pbe_prepare_2pbeB(SaImmOiCcbIdT ccbId, SaUint32T numOps)
+static bool pbe_prepare_ccb_2pbeB(SaImmOiCcbIdT ccbId, SaUint32T numOps)
 {
        TRACE_ENTER();
        bool retval=false;
        const SaStringT ccb_id_string = (SaStringT) "ccbId";
        const SaStringT num_ops_string = (SaStringT) "numOps";
-       const char * op_prepare_string = OPENSAF_IMM_PBE_CCB_PREPARE;
-       /*      const void* vp = &op_prepare_string;*/

-       /* Check if standby PBE is down, if so return true if standby PBE is 
inactive or disabled. */
+       /* Check if slave PBE is down, if so return true if slave PBE is 
inactive or disabled. */

        unsigned int msecs_waited = 0;
        SaAisErrorT rc2B = SA_AIS_OK;
-       SaAisErrorT peerPbeRtReply = SA_AIS_OK;
-       SaNameT peerPbeRtObjName = {sizeof(OPENSAF_IMM_PBE_RT_OBJECT_DN_B), 
OPENSAF_IMM_PBE_RT_OBJECT_DN_B};
+       SaAisErrorT slavePbeRtReply = SA_AIS_OK;
+       SaNameT slavePbeRtObjName = {sizeof(OPENSAF_IMM_PBE_RT_OBJECT_DN_B), 
OPENSAF_IMM_PBE_RT_OBJECT_DN_B};


-       /* Fungerar inte eftersom OI strukturer inte kan nås från OM LIB'et. */
+       /* ABT Problem med numOps eftersom OI strukturer inte kan nås från OM 
LIB'et. */
+
        const SaImmAdminOperationParamsT_2 param0 = {
-               (SaStringT) SA_IMM_PARAM_ADMOP_NAME,
-               SA_IMM_ATTR_SASTRINGT,
-               &op_prepare_string
-       };
-
-       const SaImmAdminOperationParamsT_2 param1 = {
                ccb_id_string,
                SA_IMM_ATTR_SAUINT64T,
                &ccbId
        };

-       const SaImmAdminOperationParamsT_2 param2 = {
+       const SaImmAdminOperationParamsT_2 param1 = {
                num_ops_string,
                SA_IMM_ATTR_SAUINT64T,
                &pbeOiHandle
        };

-       const SaImmAdminOperationParamsT_2 param3 = {
+       const SaImmAdminOperationParamsT_2 param2 = {
                num_ops_string,
                SA_IMM_ATTR_SAUINT32T,
                &numOps
        };

-       const SaImmAdminOperationParamsT_2 *params[] = {&param0, &param1, 
&param2, &param3, NULL};
+       const SaImmAdminOperationParamsT_2 *params[] = {&param0, &param1, 
&param2, NULL};

        do{
-               rc2B = saImmOmAdminOperationInvoke_2(sOwnerHandle, 
&peerPbeRtObjName, 0, SA_IMM_PARAM_ADMOP_ID_ESC,
-                       params, &peerPbeRtReply, SA_TIME_ONE_SECOND * 10);
+               rc2B = saImmOmAdminOperationInvoke_2(sOwnerHandle, 
&slavePbeRtObjName, 0, OPENSAF_IMM_PBE_CCB_PREPARE,
+                       params, &slavePbeRtReply, SA_TIME_ONE_SECOND * 10);

                if(rc2B == SA_AIS_ERR_TRY_AGAIN) {
                        usleep(sleep_delay_ms * 1000);
                        msecs_waited += sleep_delay_ms;
                }
                /* Adjust the waiting time,a bove & below  to be more 
appropriate .... */
-       } while (((rc2B == SA_AIS_ERR_TRY_AGAIN) || (peerPbeRtReply == 
SA_AIS_ERR_TRY_AGAIN)) && (msecs_waited < 10000));
+       } while (((rc2B == SA_AIS_ERR_TRY_AGAIN) || (slavePbeRtReply == 
SA_AIS_ERR_TRY_AGAIN)) && (msecs_waited < 25000));

        if(rc2B != SA_AIS_OK) {
-               LOG_WA("Start prepare for ccb: %llu towards standby PBE 
returned: '%u' from Immsv", ccbId, rc2B);
-       } else if(peerPbeRtReply != SA_AIS_OK) {
-               LOG_WA("Start prepare for ccb: %llu towards standby PBE 
returned: '%u' from sttandby PBE", ccbId, peerPbeRtReply);
+               LOG_WA("Start prepare for ccb: %llu towards slave PBE returned: 
'%u' from Immsv", ccbId, rc2B);
+       } else if(slavePbeRtReply != SA_AIS_OK) {
+               LOG_WA("Start prepare for ccb: %llu towards slave PBE returned: 
'%u' from sttandby PBE", ccbId, slavePbeRtReply);
        } else {
-               LOG_IN("Standby PBE replied with OK on attempt to start prepare 
of ccb:'%llu'", ccbId);
+               LOG_IN("Slave PBE replied with OK on attempt to start prepare 
of ccb:'%llu'", ccbId);
                retval=true;
        }
        TRACE_LEAVE();
@@ -146,6 +139,8 @@ static void saImmOiAdminOperationCallbac
        SaStringT sastringVal;
        SaImmAttrValueT val;
        std::string opensafObj;
+       SaImmOiCcbIdT ccbId = 0x0LL;
+       SaUint32T invoc=m_IMMSV_UNPACK_HANDLE_LOW(invocation);

        TRACE_ENTER();

@@ -158,6 +153,7 @@ static void saImmOiAdminOperationCallbac
        if(opId == OPENSAF_IMM_PBE_CLASS_CREATE) {
                bool schemaChange = false;
                bool persistentExtent = false; /* ConfigC or PrtoC. Only 
relevant if schmaChange == true */
+               bool knownConfigClass=false;
                if(!param || (param->paramType != SA_IMM_ATTR_SASTRINGT)) {
                        rc = immutil_saImmOiAdminOperationResult(immOiHandle, 
invocation, SA_AIS_ERR_INVALID_PARAM);
                        goto done;
@@ -165,6 +161,40 @@ static void saImmOiAdminOperationCallbac
                TRACE("paramName: %s paramType: %u value:%s", param->paramName, 
param->paramType, *((SaStringT *) param->paramBuffer));
                std::string className(*((SaStringT *) param->paramBuffer));

+               if(sPbe2 && !sPbe2B) {
+                       /* Forward Class Create to slave PBE. */
+                       SaAisErrorT rc2B = SA_AIS_OK;
+                       SaNameT slavePbeRtObjName = 
{sizeof(OPENSAF_IMM_PBE_RT_OBJECT_DN_B), OPENSAF_IMM_PBE_RT_OBJECT_DN_B};
+
+                       /*
+                       const SaNameT* names[] = {&slavePbeRtObjName, NULL};
+                       SaAisErrorT rc2B = saImmOmAdminOwnerSet(sOwnerHandle, 
names, SA_IMM_ONE);
+                       */
+                       if(rc2B != SA_AIS_OK) {
+                               LOG_WA("Failed to update set adminOwner for %s 
return code: %u", (char *) slavePbeRtObjName.value, rc2B);
+                       } else {
+                               SaAisErrorT slavePbeRtReply = SA_AIS_OK;
+                               rc2B = 
saImmOmAdminOperationInvoke_2(sOwnerHandle, &slavePbeRtObjName, 0, 
OPENSAF_IMM_PBE_CLASS_CREATE,
+                                       params, &slavePbeRtReply, 
SA_TIME_ONE_SECOND * 10);
+                               if(rc2B != SA_AIS_OK) {
+                                       if(rc2B == SA_AIS_ERR_NOT_EXIST) {
+                                               LOG_NO("Got ERR_NOT_EXIST on 
atempt to create class towards slave PBE");
+                                       } else {
+                                               LOG_WA("Failed to create class 
towards slave PBE. Rc:%u", rc2B);
+
+                                       }
+                               } else if(slavePbeRtReply == 
SA_AIS_ERR_REPAIR_PENDING) {
+                                       LOG_NO("Slave PBE replied with OK on 
attempt to create class %s", className.c_str());
+                               } else {
+                                       LOG_WA("Slave PBE replied with error 
'%u' on attempt to create class", slavePbeRtReply);
+
+                               }
+                       }
+                       /*Should keep track of result from slave vs result from 
here.
+                         Possibly shoot down slave if it fails repeatedly.
+                        */
+               }
+
                rc = pbeBeginTrans(sDbHandle);
                if(rc != SA_AIS_OK) {
                        LOG_WA("PBE failed to start transaction for class 
create");
@@ -177,7 +207,7 @@ static void saImmOiAdminOperationCallbac
                        ClassInfo* theClass = (*sClassIdMap)[className];
                        if(theClass) {
                                unsigned int instances=0;
-                               LOG_IN("PBE detected schema change for class 
%s", className.c_str());
+                               LOG_NO("PBE detected schema change for class 
%s", className.c_str());
                                schemaChange = true;
                                AttrMap::iterator ami = 
theClass->mAttrMap.begin();
                                if(ami == theClass->mAttrMap.end()) {
@@ -189,6 +219,7 @@ static void saImmOiAdminOperationCallbac
                                        SaImmAttrFlagsT attrFlags = ami->second;
                                        if(attrFlags & SA_IMM_ATTR_CONFIG) {
                                                persistentExtent = true;
+                                               knownConfigClass = true;
                                                break;
                                        }
                                        if(attrFlags & SA_IMM_ATTR_PERSISTENT) {
@@ -203,11 +234,13 @@ static void saImmOiAdminOperationCallbac
                                        LOG_IN("PBE removed %u old instances of 
class %s", instances, className.c_str());
                                }
                                deleteClassToPBE(className, sDbHandle, 
theClass);
+
                                if(sClassIdMap->erase(className) != 1) {
                                        LOG_ER("sClassIdMap->erase(className) 
!= 1");
                                        rc = SA_AIS_ERR_FAILED_OPERATION;
                                        goto done;
                                }
+
                                delete theClass;
                                theClass = NULL;
                                LOG_IN("PBE removed old class definition for 
%s", className.c_str());
@@ -226,7 +259,7 @@ static void saImmOiAdminOperationCallbac
                        if(persistentExtent) {
                                TRACE_5("sObjCount:%u", sObjCount);
                                obj_count = 
dumpInstancesOfClassToPBE(pbeOmHandle, sClassIdMap, className, &sObjCount, 
sDbHandle);
-                               LOG_IN("PBE dumped %u objects of new class 
definition for %s", obj_count, className.c_str());
+                               LOG_NO("PBE dumped %u objects of new class 
definition for %s", obj_count, className.c_str());
                                TRACE_5("sObjCount:%u", sObjCount);
                        }
                } else {
@@ -241,9 +274,8 @@ static void saImmOiAdminOperationCallbac
                        objectModifyAddValuesOfAttrToPBE(sDbHandle, opensafObj, 
&attrValues, 0);
                }

-               osafassert(invocation < 0x100000000LL);
-               SaImmOiCcbIdT ccbId = invocation + 0x100000000LL;
-               LOG_NO("Class create committing with ccbId:%llu", ccbId);
+               ccbId = invoc + 0x100000000LL;
+               LOG_NO("Create of class %s committing with ccbId:%llu", 
className.c_str(), ccbId);

                rc = pbeCommitTrans(sDbHandle, ccbId, sEpoch, 
&sLastCcbCommitTime);
                if(rc != SA_AIS_OK) {
@@ -256,8 +288,42 @@ static void saImmOiAdminOperationCallbac
                   unused (in immsv) error code SA_AIS_ERR_REPAIR_PENDING. This 
way the immnd can tell that this
                   is supposed to be an ok reply on PBE_CLASS_CREATE. This 
usage is internal to immsv.
                */
+
+               if(sPbe2B) {
+                       if(!knownConfigClass) {
+                               ClassInfo* theClass = (*sClassIdMap)[className];
+                               osafassert(theClass);
+                               AttrMap::iterator ami = 
theClass->mAttrMap.begin();
+                               osafassert(ami != theClass->mAttrMap.end());
+
+                               while(ami != theClass->mAttrMap.end()) {
+                                       SaImmAttrFlagsT attrFlags = ami->second;
+                                       if(attrFlags & SA_IMM_ATTR_CONFIG) {
+                                               knownConfigClass = true;
+                                               TRACE("SLAVE PBE detected 
config class");
+                                               break;
+                                       }
+                                       if(attrFlags & SA_IMM_ATTR_RUNTIME) {
+                                               TRACE("SLAVE PBE detected 
runtime class");
+                                               break;
+                                       }
+                                       ++ami;
+                               }
+                       }
+
+                       if(knownConfigClass) {
+                               rc = saImmOiClassImplementerSet(pbeOiHandle, 
(char *) className.c_str());
+                               if(rc != SA_AIS_OK) {
+                                       LOG_WA("SLAVE PBE failed to become 
applier for config class %s",
+                                               className.c_str());
+                                       goto done;
+                               }
+                       }
+               }
+
                rc = immutil_saImmOiAdminOperationResult(immOiHandle, 
invocation, SA_AIS_ERR_REPAIR_PENDING);

+
        } else if(opId == OPENSAF_IMM_PBE_CLASS_DELETE) {
                if(!param || (param->paramType != SA_IMM_ATTR_SASTRINGT)) {
                        rc = immutil_saImmOiAdminOperationResult(immOiHandle, 
invocation, SA_AIS_ERR_INVALID_PARAM);
@@ -266,6 +332,39 @@ static void saImmOiAdminOperationCallbac
                TRACE("paramName: %s paramType: %u value:%s", param->paramName, 
param->paramType, *((SaStringT *) param->paramBuffer));
                std::string className(*((SaStringT *) param->paramBuffer));

+               if(sPbe2 && !sPbe2B) {
+                       /* Forward Class Delete to slave PBE. */
+                       SaAisErrorT rc2B = SA_AIS_OK;
+                       SaNameT slavePbeRtObjName = 
{sizeof(OPENSAF_IMM_PBE_RT_OBJECT_DN_B), OPENSAF_IMM_PBE_RT_OBJECT_DN_B};
+
+                       /*
+                       const SaNameT* names[] = {&slavePbeRtObjName, NULL};
+                       SaAisErrorT rc2B = saImmOmAdminOwnerSet(sOwnerHandle, 
names, SA_IMM_ONE);
+                       */
+                       if(rc2B != SA_AIS_OK) {
+                               LOG_WA("Failed to update set adminOwner for %s 
return code: %u", (char *) slavePbeRtObjName.value, rc2B);
+                       } else {
+                               SaAisErrorT slavePbeRtReply = SA_AIS_OK;
+                               rc2B = 
saImmOmAdminOperationInvoke_2(sOwnerHandle, &slavePbeRtObjName, 0, 
OPENSAF_IMM_PBE_CLASS_DELETE,
+                                       params, &slavePbeRtReply, 
SA_TIME_ONE_SECOND * 10);
+                               if(rc2B != SA_AIS_OK) {
+                                       if(rc2B == SA_AIS_ERR_NOT_EXIST) {
+                                               LOG_NO("Got ERR_NOT_EXIST on 
atempt to delete class towards slave PBE");
+                                       } else {
+                                               LOG_WA("Failed to delete class 
towards slave PBE. Rc:%u", rc2B);
+                                       }
+                               } else if(slavePbeRtReply == 
SA_AIS_ERR_NO_SPACE) {
+                                       LOG_NO("Slave PBE replied with OK on 
attempt to delete class %s", className.c_str());
+                               } else {
+                                       LOG_WA("Slave PBE replied with error 
'%u' on attempt to delete class", slavePbeRtReply);
+                               }
+                       }
+                       /*Should keep track of result from slave vs result from 
here.
+                         Possibly shoot down slave if it fails repeatedly.
+                        */
+               }
+
+
                rc = pbeBeginTrans(sDbHandle);
                if(rc != SA_AIS_OK) {
                        LOG_WA("PBE failed to start transaction for class 
delete");
@@ -292,8 +391,7 @@ static void saImmOiAdminOperationCallbac
                objectModifyDiscardMatchingValuesOfAttrToPBE(sDbHandle, 
opensafObj,
                        &attrValues, 0);

-               osafassert(invocation < 0x100000000LL);
-               SaImmOiCcbIdT ccbId = invocation + 0x100000000LL;
+               ccbId = invoc + 0x100000000LL;
                LOG_NO("Class delete committing with ccbId:%llu", ccbId);

                rc = pbeCommitTrans(sDbHandle, ccbId, sEpoch, 
&sLastCcbCommitTime);
@@ -317,9 +415,6 @@ static void saImmOiAdminOperationCallbac
                rc = immutil_saImmOiAdminOperationResult(immOiHandle, 
invocation, SA_AIS_ERR_NO_SPACE);

        } else if(opId == OPENSAF_IMM_PBE_UPDATE_EPOCH) {
-               SaImmOiCcbIdT ccbId = 0x0LL;
-               SaUint32T invoc=m_IMMSV_UNPACK_HANDLE_LOW(invocation);
-
                if(!param || (param->paramType != SA_IMM_ATTR_SAUINT32T)) {
                        rc = immutil_saImmOiAdminOperationResult(immOiHandle, 
invocation, SA_AIS_ERR_INVALID_PARAM);
                        goto done;
@@ -328,7 +423,7 @@ static void saImmOiAdminOperationCallbac
                SaUint32T epoch = (*((SaUint32T *) param->paramBuffer));

                if(sPbe2 && !sPbe2B) {
-                       /* Forward update epoch to standby PBE. */
+                       /* Forward update epoch to slave PBE. */
                        /* Note potential concurrency problem towards sqlite 
here.
                           Sqlite is supposed to be threadsafe, but ..
                           Its good to have separate thread for responding on 
RTA read requests.
@@ -336,34 +431,36 @@ static void saImmOiAdminOperationCallbac
                           same thread that is the ccb applier thread. Let that 
thread exclusively access sqlite.
                         */
                        SaAisErrorT rc2B = SA_AIS_OK;
-                       SaNameT peerPbeRtObjName = 
{sizeof(OPENSAF_IMM_PBE_RT_OBJECT_DN_B), OPENSAF_IMM_PBE_RT_OBJECT_DN_B};
+                       SaNameT slavePbeRtObjName = 
{sizeof(OPENSAF_IMM_PBE_RT_OBJECT_DN_B), OPENSAF_IMM_PBE_RT_OBJECT_DN_B};
                        /*
-                       const SaNameT* names[] = {&peerPbeRtObjName, NULL};
+                       const SaNameT* names[] = {&slavePbeRtObjName, NULL};
                        SaAisErrorT rc2B = saImmOmAdminOwnerSet(sOwnerHandle, 
names, SA_IMM_ONE);
                        */
                        if(rc2B != SA_AIS_OK) {
-                               LOG_WA("Failed to update set adminOwner for %s 
return code: %u", (char *) peerPbeRtObjName.value, rc2B);
+                               LOG_WA("Failed to update set adminOwner for %s 
return code: %u", (char *) slavePbeRtObjName.value, rc2B);
                        } else {
-                               SaAisErrorT peerPbeRtReply = SA_AIS_OK;
-                               rc2B = 
saImmOmAdminOperationInvoke_2(sOwnerHandle, &peerPbeRtObjName, 0, 
OPENSAF_IMM_PBE_UPDATE_EPOCH,
-                                       params, &peerPbeRtReply, 
SA_TIME_ONE_SECOND * 10);
+                               SaAisErrorT slavePbeRtReply = SA_AIS_OK;
+                               rc2B = 
saImmOmAdminOperationInvoke_2(sOwnerHandle, &slavePbeRtObjName, 0, 
OPENSAF_IMM_PBE_UPDATE_EPOCH,
+                                       params, &slavePbeRtReply, 
SA_TIME_ONE_SECOND * 10);
                                if(rc2B != SA_AIS_OK) {
                                        if(rc2B == SA_AIS_ERR_NOT_EXIST) {
-                                               LOG_NO("Got ERR_NOT_EXIST on 
atempt to update epoch towards standby PBE");
+                                               LOG_NO("Got ERR_NOT_EXIST on 
atempt to update epoch towards slave PBE");
                                        } else {
-                                               LOG_WA("Failed to update epoch 
towards standby PBE. Rc:%u", rc2B);
+                                               LOG_WA("Failed to update epoch 
towards slave PBE. Rc:%u", rc2B);
                                        }
-                               } else if(peerPbeRtReply == 
SA_AIS_ERR_QUEUE_NOT_AVAILABLE) {
-                                       LOG_NO("Peer PBE replied with OK on 
attempt to update epoch");
+                               } else if(slavePbeRtReply == 
SA_AIS_ERR_QUEUE_NOT_AVAILABLE) {
+                                       LOG_NO("Slave PBE replied with OK on 
attempt to update epoch");
                                } else {
-                                       LOG_WA("Perr PBE replied with error 
'%u' on attempt to update epoch", peerPbeRtReply);
+                                       LOG_WA("Slave PBE replied with error 
'%u' on attempt to update epoch", slavePbeRtReply);
                                }
                        }
-                       /*Should keep track of result from peer vs result from 
here.
-                         Possibly shoot down peer if it fails repeatedly.
+                       /* ABT Should keep track of result from slave here.
+                         Possibly shoot down slave if it fails repeatedly.
+                         Can not reject set-epoch though.
                         */
                }

+
                if(sEpoch >= epoch) {
                        TRACE("Current epoch %u already equal or greater than 
%u ignoring", sEpoch, epoch);
                        if(sEpoch == epoch) {
@@ -393,9 +490,8 @@ static void saImmOiAdminOperationCallbac

                purgeCcbCommitsFromPbe(sDbHandle, sEpoch);

-LOG_NO("ABT UPDATE EPOCH INVOCATION:%u", invoc);
                ccbId = invoc + 0x100000000LL;
-               LOG_NO("Update epoch committing with ccbId:%llu", ccbId);
+               LOG_NO("Update epoch %u committing with ccbId:%llu", sEpoch, 
ccbId);
                rc = pbeCommitTrans(sDbHandle, ccbId, sEpoch, 
&sLastCcbCommitTime);
                if(rc != SA_AIS_OK) {
                        LOG_WA("PBE failed to commit transaction for update 
epoch");
@@ -429,14 +525,44 @@ LOG_NO("ABT UPDATE EPOCH INVOCATION:%u",

                SaUint32T flagsToSet = (*((SaUint32T *) param->paramBuffer));

-               sNoStdFlags |= flagsToSet;
+               if(sPbe2 && !sPbe2B) {
+                       /* Forward nost flag off to slave PBE. */
+                       SaAisErrorT rc2B = SA_AIS_OK;
+                       SaNameT slavePbeRtObjName = 
{sizeof(OPENSAF_IMM_PBE_RT_OBJECT_DN_B), OPENSAF_IMM_PBE_RT_OBJECT_DN_B};
+                       SaAisErrorT slavePbeRtReply = SA_AIS_OK;
+                       rc2B = saImmOmAdminOperationInvoke_2(sOwnerHandle, 
&slavePbeRtObjName, 0, OPENSAF_IMM_NOST_FLAG_ON,
+                               params, &slavePbeRtReply, SA_TIME_ONE_SECOND * 
10);
+                       if(rc2B != SA_AIS_OK) {
+                               if(rc2B == SA_AIS_ERR_NOT_EXIST) {
+                                       LOG_NO("Got ERR_NOT_EXIST on atempt to 
set nostFlags towards slave PBE");
+                                       /* Ignore slave when it does not exist. 
*/
+                               } else {
+                                       LOG_WA("Failed to update nostFlags 
towards slave PBE. Rc:%u", rc2B);
+                                       rc = SA_AIS_ERR_FAILED_OPERATION;
+                               }
+                       } else if(slavePbeRtReply == SA_AIS_OK) {
+                               LOG_NO("Slave PBE replied with OK on attempt to 
set nostFlags");
+                       } else {
+                               LOG_WA("Slave PBE replied with error '%u' on 
attempt to set nostFlags", slavePbeRtReply);
+                               rc = SA_AIS_ERR_FAILED_OPERATION;
+                       }
+               }
+
+               if(rc == SA_AIS_OK) {
+                       sNoStdFlags |= flagsToSet;
+                       LOG_NO("NOSTD FLAGS switched on result:%u", 
sNoStdFlags);
+               }

-
-               rc = saImmOiRtObjectUpdate_2(immOiHandle, &myObj, attrMods);
-               if(rc != SA_AIS_OK) {
-                       LOG_WA("Update of attr %s in %s failed, rc=%u",
-                               attMod.modAttr.attrName, (char *) myObj.value, 
rc);
+               if(rc == SA_AIS_OK && !sPbe2B) { /* Only primary PBE updates 
the cached RTA. */
+                       rc = saImmOiRtObjectUpdate_2(immOiHandle, &myObj, 
attrMods);
+                       if(rc != SA_AIS_OK) {
+                               sNoStdFlags &= ~flagsToSet; /* restore the flag 
value */
+                               LOG_ER("Update of cached attr %s in %s failed, 
rc=%u",
+                                       attMod.modAttr.attrName, (char *) 
myObj.value, rc);
+                               /* ABT need to shoot down or undo for slave. */
+                       }
                }
+

                rc = immutil_saImmOiAdminOperationResult(immOiHandle, 
invocation, rc);
        } else if(opId == OPENSAF_IMM_NOST_FLAG_OFF) {
@@ -458,18 +584,47 @@ LOG_NO("ABT UPDATE EPOCH INVOCATION:%u",

                SaUint32T flagsToUnSet = (*((SaUint32T *) param->paramBuffer));

-               sNoStdFlags &= ~flagsToUnSet;
+               if(sPbe2 && !sPbe2B) {
+                       /* Forward nost flag off to slave PBE. */
+                       SaAisErrorT rc2B = SA_AIS_OK;
+                       SaNameT slavePbeRtObjName = 
{sizeof(OPENSAF_IMM_PBE_RT_OBJECT_DN_B), OPENSAF_IMM_PBE_RT_OBJECT_DN_B};
+                       SaAisErrorT slavePbeRtReply = SA_AIS_OK;
+                       rc2B = saImmOmAdminOperationInvoke_2(sOwnerHandle, 
&slavePbeRtObjName, 0, OPENSAF_IMM_NOST_FLAG_OFF,
+                               params, &slavePbeRtReply, SA_TIME_ONE_SECOND * 
10);
+                       if(rc2B != SA_AIS_OK) {
+                               if(rc2B == SA_AIS_ERR_NOT_EXIST) {
+                                       LOG_NO("Got ERR_NOT_EXIST on atempt to 
un-set nostFlags towards slave PBE");
+                                       /* Ignore slave when it does not exist. 
*/
+                               } else {
+                                       LOG_WA("Failed to update nostFlags 
towards slave PBE. Rc:%u", rc2B);
+                                       rc = SA_AIS_ERR_FAILED_OPERATION;
+                               }
+                       } else if(slavePbeRtReply == SA_AIS_OK) {
+                               LOG_NO("Slave PBE replied with OK on attempt to 
un-set nostFlags");
+                       } else {
+                               LOG_WA("Slave PBE replied with error '%u' on 
attempt to un-set nostFlags", slavePbeRtReply);
+                               rc = SA_AIS_ERR_FAILED_OPERATION;
+                       }
+               }

+               if(rc == SA_AIS_OK) {
+                       sNoStdFlags &= ~flagsToUnSet;
+                       LOG_NO("NOSTD FLAGS switched off result:%u", 
sNoStdFlags);
+               }

-               rc = saImmOiRtObjectUpdate_2(immOiHandle, &myObj, attrMods);
-               if(rc != SA_AIS_OK) {
-                       LOG_WA("Update of attr %s in %s failed, rc=%u",
-                               attMod.modAttr.attrName, (char *) myObj.value, 
rc);
+               if(rc == SA_AIS_OK && !sPbe2B) { /* Only primary PBE updates 
the cached RTA. */
+                       rc = saImmOiRtObjectUpdate_2(immOiHandle, &myObj, 
attrMods);
+                       if(rc != SA_AIS_OK) {
+                               sNoStdFlags |= flagsToUnSet; /* restore the 
flag value */
+                               LOG_WA("Update of cached attribute attr %s in 
%s failed, rc=%u",
+                                       attMod.modAttr.attrName, (char *) 
myObj.value, rc);
+                               /* ABT need to shoot down or undo! slave*/
+                       }
                }

                rc = immutil_saImmOiAdminOperationResult(immOiHandle, 
invocation, rc);
-       } else if(opId == SA_IMM_PARAM_ADMOP_ID_ESC) {
-               LOG_NO("ABT short circuiting escaped admin-op for now");
+       } else if(opId == OPENSAF_IMM_PBE_CCB_PREPARE) {
+               LOG_NO("ABT short circuiting ccb-prepare admin-op for now");
                rc = immutil_saImmOiAdminOperationResult(immOiHandle, 
invocation, SA_AIS_OK);
        } else {
                LOG_WA("Invalid operation ID %llu", (SaUint64T) opId);
@@ -679,8 +834,8 @@ static SaAisErrorT saImmOiCcbCompletedCa

        TRACE("Begin PBE transaction for CCB %llu OK", ccbId);

-       if(sPbe2 && !sPbe2B && !pbe_prepare_2pbeB(ccbId, numOps)) { /* Order 
standby to start preparing. */
-               LOG_WA("Ccb:%llu failed to prepare towards standby PBE", ccbId);
+       if(sPbe2 && !sPbe2B && !pbe_prepare_ccb_2pbeB(ccbId, numOps)) { /* 
Order slave to start preparing. */
+               LOG_WA("Ccb:%llu failed to prepare towards slave PBE", ccbId);
                rc = SA_AIS_ERR_BAD_OPERATION;
                goto abort;
        }
@@ -783,12 +938,12 @@ static SaAisErrorT saImmOiCcbCompletedCa
                ccbUtilOperationData = ccbUtilOperationData->next;
        }

-       /* Query standby on prepare success, if success continue with commit
-          If not success on prepare at standby then abort.
+       /* Query slave on prepare success, if success continue with commit
+          If not success on prepare at slave then abort.
           If timeout ..... a timeout that should be long in the first place,
           then possible retry the query.
           IF NOT EXIST then...
-          The standby will comit when/if it receives the apply callback.
+          The slave will comit when/if it receives the apply callback.
         */

        rc =  pbeCommitTrans(sDbHandle, ccbId, sEpoch, &sLastCcbCommitTime);
@@ -804,8 +959,8 @@ static SaAisErrorT saImmOiCcbCompletedCa
        }

        /* Fault injection.*/
-       if(ccbId == 4) { exit(1);}
-       /**/
+       /*if(ccbId == 4) { exit(1);}
+       */
        goto done;

  abort:
@@ -1267,14 +1422,14 @@ SaAisErrorT pbe_daemon_imm_init(SaImmHan
                        rc = saImmOmAdminOwnerSet(sOwnerHandle, admOwnNames, 
SA_IMM_ONE);
                        LOG_NO("AdminOwnerSet returned %u", rc);
                }
-               if(rc != SA_AIS_OK) {
+               if(rc == SA_AIS_ERR_TRY_AGAIN) {
                        usleep(sleep_delay_ms * 1000);
                        msecs_waited += sleep_delay_ms;
                }
        } while ((rc == SA_AIS_ERR_TRY_AGAIN) && (msecs_waited < 
max_waiting_time_ms*12)); /* 60 secs */

        if(sPbe2B) {
-               /* Set secondary PBE as class applier for ALL config classes. */
+               /* Set slave PBE as class applier for ALL config classes. */
                for(ci=sClassIdMap->begin(); ci!=sClassIdMap->end();++ci) {
                        if((ci)->second->mClassId > sClassCount) {
                                sClassCount = (ci)->second->mClassId;
@@ -1287,7 +1442,7 @@ SaAisErrorT pbe_daemon_imm_init(SaImmHan
                                &attrDefinitions);
                        /* PBE should never get TRY_AGAIN from 
saImmOmClassDescriptionGet. */
                        if (rc != SA_AIS_OK)    {
-                               TRACE_4("Failed to get the description for the 
%s class error:%u - exiting",
+                               LOG_ER("Failed to get the description for the 
%s class error:%u",
                                        (char*)(ci)->first.c_str(), rc);
                                return rc;
                        }
@@ -1308,7 +1463,8 @@ SaAisErrorT pbe_daemon_imm_init(SaImmHan
                        }

                        if (rc != SA_AIS_OK) {
-                               LOG_ER("saImmOiClassImplementerSet for %s 
failed %u", (char *) (ci)->first.c_str(), rc);
+                               LOG_ER("saImmOiClassImplementerSet for %s 
failed %u",
+                                       (char *) (ci)->first.c_str(), rc);
                                return rc;
                        }
                        LOG_NO("saImmOiClassImplementerSet for %s succeeded", 
(char *) (ci)->first.c_str());

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