Hi again,
I tried the solution that changes the if condition in
addNewNoDanglingRefs().
The code is now like this:
ObjectNameSet::iterator si;
ObjectMutationMap::iterator omuti;
ObjectMap::iterator omi;
CcbVector::iterator i = std::find_if(sCcbVector.begin(),
sCcbVector.end(), CcbIdIs(ccbId));
osafassert(i != sCcbVector.end());
CcbInfo* ccb = (*i);
for(si=dnSet.begin(); si!=dnSet.end(); ++si) {
omi = sObjectMap.find(*si);
// After all validation, object must exist
osafassert(omi != sObjectMap.end());
omuti = ccb->mMutations.find(*si);
*if (omuti != ccb->mMutations.end() && omuti->second->mOpType ==
IMM_CREATE) {*
sReverseRefsNoDanglingMMap.insert(std::pair<ObjectInfo *, ObjectInfo
*>(omi->second, obj));
}
}
But we still need 2 iterations because we can't free memory (delete
omut) in the loop.
addNewNoDanglingRefs() still needs the ObjectMutation to check the mOpType.
We have to free the memory in another loop.
Attached is the patch.
Best Regards,
Hung Nguyen
DEK Technologies
------------------------------------------------------------------------
*From:* Hung Nguyen
*Sent:* Tuesday, June 02, 2015 10:03AM
*To:* Zoran Milinkovic, Reddy Neelakanta Reddy Peddavandla, Anders
Bjornerstedt
*Cc:* opensaf-devel
*Subject:* Re: [devel] [PATCH 1 of 1] imm: Ensure IMM_MODIFY mutations
are always committed first [#1377]
Hi,
About this IF statement
if((omi->second->mObjFlags & IMM_CREATE_LOCK)||
omit!=ccb->mMutations.end())
If the OpType of the mutation is IMM_MODIFY, the statement will return
true and add duplicated NO_DANGLING reference to sReverseRefsNoDanglingMMap.
Here's the bug:
# immcfg
> immcfg -c TestClass testClass=1
> immcfg -c TestClass testClass=2
Add no-dangling ref
# immcfg
> immcfg -a dep=testClass=1 testClass=2
> immcfg -a dep=testClass=2 testClass=1
Remove no-dangling ref
# immcfg
> immcfg -a dep= testClass=1
> immcfg -a dep= testClass=2
The duplicated references are not removed so the object can't be deleted.
# immcfg -d testClass=1
error - saImmOmCcbApply FAILED: SA_AIS_ERR_FAILED_OPERATION (21)
# immcfg -d testClass=2
error - saImmOmCcbApply FAILED: SA_AIS_ERR_FAILED_OPERATION (21)
Best Regards,
Hung Nguyen
DEK Technologies
------------------------------------------------------------------------
*From:* Zoran Milinkovic
*Sent:* Monday, June 01, 2015 7:53PM
*To:* Reddy Neelakanta Reddy Peddavandla, Hung Nguyen, Anders
BjörnerstedtAnders Björnerstedt
*Cc:* opensaf-devel
*Subject:* RE: [devel] [PATCH 1 of 1] imm: Ensure IMM_MODIFY mutations
are always committed first [#1377]
Hi,
Anders and I have talked about the patch and had more-less same points as
Neelakanta mentioned in the review.
The patch has an impact on the performance, and it will affect every CCB (two
iterations), specially loading data.
The change could be done only for NO_DANGLING objects, changing
addNewNoDanglingRefs, as Neelakanta commented in his review.
Best regards,
Zoran
-----Original Message-----
From: Neelakanta Reddy [mailto:[email protected]]
Sent: Monday, June 01, 2015 2:33 PM
To: Hung Nguyen D; Anders Björnerstedt
Cc:[email protected]
Subject: Re: [devel] [PATCH 1 of 1] imm: Ensure IMM_MODIFY mutations are always
committed first [#1377]
Hi Hung,
Reviewed and tested the patch.
the patch is working good.
But the alternate solution may be passing ccbId, through commitModify
-->addNewNoDanglingRefs
In addNewNoDanglingRefs, modify the if condition (if CCB create is
committed and CREATE_LOCK is removed, then it will be present in
ccbvector of same CCB)
CcbInfo* ccb =(*(std::find_if(sCcbVector.begin(), sCcbVector.end(),
CcbIdIs(ccbId))));
ObjectMutationMap::iterator omit;
omit=omit.find(omi);
if((omi->second->mObjFlags & IMM_CREATE_LOCK)|| omit!=ccb->mMutations.end())
sReverseRefsNoDanglingMMap.insert(std::pair<ObjectInfo *, ObjectInfo
*>(omi->second, obj));
wait for AndersBj comments on alternate solution.
/Neel.
On Monday 01 June 2015 12:41 PM, Hung Nguyen wrote:
osaf/services/saf/immsv/immnd/ImmModel.cc | 65
+++++++++++++++++-------------
1 files changed, 36 insertions(+), 29 deletions(-)
When an IMM_CREATE mutation is committed, the IMM_CREATE_LOCK flag is also
cleared in commitCreate().
If the CCB has IMM_MODIFY mutations that add references to object of committed
IMM_CREATE mutations, it will fail to add NO_DANGLING references to
sReverseRefsNoDanglingMMap in addNewNoDanglingRefs() due to cleared
IMM_CREATE_LOCK flag.
mMutations map is sorted by object DN so the order of mutations to be committed
depends on the object DNs.
This patch ensures that IMM_MODIFY mutations of the CCB are always committed
first.
The mutation list will be looped through twice.
The first loop commits all IMM_MODIFY mutations, the second loop commits the
rest and free the allocated memory.
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
@@ -5470,35 +5470,42 @@ ImmModel::ccbCommit(SaUint32T ccbId, Con
ccb->mWaitStartTime = 0;
//Do the actual commit!
- ObjectMutationMap::iterator omit;
- for(omit=ccb->mMutations.begin(); omit!=ccb->mMutations.end(); ++omit){
- ccbNotEmpty=true;
- ObjectMutation* omut = omit->second;
- osafassert(!omut->mWaitForImplAck);
- switch(omut->mOpType){
- case IMM_CREATE:
- if(ccbId != 1) {
- TRACE_5("COMMITING CREATE of %s", omit->first.c_str());
- }
- osafassert(omut->mAfterImage);
- commitCreate(omut->mAfterImage);
- omut->mAfterImage=NULL;
- break;
- case IMM_MODIFY:
- osafassert(omut->mAfterImage);
- pbeModeChange = commitModify(omit->first, omut->mAfterImage)
|| pbeModeChange;
- omut->mAfterImage=NULL;
- break;
- case IMM_DELETE:
- osafassert(omut->mAfterImage==NULL);
- commitDelete(omit->first);
- break;
- default:
- abort();
- }//switch
- delete omut;
- }//for
-
+ /* Ensure that modifications are committed first [#1377] */
+ for (int doIt = 0; doIt < 2; ++doIt) {
+ ObjectMutationMap::iterator omit;
+ for(omit=ccb->mMutations.begin(); omit!=ccb->mMutations.end(); ++omit){
+ ObjectMutation* omut = omit->second;
+ if ((!doIt && omut->mOpType != IMM_MODIFY) || (doIt &&
omut->mOpType == IMM_MODIFY)) {
+ if (doIt) delete omut; //only delete in the second loop
+ continue;
+ }
+ ccbNotEmpty=true;
+ osafassert(!omut->mWaitForImplAck);
+ switch(omut->mOpType){
+ case IMM_CREATE:
+ if(ccbId != 1) {
+ TRACE_5("COMMITING CREATE of %s", omit->first.c_str());
+ }
+ osafassert(omut->mAfterImage);
+ commitCreate(omut->mAfterImage);
+ omut->mAfterImage=NULL;
+ break;
+ case IMM_MODIFY:
+ osafassert(omut->mAfterImage);
+ pbeModeChange = commitModify(omit->first,
omut->mAfterImage) || pbeModeChange;
+ omut->mAfterImage=NULL;
+ break;
+ case IMM_DELETE:
+ osafassert(omut->mAfterImage==NULL);
+ commitDelete(omit->first);
+ break;
+ default:
+ abort();
+ }//switch
+ if (doIt) delete omut; //only delete in the second loop
+ }//for omit
+ }//for doIt
+
ccb->mMutations.clear();
if(ccbIdLongDnGuard == ccbId) {ccbIdLongDnGuard= 0;}
------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel
------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel
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
@@ -5211,19 +5211,26 @@ ImmModel::removeNoDanglingRefs(ObjectInf
* "obj" will be inserted as a source object.
*/
void
-ImmModel::addNewNoDanglingRefs(ObjectInfo *obj, ObjectNameSet &dnSet)
+ImmModel::addNewNoDanglingRefs(ObjectInfo *obj, ObjectNameSet &dnSet,
SaUint32T ccbId)
{
ObjectNameSet::iterator si;
- ObjectMMap::iterator ommi;
+ ObjectMutationMap::iterator omuti;
ObjectMap::iterator omi;
-
- TRACE_ENTER();
+ CcbVector::iterator i;
+ CcbInfo* ccb = NULL;
+
+ TRACE_ENTER();
+
+ i = std::find_if(sCcbVector.begin(), sCcbVector.end(), CcbIdIs(ccbId));
+ osafassert(i != sCcbVector.end());
+ ccb = (*i);
for(si=dnSet.begin(); si!=dnSet.end(); ++si) {
omi = sObjectMap.find(*si);
// After all validation, object must exist
osafassert(omi != sObjectMap.end());
- if(omi->second->mObjFlags & IMM_CREATE_LOCK) {
+ omuti = ccb->mMutations.find(*si);
+ if (omuti != ccb->mMutations.end() && omuti->second->mOpType ==
IMM_CREATE) {
sReverseRefsNoDanglingMMap.insert(std::pair<ObjectInfo *,
ObjectInfo *>(omi->second, obj));
}
}
@@ -5329,7 +5336,7 @@ ImmModel::commitModify(const std::string
origNDRefs.begin(), origNDRefs.end(),
std::inserter(addedNDRefs, addedNDRefs.end()));
- addNewNoDanglingRefs(beforeImage, addedNDRefs);
+ addNewNoDanglingRefs(beforeImage, addedNDRefs, afterImage->mCcbId);
}
// sObjectMap.erase(oi);
@@ -5496,9 +5503,12 @@ ImmModel::ccbCommit(SaUint32T ccbId, Con
default:
abort();
}//switch
- delete omut;
}//for
+ for(omit=ccb->mMutations.begin(); omit!=ccb->mMutations.end(); ++omit){
+ delete omit->second;
+ }
+
ccb->mMutations.clear();
if(ccbIdLongDnGuard == ccbId) {ccbIdLongDnGuard= 0;}
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
@@ -663,7 +663,8 @@ private:
bool removeRefsToObject = false);
void addNewNoDanglingRefs(
ObjectInfo *obj,
- ObjectNameSet &dnSet);
+ ObjectNameSet &dnSet,
+ SaUint32T ccbId);
void removeNoDanglingRefSet(
ObjectInfo *obj,
ObjectNameSet &dnSet);
------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel