osaf/services/saf/immsv/immnd/ImmModel.cc | 29 ++++++++++++++++++++++++----- osaf/services/saf/immsv/immnd/ImmModel.hh | 6 ++++-- osaf/services/saf/immsv/immnd/immnd_cb.h | 3 +++ osaf/services/saf/immsv/immnd/immnd_evt.c | 23 +++++++++++++++++++++++ 4 files changed, 54 insertions(+), 7 deletions(-)
TRY_AGAIN will be returned to the ccbApply when the saImmRepositoryInit is changed from SA_IMM_KEEP_REPOSITORY to SA_IMM_INIT_FROM_FILE. The duration of the TRY_AGAIN is from the time ccb upcall is sent to PBE to receiving ACK from the PBE for the repository change CCB 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 @@ -962,14 +962,19 @@ immModel_ccbObjectModify(IMMND_CB *cb, { std::string objectName; bool pbeFile = (cb->mPbeFile != NULL); + bool changeRim = false; SaAisErrorT err = ImmModel::instance(&cb->immModel)-> ccbObjectModify(req, implConn, implNodeId, continuationId, - pbeConn, pbeNodeId, objectName, hasLongDns, pbeFile); + pbeConn, pbeNodeId, objectName, hasLongDns, pbeFile, &changeRim); if(err == SA_AIS_OK) { osaf_extended_name_alloc(objectName.c_str(), objName); } + if (err == SA_AIS_OK && changeRim){ + cb->mPbeDisableCcbId = req->ccbId; + TRACE("The mPbeDisableCcbId is set to ccbid:%u", cb->mPbeDisableCcbId); + } return err; } @@ -1361,6 +1366,12 @@ immModel_ccbAbort(IMMND_CB *cb, unsigned int ix=0; bool aborted = ImmModel::instance(&cb->immModel)->ccbAbort(ccbId, cv, cl, nodeId, pbeNodeId); + + if ( aborted && (cb->mPbeDisableCcbId == ccbId)){ + TRACE("PbeDisableCcbId %u has been aborted", ccbId); + cb->mPbeDisableCcbId = 0; + cb->mPbeDisableCritical = false; + } *arrSize = (SaUint32T) cv.size(); if(*arrSize) { @@ -1530,7 +1541,7 @@ immModel_ccbWaitForCompletedAck(IMMND_CB SaUint32T* pbeCtn) { return ImmModel::instance(&cb->immModel)-> - ccbWaitForCompletedAck(ccbId, err, pbeConn, pbeNodeId, pbeId, pbeCtn); + ccbWaitForCompletedAck(ccbId, err, pbeConn, pbeNodeId, pbeId, pbeCtn, cb->mPbeDisableCritical); } bool @@ -8860,7 +8871,8 @@ ImmModel::ccbObjectModify(const ImmsvOmC unsigned int* pbeNodeIdPtr, std::string& objectName, bool* hasLongDns, - bool pbeFile) + bool pbeFile, + bool * changeRim) { TRACE_ENTER(); osafassert(hasLongDns); @@ -9342,6 +9354,7 @@ ImmModel::ccbObjectModify(const ImmsvOmC } if (modifiedRim) { + SaImmRepositoryInitModeT oldRim = getRepositoryInitMode(); SaImmRepositoryInitModeT newRim = (SaImmRepositoryInitModeT) attrValue->getValue_int(); if((newRim != SA_IMM_INIT_FROM_FILE) && (newRim != SA_IMM_KEEP_REPOSITORY)) { TRACE_7("ERR_BAD_OPERATION: attr '%s' in IMM object %s can not have value %u", @@ -9352,6 +9365,11 @@ ImmModel::ccbObjectModify(const ImmsvOmC err = SA_AIS_ERR_BAD_OPERATION; break; } + + if((oldRim == SA_IMM_KEEP_REPOSITORY) && (newRim == SA_IMM_INIT_FROM_FILE)){ + LOG_NO("Request for rim change is arrived in ccb%u", ccbId); + * changeRim = true; + } } @@ -10680,7 +10698,8 @@ ImmModel::ccbWaitForDeleteImplAck(SaUint bool ImmModel::ccbWaitForCompletedAck(SaUint32T ccbId, SaAisErrorT* err, SaUint32T* pbeConnPtr, unsigned int* pbeNodeIdPtr, - SaUint32T* pbeIdPtr, SaUint32T* pbeCtnPtr) + SaUint32T* pbeIdPtr, SaUint32T* pbeCtnPtr, + bool mPbeDisableCritical) { TRACE_ENTER(); if(pbeNodeIdPtr) { @@ -10768,7 +10787,7 @@ ImmModel::ccbWaitForCompletedAck(SaUint3 if(((*err) == SA_AIS_OK) && pbeNodeIdPtr) { /* There should be a PBE */ ImplementerInfo* pbeImpl = (ImplementerInfo *) getPbeOi(pbeConnPtr, pbeNodeIdPtr); - if(pbeImpl) { + if(pbeImpl && !mPbeDisableCritical) { /* There is in fact a PBE (up) */ osafassert(ccb->mState == IMM_CCB_PREPARE); LOG_IN("GOING FROM IMM_CCB_PREPARE to IMM_CCB_CRITICAL Ccb:%u", ccbId); 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 @@ -254,7 +254,8 @@ public: unsigned int* pbeNodeId, std::string& objectName, bool* hasLongDns, - bool pbeFile); + bool pbeFile, + bool* changeRim); SaAisErrorT ccbObjectDelete( const ImmsvOmCcbObjectDelete* req, @@ -303,7 +304,8 @@ public: SaUint32T* pbeConn, unsigned int* pbeNodeId, SaUint32T* pbeId, - SaUint32T* pbeCtn); + SaUint32T* pbeCtn, + bool mPbeDisableCritical); void ccbObjDelContinuation( immsv_oi_ccb_upcall_rsp* rsp, diff --git a/osaf/services/saf/immsv/immnd/immnd_cb.h b/osaf/services/saf/immsv/immnd/immnd_cb.h --- a/osaf/services/saf/immsv/immnd/immnd_cb.h +++ b/osaf/services/saf/immsv/immnd/immnd_cb.h @@ -129,6 +129,9 @@ typedef struct immnd_cb_tag { uint8_t mBlockPbeEnable; //Current PBE has not completed shutdown yet. uint8_t mPbeKills; //If != 0 then immnd has tried to kill Pbe. uint8_t m2Pbe; //If!=0 => 2PBE, 2 => fetch PBE file info. + SaUint32T mPbeDisableCcbId; // CcbId, operation of the Disable PBE. + bool mPbeDisableCritical; //If true then PBE disable is sent to PBE for ACK. + bool mIsOtherScUp; //If set & this is an SC then other SC is up(2pbe). //False=> *allow* 1safe 2pbe. May err conservatively (true) bool mForceClean; //true => Force cleanTheHouse to run once *now*. 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 @@ -3323,6 +3323,11 @@ static SaAisErrorT immnd_fevs_local_chec } /* intentional fallthrough. */ case IMMND_EVT_A2ND_CCB_APPLY: + if(cb->mPbeDisableCritical){ + LOG_WA("ERR_TRY_AGAIN: Disable of PBE has been initiated, waiting for the reply from the PBE"); + error = SA_AIS_ERR_TRY_AGAIN; + break; + } if(immModel_pbeNotWritable(cb) || (cb->fevs_replies_pending >= IMMSV_DEFAULT_FEVS_MAX_PENDING) || !immnd_is_immd_up(cb)) { /* NO_RESOURCES is here imm internal proxy for TRY_AGAIN. @@ -4012,6 +4017,10 @@ static void immnd_evt_proc_ccb_compl_rsp evt->info.ccbUpcallRsp.ccbId); } } + if(cb->mPbeDisableCcbId == evt->info.ccbId){ + TRACE(" Disable of PBE is sent to PBE for ACK, in ccb:%u", evt->info.ccbId); + cb->mPbeDisableCritical = true; + } skip_send: reqConn = 0; /* Ensure we dont reply to OM client yet. */ } @@ -4063,6 +4072,9 @@ static void immnd_evt_proc_ccb_compl_rsp SaUint32T arrSize = 0; if(immModel_ccbCommit(cb, evt->info.ccbUpcallRsp.ccbId, &arrSize, &implConnArr)) { + osafassert(cb->mPbeDisableCcbId == evt->info.ccbUpcallRsp.ccbId); + cb->mPbeDisableCcbId = 0; + cb->mPbeDisableCritical = false; SaImmRepositoryInitModeT oldRim = cb->mRim; cb->mRim = immModel_getRepositoryInitMode(cb); if(oldRim != cb->mRim) { @@ -7792,6 +7804,13 @@ static void immnd_evt_proc_ccb_apply(IMM abort(); } #endif + if(cb->mPbeDisableCritical && !validateOnly){ + LOG_WA("Disable of PBE has been initiated, waiting for the reply from the PBE"); + err = SA_AIS_ERR_TRY_AGAIN; + goto immediate_reply; + } + + if(cb->mPbeFile && (cb->mRim == SA_IMM_KEEP_REPOSITORY)) { if(immModel_pbeNotWritable(cb)) { /* NO_RESOURCES is here imm internal proxy for TRY_AGAIN. @@ -7912,6 +7931,10 @@ static void immnd_evt_proc_ccb_apply(IMM evt->info.ccbId); } } + if(cb->mPbeDisableCcbId == evt->info.ccbId){ + TRACE(" Disable of PBE is sent to PBE for ACK, in ccb:%u", evt->info.ccbId); + cb->mPbeDisableCritical = true; + } } } else { TRACE_2("NO IMPLEMENTERS AT ALL AND NO PBE. for ccb:%u err:%u sz:%u", evt->info.ccbId, err, arrSize); ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, SlashDot.org! http://sdm.link/slashdot _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel