osaf/services/saf/immsv/immnd/ImmModel.cc | 101 +++++++++++++++++++++++++++++- osaf/services/saf/immsv/immnd/ImmModel.hh | 4 + 2 files changed, 103 insertions(+), 2 deletions(-)
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 @@ -9209,6 +9209,34 @@ ImmModel::filterMatch(ObjectInfo* obj, I return j->second->hasMatchingValue(tmpos); } +bool +ImmModel::noDanglingRefExist(ObjectInfo *obj, const char *noDanglingRef) +{ + ImmAttrValueMap::iterator avmi; + ImmAttrValue *av; + AttrMap::iterator ami = obj->mClassInfo->mAttrMap.begin(); + for(; ami != obj->mClassInfo->mAttrMap.end(); ++ami) { + if(ami->second->mFlags & SA_IMM_ATTR_NO_DANGLING) { + avmi = obj->mAttrValueMap.find(ami->first); + osafassert(avmi != obj->mAttrValueMap.end()); + av = avmi->second; + while(av) { + if(av->getValueC_str() && !strcmp(av->getValueC_str(), noDanglingRef)) { + return true; + } + + if(av->isMultiValued()) { + av = ((ImmAttrMultiValue *)av)->getNextAttrValue(); + } else { + break; + } + } + } + } + + return false; +} + SaAisErrorT ImmModel::searchInitialize(ImmsvOmSearchInit* req, ImmSearchOp& op) { @@ -9224,9 +9252,19 @@ ImmModel::searchInitialize(ImmsvOmSearch ObjectInfo* obj = NULL; ObjectMap::iterator omi; ObjectSet::iterator osi; + bool noDanglingSearch = req->searchOptions & SA_IMM_SEARCH_NO_DANGLING_DEPENDENTS; + ObjectInfo* refObj = NULL; + ObjectMMap::iterator ommi = sReverseRefsNoDanglingMMap.end(); + std::string refObjectName; SaUint32T childCount=0; if(scope == SA_IMM_ONE) { + if(noDanglingSearch) { + LOG_NO("ERR_INVALID_PARAM: SA_IMM_SEARCH_NO_DANGLING_DEPENDENTS " + "flag cannot be used with SA_IMM_ONE scope"); + return SA_AIS_ERR_INVALID_PARAM; + } + return this->accessorGet(req, op); } @@ -9245,7 +9283,8 @@ ImmModel::searchInitialize(ImmsvOmSearch SA_IMM_SEARCH_GET_SOME_ATTR | SA_IMM_SEARCH_GET_CONFIG_ATTR | SA_IMM_SEARCH_PERSISTENT_ATTRS | - SA_IMM_SEARCH_SYNC_CACHED_ATTRS); + SA_IMM_SEARCH_SYNC_CACHED_ATTRS | + SA_IMM_SEARCH_NO_DANGLING_DEPENDENTS); if(unknownOptions) { LOG_NO("ERR_INVALID_PARAM: invalid search option 0x%llx", @@ -9372,6 +9411,51 @@ ImmModel::searchInitialize(ImmsvOmSearch */ osafassert(nameToInternal(objectName)); } + } else if(noDanglingSearch) { + // Validate parameters for searching no dangling references + if(req->searchParam.choice.oneAttrParam.attrName.size != 0) { + LOG_NO("ERR_INVALID_PARAM: attrName must be NULL " + "when SA_IMM_SEARCH_NO_DANGLING_DEPENDENTS flag is set"); + err = SA_AIS_ERR_INVALID_PARAM; + goto searchInitializeExit; + } + if(req->searchParam.choice.oneAttrParam.attrValueType != SA_IMM_ATTR_SANAMET && + req->searchParam.choice.oneAttrParam.attrValueType != SA_IMM_ATTR_SASTRINGT) { + LOG_NO("ERR_INVALID_PARAM: attrValueType must be type of SaNameT or SaStringT " + "when SA_IMM_SEARCH_NO_DANGLING_DEPENDENTS flag is set"); + err = SA_AIS_ERR_INVALID_PARAM; + goto searchInitializeExit; + } + + refObjectName = std::string(req->searchParam.choice.oneAttrParam.attrValue.val.x.buf, + strnlen(req->searchParam.choice.oneAttrParam.attrValue.val.x.buf, + req->searchParam.choice.oneAttrParam.attrValue.val.x.size)); + + omi = sObjectMap.find(refObjectName); + if(omi == sObjectMap.end() || (omi->second->mObjFlags & IMM_CREATE_LOCK)) { + LOG_NO("ERR_INVALID_PARAM: attrValue contains a DN of non-existing object %s", + refObjectName.c_str()); + err = SA_AIS_ERR_INVALID_PARAM; + goto searchInitializeExit; + } + + // Set initialize variables + refObj = omi->second; + omi = sObjectMap.end(); + + ommi = sReverseRefsNoDanglingMMap.find(refObj); + while(ommi != sReverseRefsNoDanglingMMap.end() && ommi->first == refObj && + !noDanglingRefExist(ommi->second, refObjectName.c_str())) { + ++ommi; + } + + if(ommi != sReverseRefsNoDanglingMMap.end() && ommi->first == refObj) { + obj = ommi->second; + getObjectName(obj, objectName); + } else { + // There is no any match + goto searchInitializeExit; + } } else { if(childCount > 1) { /* A root was provided and it has children => Initialize */ @@ -9392,8 +9476,10 @@ ImmModel::searchInitialize(ImmsvOmSearch // Find root object and all sub objects to the root object. // Source set is either (a) entire object-map or (b) class extent set + // or (c) set of no-dangling dependents on refObj while(err==SA_AIS_OK && (omi != sObjectMap.end() || - (classInfo && osi != classInfo->mExtent.end()))) { + (classInfo && osi != classInfo->mExtent.end()) || + (ommi != sReverseRefsNoDanglingMMap.end() && ommi->first == refObj))) { /*Skip pending creates.*/ if(obj->mObjFlags & IMM_CREATE_LOCK) {goto continue_while_loop;} @@ -9572,6 +9658,17 @@ ImmModel::searchInitialize(ImmsvOmSearch osafassert(nameToInternal(objectName)); } } + } else if(noDanglingSearch) { + ++ommi; + while(ommi != sReverseRefsNoDanglingMMap.end() && ommi->first == refObj) { + if(noDanglingRefExist(ommi->second, refObjectName.c_str())) { + obj = ommi->second; + objectName.clear(); + getObjectName(obj, objectName); + break; + } + ++ommi; + } } else { ++omi; if(omi!= sObjectMap.end()) { 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 @@ -666,6 +666,10 @@ private: const char *targetObjectName, SaUint32T ccbId); + bool noDanglingRefExist( + ObjectInfo *obj, + const char *noDanglingRef); + }; #endif ------------------------------------------------------------------------------ Rapidly troubleshoot problems before they affect your business. Most IT organizations don't have a clear picture of how application performance affects their revenue. With AppDynamics, you get 100% visibility into your Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro! http://pubads.g.doubleclick.net/gampad/clk?id=84349831&iu=/4140/ostg.clktrk _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel