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