osaf/services/saf/immsv/immnd/ImmModel.cc |  53 +++++++++++++++++++++---------
 osaf/services/saf/immsv/immnd/immnd_evt.c |   5 +-
 2 files changed, 39 insertions(+), 19 deletions(-)


Add new member 'mPurged' to struct 'CcbInfo'.
It will be set to true when the ccb continuation is purged.
In the "ccb continuation" functions, mPurged is checked to
decide whether to response to client or not.

The value of 'mOriginatingConn' is needed to
get the CcbId when discarding the client (getCcbIdsForOrigCon).
So it will not be cleared when the ccb continuation is purged.

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
@@ -350,7 +350,7 @@ struct CcbInfo
     CcbInfo(): mId(0), mAdminOwnerId(0), mCcbFlags(0), mOriginatingConn(0),
                mOriginatingNode(0), mState(IMM_CCB_ILLEGAL), mVeto(SA_AIS_OK),
                mWaitStartTime((time_t) 0), mOpCount(0), mPbeRestartId(0),
-               mErrorStrings(NULL), mAugCcbParent(NULL) {}
+               mErrorStrings(NULL), mAugCcbParent(NULL), mPurged(false) {}
     bool isOk() {return mVeto == SA_AIS_OK;}
     bool isActive() {return (mState < IMM_CCB_COMMITTED);}
     void addObjReadLock(ObjectInfo* obj, std::string& objName);
@@ -376,6 +376,8 @@ struct CcbInfo
     ImmsvAttrNameList* mErrorStrings;/*Error strings generated by current op */
     AugCcbParent*     mAugCcbParent;
     ObjectSet         mSafeReadSet;
+    bool              mPurged; /* True if the ccb continuation is purged.
+                                  Note that on remote nodes, mPurged is always 
'false' */
 };
 typedef std::vector<CcbInfo*> CcbVector;
 
@@ -6127,12 +6129,14 @@ ImmModel::ccbAbort(SaUint32T ccbId, Conn
         }
     }
 
-
-    clVector.push_back(ccb->mOriginatingConn);
-    *nodeId = ccb->mOriginatingNode;
+    /* Only send response when ccb continuation is not purged */
+    if (!ccb->mPurged) {
+        clVector.push_back(ccb->mOriginatingConn);
+        *nodeId = ccb->mOriginatingNode;
+    }
 
     if(ccb->mAugCcbParent && ccb->mAugCcbParent->mOriginatingConn) {
-        if(ccb->mOriginatingConn) {
+        if(ccb->mOriginatingConn && !ccb->mPurged) {
             /* Case where augumented client and Augumented parent
                are originated from ths node. Send the client response
                to both clients. */
@@ -10538,7 +10542,10 @@ ImmModel::ccbObjDelContinuation(immsv_oi
         osafassert(/*(omuti->second->mContinuationId == 0) ||*/
                (omuti->second->mContinuationId == (SaUint32T) rsp->inv));
 
-        *reqConn = ccb->mOriginatingConn;
+        /* Only send response when ccb continuation is not purged */
+        if (!ccb->mPurged) {
+            *reqConn = ccb->mOriginatingConn;
+        }
 
         *augDelete = omuti->second->mIsAugDelete;
 
@@ -10627,7 +10634,10 @@ ImmModel::ccbCompletedContinuation(immsv
     if(ccb->mState == IMM_CCB_VALIDATED) {
         LOG_IN("GOING FROM IMM_CCB_VALIDATED to IMM_CCB_PREPARE Ccb:%u", 
ccbId);
         ccb->mState = IMM_CCB_PREPARE;
-        *reqConn = ccb->mOriginatingConn;
+        /* Only send response when ccb continuation is not purged */
+        if (!ccb->mPurged) {
+            *reqConn = ccb->mOriginatingConn;
+        }
         goto done;
     }
     
@@ -10673,7 +10683,10 @@ ImmModel::ccbCompletedContinuation(immsv
                 ix->second->mContinuationId, rsp->inv);
         }
 
-        *reqConn = ccb->mOriginatingConn;
+        /* Only send response when ccb continuation is not purged */
+        if (!ccb->mPurged) {
+            *reqConn = ccb->mOriginatingConn;
+        }
 
         if(rsp->result != SA_AIS_OK) {
             if(ccb->mVeto == SA_AIS_OK) {
@@ -10810,7 +10823,11 @@ ImmModel::ccbObjCreateContinuation(SaUin
         ccb->mAugCcbParent = NULL;
     }
 
-    *reqConn = ccb->mOriginatingConn;
+    /* Only send response when ccb continuation is not purged */
+    if (!ccb->mPurged) {
+        *reqConn = ccb->mOriginatingConn;
+    }
+
     if((ccb->mVeto == SA_AIS_OK) && (error != SA_AIS_OK)) {
         LOG_NO("ImmModel::ccbObjCreateContinuation: "
             "implementer returned error, Ccb aborted with error: %u",
@@ -10897,7 +10914,11 @@ ImmModel::ccbObjModifyContinuation(SaUin
         ccb->mAugCcbParent = NULL;
     }
 
-    *reqConn = ccb->mOriginatingConn;
+    /* Only send response when ccb continuation is not purged */
+    if (!ccb->mPurged) {
+        *reqConn = ccb->mOriginatingConn;
+    }
+
     if((ccb->mVeto == SA_AIS_OK) && (error != SA_AIS_OK)) {
         LOG_IN("ImmModel::ccbObjModifyContinuation: "
             "implementer returned error, Ccb aborted with error: %u", error);
@@ -13693,13 +13714,11 @@ ImmModel::purgeSyncRequest(SaUint32T cli
     }
 
     if(ccbFound != sCcbVector.end()) {
-        /* To drop the ccb continuation, we simply set mOriginatingConn to 
zero,
-           which is the value it has on all nodes except at the node where the 
-           originating connection resides. By setting it to zero, we ensure 
that
-           no attempt can be made to reply to that connection for any 
continuation
-           on this ccb (e.g. a late arriving OI reply.
-        */
-        (*ccbFound)->mOriginatingConn = 0;
+        /* To drop the ccb continuation, we set mPurged to true. By that,
+           we ensure that no attempt can be made to reply to that connection
+           for any continuation on this ccb (e.g. a late arriving OI reply).
+         */
+        (*ccbFound)->mPurged = true;
         purged = true;
         TRACE_5("Purged Ccb continuation for ccb:%u in state %u", 
             (*ccbFound)->mId, (*ccbFound)->mState);
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
@@ -2125,8 +2125,9 @@ static uint32_t   immnd_evt_proc_cl_imma_t
                   MDS reply info. This will also clear the handle for new use 
in
                    sending syncronous requests.
                */
-               memset(&(cl_node->tmpSinfo), 0, sizeof(IMMSV_SEND_INFO));
-               
osafassert(immnd_mds_client_not_busy(&(cl_node->tmpSinfo))==SA_AIS_OK);
+               immnd_proc_imma_discard_connection(cb, cl_node, false);
+               osafassert(immnd_client_node_del(cb, cl_node)  == 
NCSCC_RC_SUCCESS);
+               free(cl_node);
        } else {
                /* The request could not be purged (depends on request type),
                   or the reply has already been arrived but came too late

------------------------------------------------------------------------------
Mobile security can be enabling, not merely restricting. Employees who
bring their own devices (BYOD) to work are irked by the imposition of MDM
restrictions. Mobile Device Manager Plus allows you to control only the
apps on BYO-devices by containerizing them, leaving personal data untouched!
https://ad.doubleclick.net/ddm/clk/304595813;131938128;j
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to