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