src/imm/immnd/ImmModel.cc  |  39 ++++++++++++++++++++++++++++++++++++++
 src/imm/immnd/ImmModel.h   |   6 ++++-
 src/imm/immnd/immnd_clm.c  |   7 +++--
 src/imm/immnd/immnd_init.h |   3 ++
 src/imm/immnd/immnd_proc.c |  47 ++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 98 insertions(+), 4 deletions(-)


diff --git a/src/imm/immnd/ImmModel.cc b/src/imm/immnd/ImmModel.cc
--- a/src/imm/immnd/ImmModel.cc
+++ b/src/imm/immnd/ImmModel.cc
@@ -1091,6 +1091,30 @@ immModel_getOldCriticalCcbs(IMMND_CB *cb
     }
 }
 
+void 
+immmModel_getLocalImplementers(IMMND_CB * cb, 
+    SaUint32T* arrSize, 
+    SaUint32T** implIdArr,
+    SaUint32T**  implConnArr)
+{
+    ConnVector cv;
+    ConnVector::iterator cvi;
+    IdVector idv;
+    IdVector::iterator idv_it;
+    unsigned int ix=0;
+
+    ImmModel::instance(&cb->immModel)->getLocalImplementers(cv, idv);
+    if(cv.size()){
+        *arrSize = cv.size();
+        *implIdArr = (SaUint32T *) malloc((*arrSize)* sizeof(SaUint32T));
+        *implConnArr = (SaUint32T *) malloc((*arrSize)* sizeof(SaUint32T));
+        for(cvi = cv.begin(), idv_it = idv.begin(); cvi!=cv.end(); ix++, 
cvi++, idv_it++){
+           (*implIdArr)[ix] = (*idv_it);
+            (*implConnArr)[ix] = (*cvi);
+        }
+    }
+
+}
 unsigned int
 immModel_pbeOiExists(IMMND_CB *cb)
 {
@@ -3086,6 +3110,21 @@ ImmModel::getMaxSyncBatchSize()
     return mbSize;
 }
 
+void
+ImmModel::getLocalImplementers(ConnVector & cv, IdVector &idv)
+{
+    TRACE_ENTER();
+    ImplementerVector::iterator i;
+    for(i = sImplementerVector.begin(); i != sImplementerVector.end(); ++i) {
+        ImplementerInfo* info = (*i);
+        if(info->mConn) {
+            cv.push_back(info->mConn);
+            idv.push_back(info->mId);
+       }
+    }
+    TRACE_LEAVE();
+}
+
 bool
 ImmModel::getLongDnsAllowed(ObjectInfo* immObject)
 {
diff --git a/src/imm/immnd/ImmModel.h b/src/imm/immnd/ImmModel.h
--- a/src/imm/immnd/ImmModel.h
+++ b/src/imm/immnd/ImmModel.h
@@ -670,7 +670,11 @@ public:
    SaAisErrorT          verifyImmLimits(
                                          ObjectInfo* object,
                                          std::string objectName); 
-    
+
+   void                getLocalImplementers( 
+                                              ConnVector & cv,
+                                              IdVector &idv);
+
 private:
     bool               checkSubLevel(
                                      const std::string& objectName, 
diff --git a/src/imm/immnd/immnd_clm.c b/src/imm/immnd/immnd_clm.c
--- a/src/imm/immnd/immnd_clm.c
+++ b/src/imm/immnd/immnd_clm.c
@@ -38,6 +38,7 @@ uint32_t immnd_clm_node_change(bool left
        if(left){
                immnd_cb->isClmNodeJoined = false;
                TRACE("isClmNodeJoined is set to false");
+               immnd_proc_unregister_local_implemeters(immnd_cb);
        } else {
                immnd_cb->isClmNodeJoined = true;
                TRACE("isClmNodeJoined is set to true");
@@ -67,9 +68,9 @@ uint32_t immnd_clm_node_change(bool left
                                TRACE("immnd_mds_msg_send success");
                        }
                }
-                       clientHdl = client_node->imm_app_hdl;
-                       immnd_client_node_getnext(immnd_cb, clientHdl, 
&client_node);
-               }
+               clientHdl = client_node->imm_app_hdl;
+               immnd_client_node_getnext(immnd_cb, clientHdl, &client_node);
+       }
        TRACE_LEAVE();
        return rc;
 }
diff --git a/src/imm/immnd/immnd_init.h b/src/imm/immnd/immnd_init.h
--- a/src/imm/immnd/immnd_init.h
+++ b/src/imm/immnd/immnd_init.h
@@ -454,6 +454,8 @@ extern "C" {
                ...);
 
        void immModel_setScAbsenceAllowed(IMMND_CB *cb);
+       
+       void immmModel_getLocalImplementers(IMMND_CB * cb, SaUint32T* arrSize, 
SaUint32T** implIdArr, SaUint32T**  implConnArr);
 
 #ifdef __cplusplus
 }
@@ -501,6 +503,7 @@ void freeSearchNext(IMMSV_OM_RSP_SEARCH_
 
 /* File : ----  immnd_proc.c */
 uint32_t immnd_proc_server(uint32_t *timeout);
+void immnd_proc_unregister_local_implemeters(IMMND_CB *cb);
 /* End : ----  immnd_proc.c  */
 
 /* File : ----  immnd_clm.c */
diff --git a/src/imm/immnd/immnd_proc.c b/src/imm/immnd/immnd_proc.c
--- a/src/imm/immnd/immnd_proc.c
+++ b/src/imm/immnd/immnd_proc.c
@@ -369,6 +369,53 @@ void immnd_proc_imma_discard_stales(IMMN
        TRACE_LEAVE();
 }
 
+
+/****************************************************************************
+ * Name          : immnd_proc_unregister_local_implemeters
+ *
+ * Description   : Function to unregister local implementers 
+ *                 when node leaves CLM membership( CLM node lock).
+ *
+ * Arguments     : IMMND_CB *cb - IMMND CB pointer
+ *
+ * Notes         : None.
+ *****************************************************************************/
+void immnd_proc_unregister_local_implemeters(IMMND_CB *cb)
+{
+       SaUint32T *implIdArr = NULL, * implConnArr = NULL;
+        SaUint32T arrSize = 0, ix=0;
+       SaImmOiHandleT implHandle;
+       IMMND_IMM_CLIENT_NODE *cl_node = NULL;
+       IMMSV_EVT send_evt;
+       TRACE_ENTER();
+       
+       immmModel_getLocalImplementers(cb, &arrSize, &implIdArr, &implConnArr);
+       
+       for (ix = 0; ix < arrSize ; ix ++){
+               implHandle = m_IMMSV_PACK_HANDLE(implConnArr[ix], cb->node_id);
+               immnd_client_node_get(cb, implHandle, &cl_node);
+               osafassert(cl_node);
+               if (cl_node->version.minorVersion >= 0x12 &&
+                               cl_node->version.majorVersion == 0x2 &&
+                               cl_node->version.releaseCode == 'A') {
+                       osafassert(implIdArr[ix]);
+                       TRACE_5("Discarding implementer id:%u for connection as 
node leaves CLM membership: %u", implIdArr[ix], implConnArr[ix]);
+                       memset(&send_evt, '\0', sizeof(IMMSV_EVT));
+                       send_evt.type = IMMSV_EVT_TYPE_IMMD;
+                       send_evt.info.immd.type = IMMD_EVT_ND2D_DISCARD_IMPL;
+                       send_evt.info.immd.info.impl_set.r.impl_id = 
implIdArr[ix];
+                       if (immnd_mds_msg_send(cb, NCSMDS_SVC_ID_IMMD, 
cb->immd_mdest_id, &send_evt) != NCSCC_RC_SUCCESS) {
+                               LOG_WA("Discard implementer failed for 
implId:%u "
+                                               "node left CLM membership", 
implIdArr[ix]);
+                               cl_node->mIsStale = true;
+                       }
+                       immModel_discardImplementer(cb, implIdArr[ix], false, 
NULL, NULL);
+               }
+       }
+       TRACE_LEAVE();
+}
+
+
 /**************************************************************************
  * Name     :  immnd_introduceMe
  *

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to