Hi Neel, Please see my comments inline.
BR, Hung Nguyen - DEK Technologies -------------------------------------------------------------------------------- From: Neelakanta Reddy [email protected] Sent: Wednesday, November 18, 2015 4:17PM To: Zoran Milinkovic, Hung Nguyen [email protected], [email protected] Cc: Opensaf-devel [email protected] Subject: [PATCH 1 of 1] imm:Allow deletion of dangling ref object, when the object is modified by clearing NO_DANGLING attribute in same CCB [#1599] osaf/services/saf/immsv/immnd/ImmModel.cc | 20 ++++++++++++++++++++ 1 files changed, 20 insertions(+), 0 deletions(-) If the NO_DANGLING reference is modified(removed) in the same CCB, then deletion of the NO_DANGLING object can be allowed because, we are in apply and the CCBcommit will modify sReverseRefsNoDanglingMMap. 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 @@ -5050,6 +5050,26 @@ bool ImmModel::validateNoDanglingRefsDel if(!(ommi->second->mObjFlags & IMM_DELETE_LOCK)) { std::string objName; getObjectName(ommi->second, objName); + if(ommi->second->mObjFlags & IMM_NO_DANGLING_FLAG){ // IMM_NO_DANGLING_FLAG will be set in CcbModify + /* If the NO_DANGLING reference is modified(removed) in the same CCB, + then deletion of the NO_DANGLING object can be allowed because, we are in apply + and the CCBcommit will modify sReverseRefsNoDanglingMMap*/ + ObjectMutationMap::iterator omit = ccb->mMutations.find(objName); + if(omit != ccb->mMutations.end()){ + ObjectInfo * afim = omit->second->mAfterImage; + AttrMap::iterator amit; + for(amit=afim->mClassInfo->mAttrMap.begin(); amit!=afim->mClassInfo->mAttrMap.end(); ++amit){ + if(amit->second->mFlags & SA_IMM_ATTR_NO_DANGLING){ + break; + } + } [Hung] This only gets the first no-dangling attribute we found in mAttrMap. Shouldn't other no-dangling attributes be checked also? + ImmAttrValueMap::iterator afim_amit = afim->mAttrValueMap.find(amit->first.c_str()); + if(afim_amit->second->empty()){ //CcbModify operation cleared the NO_DANGLING attribute value. + break; + } [Hung] If the attribute has no-dangling ref to other objects (not the one to be deleted), we should allow that case too. The 'empty' requirement is too strict here. Also the multi-value attribute case is not covered. --- I think it's better to use collectNoDanglingRefs() here. ObjectNameSet afimNDRefs; collectNoDanglingRefs(afim, afimNDRefs); Then we just simply check if 'omi->first' is in the 'afimNDRefs'. afimNDRefs.find(omi->first) == afimNDRefs.end() + } + } + LOG_WA("ERR_FAILED_OPERATION: Delete of object %s would violate NO_DANGLING reference " "from object %s, not scheduled for delete by this Ccb:%u", omit->first.c_str(), objName.c_str(), ccb->mId); ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel
