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[] = {¶m0, ¶m1,
¶m2, ¶m3, NULL};
+ const SaImmAdminOperationParamsT_2 *params[] = {¶m0, ¶m1,
¶m2, 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