Hi Vu, ack, code review only.
/BR HansN On 10/19/18 05:58, Vu Minh Nguyen wrote: > After split-brain recovery, there is possibility of having inconsistencies > between IMM data model in memory held by IMMND and one in the back-end > database (sqlite). > > That could happen as we might have 02 active IMMDs, 02 IMMND coordinators > and more than one PBE processes accessing a shared pbe database. > Change to such database from one therefore might not get noticed by the other. > > By using this admin operation ID and targeting to IMM, IMM will regenerate the > back-end database from one in memory to keep them both consistent. > > immadm -o 303 safRdn=immManagement,safApp=safImmService > --- > src/imm/README | 18 ++++++++++++++++++ > src/imm/common/immsv_api.h | 4 +++- > src/imm/immnd/ImmModel.cc | 22 +++++++++++++++++++++- > src/imm/immnd/ImmModel.h | 3 ++- > src/imm/immnd/immnd_init.h | 2 ++ > src/imm/immnd/immnd_proc.c | 8 ++++++-- > 6 files changed, 52 insertions(+), 5 deletions(-) > > diff --git a/src/imm/README b/src/imm/README > index 750d811a5..71e5c4fe3 100644 > --- a/src/imm/README > +++ b/src/imm/README > @@ -3033,6 +3033,24 @@ expires. > To be possible to use this new feature, bit 10 must be set in > opensafImmNostdFlags attribute in IMM object. > > + > +Provide an admin-operation for re-generating backend database from one in RAM > +============================================================================= > +https://sourceforge.net/p/opensaf/tickets/2940/ > + > +After split-brain recovery, there is possibility of having inconsistencies > +between IMM data model in memory held by IMMND and one in the back-end > +database (sqlite). > + > +That could happen as we might have 02 active IMMDs, 02 IMMND coordinators > +and more than one PBE processes accessing a shared pbe database. > +Change to such database from one therefore might not get noticed by the > other. > + > +By using this admin operation ID and targeting to IMM, IMM will regenerate > the > +back-end database from one in memory to keep them both consistent. > + > +immadm -o 303 safRdn=immManagement,safApp=safImmService > + > ---------------------------------------- > DEPENDENCIES > ============ > diff --git a/src/imm/common/immsv_api.h b/src/imm/common/immsv_api.h > index 32fc5738e..e6d613705 100644 > --- a/src/imm/common/immsv_api.h > +++ b/src/imm/common/immsv_api.h > @@ -157,7 +157,9 @@ typedef enum { > typedef enum { > SA_IMM_ADMIN_EXPORT = 1, /* Defined in A.02.01 declared in A.03.01 */ > SA_IMM_ADMIN_INIT_FROM_FILE = 100, /* Non standard, force PBE disable. */ > - SA_IMM_ADMIN_ABORT_CCBS = 202 /* Non standard, abort non critical CCBs. */ > + SA_IMM_ADMIN_ABORT_CCBS = 202, /* Non standard, abort non critical CCBs. */ > + /* Non standard, regenerate pbe database from RAM */ > + SA_IMM_ADMIN_REGENERATE_PBE_DB = 303 > } SaImmMngtAdminOperationT; > > /* > diff --git a/src/imm/immnd/ImmModel.cc b/src/imm/immnd/ImmModel.cc > index 21f48ab59..8e3f338dc 100644 > --- a/src/imm/immnd/ImmModel.cc > +++ b/src/imm/immnd/ImmModel.cc > @@ -596,6 +596,7 @@ static const std::string > saImmRepositoryInit("saImmRepositoryInit"); > static const std::string saImmOiTimeout("saImmOiTimeout"); > > static SaImmRepositoryInitModeT immInitMode = SA_IMM_INIT_FROM_FILE; > +static bool sRegenerateDb = false; > > static SaUint32T sCcbIdLongDnGuard = > 0; /* Disallow long DN additions if longDnsAllowed is being changed in > ccb*/ > @@ -2003,6 +2004,14 @@ void immModel_setLoader(IMMND_CB* cb, SaInt32T > loaderPid) { > ImmModel::instance(&cb->immModel)->setLoader(loaderPid); > } > > +void immModel_setRegenerateDbFlag(IMMND_CB* cb, bool value) { > + ImmModel::instance(&cb->immModel)->setRegenerateDbFlag(value); > +} > + > +bool immModel_getRegenerateDbFlag(IMMND_CB* cb) { > + return ImmModel::instance(&cb->immModel)->getRegenerateDbFlag(); > +} > + > void immModel_recognizedIsolated(IMMND_CB* cb) { > ImmModel::instance(&cb->immModel)->recognizedIsolated(); > } > @@ -2901,6 +2910,14 @@ int ImmModel::adjustEpoch(int suggestedEpoch, > SaUint32T* continuationIdPtr, > return suggestedEpoch; > } > > +bool ImmModel::getRegenerateDbFlag() { > + return sRegenerateDb; > +} > + > +void ImmModel::setRegenerateDbFlag(bool value) { > + sRegenerateDb = value; > +} > + > /** > * Fetches the SaImmRepositoryInitT value of the attribute > * 'saImmRepositoryInit' in the object immManagementDn. > @@ -13808,6 +13825,9 @@ SaAisErrorT ImmModel::admoImmMngtObject(const > ImmsvOmAdminOperationInvoke* req, > LOG_IN("sAbortNonCriticalCcbs = true;"); > sAbortNonCriticalCcbs = true; > } > + } else if (req->operationId == SA_IMM_ADMIN_REGENERATE_PBE_DB) { > + LOG_NO("Re-generate the pbe database from one in memory."); > + sRegenerateDb = true; > } else { > LOG_NO("Invalid operation ID %llu, for operation on %s", > (SaUint64T)req->operationId, immManagementDn.c_str()); > @@ -14976,7 +14996,7 @@ SaAisErrorT ImmModel::implementerSet(const > IMMSV_OCTET_STRING* implementerName, > implName.c_str()); > /* If we find any, then surgically replace the implId of the implAssoc > with > the new implId of the newly reincarnated PBE implementer.*/ > - > + sRegenerateDb = false; > for (i = sCcbVector.begin(); i != sCcbVector.end(); ++i) { > CcbInfo* ccb = (*i); > if (ccb->mState == IMM_CCB_CRITICAL) { > diff --git a/src/imm/immnd/ImmModel.h b/src/imm/immnd/ImmModel.h > index c8b0f4eea..65e20d305 100644 > --- a/src/imm/immnd/ImmModel.h > +++ b/src/imm/immnd/ImmModel.h > @@ -372,7 +372,8 @@ class ImmModel { > int adjustEpoch(int suggestedEpoch, SaUint32T* continuationId, > SaUint32T* pbeConnPtr, unsigned int* pbeNodeIdPtr, > bool increment); > - > + bool getRegenerateDbFlag(); > + void setRegenerateDbFlag(bool value); > SaImmRepositoryInitModeT getRepositoryInitMode(); > unsigned int getMaxSyncBatchSize(); > bool getLongDnsAllowed(ObjectInfo* immObject = NULL); > diff --git a/src/imm/immnd/immnd_init.h b/src/imm/immnd/immnd_init.h > index 1d0126ec5..58ed48329 100644 > --- a/src/imm/immnd/immnd_init.h > +++ b/src/imm/immnd/immnd_init.h > @@ -309,6 +309,8 @@ bool immModel_readyForLoading(IMMND_CB *cb); > SaInt32T immModel_getLoader(IMMND_CB *cb); > > void immModel_setLoader(IMMND_CB *cb, SaInt32T loaderPid); > +void immModel_setRegenerateDbFlag(IMMND_CB *cb, bool value); > +bool immModel_getRegenerateDbFlag(IMMND_CB *cb); > > unsigned int immModel_pbeOiExists(IMMND_CB *cb); > unsigned int immModel_pbeBSlaveExists(IMMND_CB *cb); > diff --git a/src/imm/immnd/immnd_proc.c b/src/imm/immnd/immnd_proc.c > index 015932a4b..b03063882 100644 > --- a/src/imm/immnd/immnd_proc.c > +++ b/src/imm/immnd/immnd_proc.c > @@ -1935,6 +1935,7 @@ static int immnd_forkPbe(IMMND_CB *cb) > LOG_NO("pbe-db-file-path:%s VETERAN:%u B:%u", dbFilePath, > cb->mPbeVeteran, cb->mPbeVeteranB); > > + bool regenerate_db = immModel_getRegenerateDbFlag(cb); > if ((cb->mPbeVeteran || cb->mPbeVeteranB) && > !immModel_pbeIsInSync(cb, false)) { > /* Currently we can not recover results for PRTO > @@ -1961,7 +1962,7 @@ static int immnd_forkPbe(IMMND_CB *cb) > bool veteran = (cb->mIsCoord) ? (cb->mPbeVeteran) > : (cb->m2Pbe && cb->mPbeVeteranB); > pbeArgs[0] = (char *)execPath; > - if (veteran) { > + if (veteran && !regenerate_db) { > pbeArgs[1] = "--recover"; > pbeArgs[2] = (cb->m2Pbe) ? ((cb->mIsCoord) ? "--pbe2A" > : "--pbe2B") > @@ -1983,6 +1984,8 @@ static int immnd_forkPbe(IMMND_CB *cb) > } > TRACE_5("Parent %s, successfully forked %s, pid:%d", base, dbFilePath, > pid); > + > + immModel_setRegenerateDbFlag(cb, false); > cb->mPbeKills = 0; /* Rest kill count when we just created a new PBE. */ > if (cb->mIsCoord && cb->mPbeVeteran) { > cb->mPbeVeteran = false; > @@ -2701,7 +2704,8 @@ uint32_t immnd_proc_server(uint32_t *timeout) > } else { /* Pbe is running. */ > osafassert(cb->pbePid > 0); > if (cb->mRim == SA_IMM_INIT_FROM_FILE || > - cb->mBlockPbeEnable) { > + cb->mBlockPbeEnable || > + immModel_getRegenerateDbFlag(cb)) { > /* Pbe should NOT run.*/ > if ((cb->mPbeKills++) == > 0) { /* Send SIGTERM only _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel