src/imm/agent/imma_cb.h | 11 +-
src/imm/agent/imma_db.cc | 37 +++++++-
src/imm/agent/imma_init.cc | 2 +
src/imm/agent/imma_oi_api.cc | 96 ++++++++++++++++++-
src/imm/agent/imma_om_api.cc | 211 +++++++++++++++++++++++++++++++++++++++---
src/imm/agent/imma_proc.cc | 31 ++++++
src/imm/common/immsv_api.h | 2 +-
src/imm/common/immsv_evt.c | 15 +++
src/imm/common/immsv_evt.h | 2 +
9 files changed, 382 insertions(+), 25 deletions(-)
diff --git a/src/imm/agent/imma_cb.h b/src/imm/agent/imma_cb.h
--- a/src/imm/agent/imma_cb.h
+++ b/src/imm/agent/imma_cb.h
@@ -1,6 +1,7 @@
/* -*- OpenSAF -*-
*
* (C) Copyright 2008 The OpenSAF Foundation
+ * Copyright (C) 2017, Oracle and/or its affiliates. All rights reserved.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
@@ -60,6 +61,7 @@ typedef struct imma_client_node {
will set this to true for the
connection. A resurrect can remove
it.*/
bool exposed; /* Exposed => stale is irreversible */
+ bool clmExposed; /* True ==> then handle is unavailable, due to clm
leaving the cluster*/
bool selObjUsable; /* Active resurrect possible for this client */
bool isPbe; /* True => This is the PBE-OI */
bool isImmA2b; /* Version A.02.11 */
@@ -70,6 +72,7 @@ typedef struct imma_client_node {
bool isImmA2fCbk; /* Version A.02.15 callback*/
bool isImmA2x10; /* Version A.02.16 */
bool isImmA2x11; /* Version A.02.17 */
+ bool isImmA2x12; /* Version A.02.18 */
bool isApplier; /* True => This is an Applier-OI */
bool isAug; /* True => handle internal to OI augmented CCB */
bool isBusy; /* True => handle is locked by a thread until a
function execution is done */
@@ -170,9 +173,10 @@ typedef struct imma_cb {
IMMA_CONTINUATION_RECORD *imma_continuations;
/* Sync up with IMMND ( MDS ) see imma_sync_with_immnd() in imma_init.c
*/
- NCS_LOCK immnd_sync_lock;
- bool immnd_sync_awaited;
- NCS_SEL_OBJ immnd_sync_sel;
+ NCS_LOCK immnd_sync_lock;
+ bool immnd_sync_awaited;
+ NCS_SEL_OBJ immnd_sync_sel;
+ bool clmMemberNode; /* True if the node is CLM Member node */
} IMMA_CB;
#define m_IMMSV_SET_SANAMET(name) \
@@ -248,6 +252,7 @@ void imma_process_stale_clients(IMMA_CB
void imma_free_errorStrings(SaStringT* errorStrings);
SaStringT* imma_getErrorStrings(IMMSV_SAERR_INFO* errRsp);
+void imma_client_tree_mark_clmexposed(IMMA_CB *cb);
/*30B Versioning Changes */
#define IMMA_MDS_PVT_SUBPART_VERSION 1
diff --git a/src/imm/agent/imma_db.cc b/src/imm/agent/imma_db.cc
--- a/src/imm/agent/imma_db.cc
+++ b/src/imm/agent/imma_db.cc
@@ -1,6 +1,7 @@
/* -*- OpenSAF -*-
*
* (C) Copyright 2008 The OpenSAF Foundation
+ * Copyright (C) 2017, Oracle and/or its affiliates. All rights reserved.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
@@ -120,6 +121,37 @@ uint32_t imma_client_node_delete(IMMA_CB
}
/****************************************************************************
+Name : imma_client_tree_mark_clmexposed
+Description : This routine marks the clmexposed in IMMA client tree.
+Arguments : IMMA_CB *cb - IMMA Control Block.
+Return Values : None
+Notes : None
+******************************************************************************/
+void imma_client_tree_mark_clmexposed(IMMA_CB *cb)
+{
+ IMMA_CLIENT_NODE *clnode;
+ SaImmHandleT *temp_ptr = 0;
+ SaImmHandleT temp_hdl = 0;
+ TRACE_ENTER();
+
+ /* scan the entire handle and mark clmexposed in each record */
+ while ((clnode = (IMMA_CLIENT_NODE *)
+ ncs_patricia_tree_getnext(&cb->client_tree,
(uint8_t *)temp_ptr))) {
+ /* mark the client info as clmexposed*/
+ if (clnode->isImmA2x12 && !cb->clmMemberNode){
+ clnode->clmExposed = true;
+ TRACE(" Marking clinet %llx as clmExposed",
clnode->handle);
+ }
+ temp_hdl = clnode->handle;
+ temp_ptr = &temp_hdl;
+ }
+
+ TRACE_LEAVE();
+ return;
+}
+
+
+/****************************************************************************
Name : imma_client_tree_destroy
Description : This routine destroys the IMMA client tree.
Arguments : IMMA_CB *cb - IMMA Control Block.
@@ -681,7 +713,10 @@ void imma_mark_clients_stale(IMMA_CB *cb
if(mark_exposed) {
clnode->exposed = true;
LOG_WA("marking handle as exposed");
- }
+ }else if (clnode->isImmA2x12 && clnode->clmExposed){
+ clnode->exposed = true;
+ LOG_WA("marking handle as exposed, CLM node left
cluster membership");
+ }
clnode->stale = true;
TRACE("Stale marked client cl:%u node:%x",
diff --git a/src/imm/agent/imma_init.cc b/src/imm/agent/imma_init.cc
--- a/src/imm/agent/imma_init.cc
+++ b/src/imm/agent/imma_init.cc
@@ -1,6 +1,7 @@
/* -*- OpenSAF -*-
*
* (C) Copyright 2008 The OpenSAF Foundation
+ * Copyright (C) 2017, Oracle and/or its affiliates. All rights reserved.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
@@ -136,6 +137,7 @@ static uint32_t imma_create(NCSMDS_SVC_I
TRACE_4("Failed to get cb lock");
goto lock_init_fail;
}
+ imma_cb.clmMemberNode = true;
/* Initalize the IMMA Trees & Linked lists */
rc = imma_db_init(cb);
diff --git a/src/imm/agent/imma_oi_api.cc b/src/imm/agent/imma_oi_api.cc
--- a/src/imm/agent/imma_oi_api.cc
+++ b/src/imm/agent/imma_oi_api.cc
@@ -1,6 +1,7 @@
/* -*- OpenSAF -*-
*
* (C) Copyright 2008 The OpenSAF Foundation
+ * Copyright (C) 2017, Oracle and/or its affiliates. All rights reserved.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
@@ -174,6 +175,10 @@ SaAisErrorT initialize_common(SaImmOiHan
cl_node->isImmA2x10 =
true;
if
(requested_version.minorVersion >= 0x11) {
cl_node->isImmA2x11 = true;
+ if
(requested_version.minorVersion >= 0x12) {
+
cl_node->isImmA2x12 = true;
+ }
+
}
}
}
@@ -249,6 +254,11 @@ SaAisErrorT initialize_common(SaImmOiHan
TRACE_2("ERR_TRY_AGAIN: IMMND is DOWN");
goto mds_fail;
}
+ if(cl_node->isImmA2x12 && !cb->clmMemberNode){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
/* send the request to the IMMND */
proc_rc = imma_mds_msg_sync_send(cb->imma_mds_hdl, &cb->immnd_mds_dest,
&init_evt, &out_evt,
@@ -269,6 +279,12 @@ SaAisErrorT initialize_common(SaImmOiHan
if (out_evt) {
rc = out_evt->info.imma.info.initRsp.error;
+ if (rc == SA_AIS_ERR_UNAVAILABLE && cl_node->isImmA2x12){
+ cb->clmMemberNode = false;
+ TRACE(" Node left the CLM membership");
+ goto rsp_not_ok;
+ }
+
if (rc != SA_AIS_OK) {
goto rsp_not_ok;
}
@@ -347,7 +363,9 @@ SaAisErrorT initialize_common(SaImmOiHan
free(out_evt1);
}
}
-
+ TRACE_2("OI client version A.2.%u", requested_version.minorVersion);
+
+ clm_left:
rsp_not_ok:
mds_fail:
@@ -445,6 +463,11 @@ SaAisErrorT saImmOiSelectionObjectGet(Sa
rc = SA_AIS_ERR_BAD_HANDLE;
goto node_not_found;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
if (cl_node->stale) {
TRACE_1("Handle %llx is stale", immOiHandle);
@@ -479,6 +502,7 @@ SaAisErrorT saImmOiSelectionObjectGet(Sa
cl_node->selObjUsable = true;
+ clm_left:
node_not_found:
resurrect_failed:
if (locked)
@@ -535,6 +559,12 @@ SaAisErrorT saImmOiDispatch(SaImmOiHandl
goto fail;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
+
if (cl_node->stale) {
TRACE_1("Handle %llx is stale, trying to resurrect it.",
immOiHandle);
@@ -625,6 +655,7 @@ SaAisErrorT saImmOiDispatch(SaImmOiHandl
pend_dis = cb->pend_dis;
pend_fin = cb->pend_fin;
+ clm_left:
fail:
if (locked)
m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
@@ -934,6 +965,11 @@ static SaAisErrorT admin_op_result_commo
LOG_IN("ERR_BAD_HANDLE: client_node_get failed");
goto node_not_found;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
if (cl_node->stale) {
TRACE_1("Handle %llx is stale", immOiHandle);
@@ -1128,9 +1164,9 @@ static SaAisErrorT admin_op_result_commo
free(p); /*free-a */
}
+ clm_left:
stale_handle:
node_not_found:
-
if (locked)
m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
@@ -1214,6 +1250,11 @@ SaAisErrorT saImmOiImplementerSet(SaImmO
TRACE_2("ERR_BAD_HANDLE: client_node_get failed");
goto bad_handle;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
if (cl_node->mImplementerId) {
rc = SA_AIS_ERR_INVALID_PARAM;
@@ -1437,6 +1478,7 @@ SaAisErrorT saImmOiImplementerSet(SaImmO
cl_node->isPbe = 0x0;
}
+ clm_left:
bad_handle:
if (locked)
m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
@@ -1497,6 +1539,11 @@ SaAisErrorT saImmOiImplementerClear(SaIm
rc = SA_AIS_ERR_BAD_HANDLE;
goto bad_handle;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
if (cl_node->mImplementerId == 0) {
rc = SA_AIS_ERR_BAD_HANDLE;
@@ -1587,6 +1634,7 @@ SaAisErrorT saImmOiImplementerClear(SaIm
cl_node->isApplier = 0;
}
+ clm_left:
bad_handle:
if (locked)
m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
@@ -1660,6 +1708,11 @@ SaAisErrorT saImmOiClassImplementerSet(S
rc = SA_AIS_ERR_BAD_HANDLE;
goto bad_handle;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
if (cl_node->stale) {
TRACE_1("Handle %llx is stale", immOiHandle);
@@ -1769,6 +1822,7 @@ SaAisErrorT saImmOiClassImplementerSet(S
fevs_error:
bad_handle:
+ clm_left:
if (locked)
m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
@@ -1840,6 +1894,11 @@ SaAisErrorT saImmOiClassImplementerRelea
rc = SA_AIS_ERR_BAD_HANDLE;
goto bad_handle;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
if (cl_node->stale) {
TRACE_1("Handle %llx is stale", immOiHandle);
@@ -1937,7 +1996,7 @@ SaAisErrorT saImmOiClassImplementerRelea
osafassert(out_evt->info.imma.type == IMMA_EVT_ND2A_IMM_ERROR);
rc = out_evt->info.imma.info.errRsp.error;
-
+ clm_left:
fevs_error:
bad_handle:
if (locked)
@@ -2484,6 +2543,11 @@ static SaAisErrorT rt_object_update_comm
TRACE_2("ERR_VERSION: saImmOiRtObjectUpdate_o3 is supported
from A.2.15");
goto bad_handle;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
if (cl_node->stale) {
TRACE_1("Handle %llx is stale", immOiHandle);
@@ -2674,6 +2738,7 @@ static SaAisErrorT rt_object_update_comm
}
}
+ clm_left:
skip_over_send:
bad_sync:
bad_handle1:
@@ -2803,6 +2868,11 @@ static SaAisErrorT rt_object_create_comm
TRACE_2("ERR_VERSION: saImmOiRtObjectCreate_o3 is supported
from A.2.15");
goto bad_handle;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
if (cl_node->stale) {
TRACE_1("Handle %llx is stale", immOiHandle);
@@ -3049,7 +3119,7 @@ static SaAisErrorT rt_object_create_comm
p->next = NULL;
free(p); /*free-3 */
}
-
+ clm_left:
bad_handle:
if (locked) {
m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
@@ -3147,6 +3217,11 @@ static SaAisErrorT rt_object_delete_comm
TRACE_2("ERR_VERSION: saImmOiRtObjectDelete_o3 is supported
from A.2.15");
goto bad_handle;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
if (cl_node->stale) {
TRACE_1("Handle %llx is stale", immOiHandle);
@@ -3244,6 +3319,7 @@ static SaAisErrorT rt_object_delete_comm
osafassert(out_evt->info.imma.type == IMMA_EVT_ND2A_IMM_ERROR);
rc = out_evt->info.imma.info.errRsp.error;
+ clm_left:
fevs_error:
bad_handle:
if (locked)
@@ -3487,6 +3563,11 @@ SaAisErrorT saImmOiCcbSetErrorString(
TRACE_2("ERR_BAD_HANDLE: client_node_get failed");
goto bad_handle;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
if (cl_node->stale) {
TRACE_1("Handle %llx is stale", immOiHandle);
@@ -3529,6 +3610,7 @@ SaAisErrorT saImmOiCcbSetErrorString(
goto bad_handle;
}
+ clm_left:
bad_handle:
if (locked)
m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
@@ -3696,6 +3778,11 @@ SaAisErrorT saImmOiAugmentCcbInitialize(
rc = SA_AIS_ERR_BAD_HANDLE;
goto done;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
if (cl_node->stale) {
TRACE_1("ERR_BAD_HANDLE: Handle %llx is stale", immOiHandle);
@@ -3877,6 +3964,7 @@ SaAisErrorT saImmOiAugmentCcbInitialize(
osafassert(immsv_om_augment_ccb_initialize);
rc = immsv_om_augment_ccb_initialize(privateOmHandle, ccbId,
adminOwnerId,
ccbHandle, &privateAoHandle);
+clm_left:
done:
if (locked) {
diff --git a/src/imm/agent/imma_om_api.cc b/src/imm/agent/imma_om_api.cc
--- a/src/imm/agent/imma_om_api.cc
+++ b/src/imm/agent/imma_om_api.cc
@@ -2,6 +2,7 @@
*
* (C) Copyright 2008 The OpenSAF Foundation
* Copyright Ericsson AB 2009, 2017 - All Rights Reserved.
+ * Copyright (C) 2017, Oracle and/or its affiliates. All rights reserved.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
@@ -136,6 +137,10 @@ SaAisErrorT saImmOmInitialize_o2(SaImmHa
cl_node->isImmA2x10 = true;
if (requested_version.minorVersion >=
0x11) {
cl_node->isImmA2x11 = true;
+ if
(requested_version.minorVersion >= 0x12) {
+ cl_node->isImmA2x12 =
true;
+ TRACE("DBG: version
A.2.18 is set");
+ }
}
}
}
@@ -196,6 +201,10 @@ SaAisErrorT saImmOmInitialize(SaImmHandl
cl_node->isImmA2x10 =
true;
if
(requested_version.minorVersion >= 0x11) {
cl_node->isImmA2x11 = true;
+ if
(requested_version.minorVersion >= 0x12) {
+
cl_node->isImmA2x12 = true;
+
TRACE("DBG: version A.2.18 is set");
+ }
}
}
}
@@ -241,6 +250,12 @@ static SaAisErrorT initialize_common(SaI
goto end;
}
+ if(cl_node->isImmA2x12 && !cb->clmMemberNode){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
+
if((timeout_env_value = getenv("IMMA_SYNCR_TIMEOUT"))!=NULL) {
cl_node->syncr_timeout = atoi(timeout_env_value);
TRACE_2("IMMA library syncronous timeout set to:%lld",
cl_node->syncr_timeout);
@@ -310,6 +325,12 @@ static SaAisErrorT initialize_common(SaI
if (out_evt) {
rc = out_evt->info.imma.info.initRsp.error;
+ if (rc == SA_AIS_ERR_UNAVAILABLE && cl_node->isImmA2x12){
+ cb->clmMemberNode = false;
+ TRACE(" Node left the CLM membership");
+ goto rsp_not_ok;
+ }
+
if (rc != SA_AIS_OK) {
goto rsp_not_ok;
}
@@ -403,6 +424,7 @@ static SaAisErrorT initialize_common(SaI
out_evt1 =NULL;
}
}
+ TRACE("OM client version A.2.%u", version->minorVersion);
rsp_not_ok:
mds_fail:
@@ -426,6 +448,7 @@ static SaAisErrorT initialize_common(SaI
*immHandle = cl_node->handle;
}
+ clm_left:
end:
if (rc != SA_AIS_OK) {
if (NCSCC_RC_SUCCESS != imma_shutdown(NCSMDS_SVC_ID_IMMA_OM)) {
@@ -514,7 +537,12 @@ SaAisErrorT saImmOmSelectionObjectGet(Sa
goto no_callback;
}
}
-
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
+
if (cl_node->stale) {
TRACE_1("Handle %llx is stale", immHandle);
bool resurrected = imma_om_resurrect(cb, cl_node, &locked);
@@ -543,6 +571,7 @@ SaAisErrorT saImmOmSelectionObjectGet(Sa
cl_node->selObjUsable = true;
+ clm_left:
no_callback:
stale_handle:
node_not_found:
@@ -600,6 +629,11 @@ SaAisErrorT saImmOmDispatch(SaImmHandleT
rc = SA_AIS_ERR_BAD_HANDLE;
goto fail;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
if (cl_node->stale) {
TRACE_1("Handle %llx is stale, trying to resurrect it.",
immHandle);
@@ -688,6 +722,7 @@ SaAisErrorT saImmOmDispatch(SaImmHandleT
pend_dis = cb->pend_dis;
pend_fin = cb->pend_fin;
+ clm_left:
fail:
if (locked)
m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
@@ -974,6 +1009,11 @@ SaAisErrorT saImmOmAdminOwnerInitialize(
TRACE_2("ERR_BAD_HANDLE: client_node_get failed");
goto bad_handle;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
if (cl_node->stale) {
TRACE_1("Handle %llx is stale", immHandle);
@@ -1155,6 +1195,7 @@ SaAisErrorT saImmOmAdminOwnerInitialize(
ao_node_alloc_fail:
/* Do Nothing */
+ clm_left:
bad_handle:
if (locked)
m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
@@ -1378,6 +1419,12 @@ SaAisErrorT saImmOmCcbInitialize(SaImmAd
goto done;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
+
if (cl_node->stale) {
TRACE_1("IMM Handle %llx is stale", immHandle);
bool resurrected = imma_om_resurrect(cb, cl_node, &locked);
@@ -1536,6 +1583,7 @@ SaAisErrorT saImmOmCcbInitialize(SaImmAd
ccb_node = NULL;
}
+ clm_left:
done:
if (locked)
m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
@@ -1687,6 +1735,11 @@ static SaAisErrorT ccb_object_create_com
"A.02.15 and above");
goto done;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
if (cl_node->stale) {
TRACE_1("IMM Handle %llx is stale", immHandle);
@@ -2106,7 +2159,7 @@ static SaAisErrorT ccb_object_create_com
ccb_node->mAborted = true;
}
-
+ clm_left:
done:
imma_free_errorStrings(newErrorStrings); /* In case of failed resurrect
only */
@@ -2279,6 +2332,11 @@ static SaAisErrorT ccb_object_modify_com
"A.02.15 and above");
goto done;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
if (cl_node->stale) {
TRACE_1("IMM Handle %llx is stale", immHandle);
@@ -2604,6 +2662,7 @@ static SaAisErrorT ccb_object_modify_com
ccb_node->mAborted = true;
}
+ clm_left:
done:
imma_free_errorStrings(newErrorStrings); /* In case of failed resurrect
only */
@@ -2756,6 +2815,11 @@ static SaAisErrorT ccb_object_delete_com
"A.02.15 and above");
goto done;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
if (cl_node->stale) {
TRACE_1("IMM Handle %llx is stale exposed?:%u", immHandle,
cl_node->exposed);
@@ -2988,6 +3052,7 @@ static SaAisErrorT ccb_object_delete_com
ccb_node->mAborted = true;
}
+ clm_left:
done:
imma_free_errorStrings(newErrorStrings); /* In case of failed resurrect
only */
@@ -3115,6 +3180,11 @@ SaAisErrorT imma_applyCcb(SaImmCcbHandle
ccb_node->mCcbId);
goto done;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
if (cl_node->stale || !(cb->is_immnd_up)) {
TRACE_3("ERR_FAILED_OPERATION: IMMND DOWN and/or IMM Handle
%llx "
@@ -3425,7 +3495,7 @@ SaAisErrorT imma_applyCcb(SaImmCcbHandle
ccb_node->mAborted = true;
}
-
+ clm_left:
done:
imma_free_errorStrings(newErrorStrings); /* In case of failed resurrect
only */
@@ -3759,6 +3829,11 @@ static SaAisErrorT admin_op_invoke_commo
"A.02.15 and above");
goto client_not_found;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
if (cl_node->stale) {
TRACE_1("IMM Handle %llx is stale", immHandle);
@@ -3998,7 +4073,7 @@ static SaAisErrorT admin_op_invoke_commo
}
-
+ clm_left:
ao_not_found:
client_not_found:
stale_handle:
@@ -4070,6 +4145,11 @@ SaAisErrorT saImmOmAdminOperationMemoryF
rc = SA_AIS_ERR_BAD_HANDLE;
goto done;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
if (cl_node->stale) {
TRACE_1("IMM Handle %llx is stale - ignoring", immHandle);
@@ -4100,6 +4180,7 @@ SaAisErrorT saImmOmAdminOperationMemoryF
free(returnParams);
}
+ clm_left:
done:
if (locked) {
m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
@@ -4301,6 +4382,11 @@ static SaAisErrorT admin_op_invoke_async
"A.02.15 and above");
goto client_not_found;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
if (cl_node->stale) {
TRACE_1("IMM Handle %llx is stale", immHandle);
@@ -4486,6 +4572,7 @@ static SaAisErrorT admin_op_invoke_async
/* Note the imma_proc_decrement_pending_reply is done in the OM upcall
with the reply for the asyncronous operation.
*/
+ clm_left:
ao_not_found:
client_not_found:
stale_handle:
@@ -4702,6 +4789,11 @@ SaAisErrorT saImmOmClassCreate_2(SaImmHa
rc = SA_AIS_ERR_BAD_HANDLE;
goto client_not_found;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
if (cl_node->stale) {
TRACE_1("IMM Handle %llx is stale", immHandle);
@@ -4957,6 +5049,7 @@ SaAisErrorT saImmOmClassCreate_2(SaImmHa
cl_node->exposed = true;
}
+ clm_left:
client_not_found:
stale_handle:
bad_sync:
@@ -5011,6 +5104,11 @@ SaAisErrorT saImmOmClassDescriptionGet_2
rc = SA_AIS_ERR_BAD_HANDLE;
goto client_not_found;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
if (cl_node->stale) {
TRACE_1("IMM Handle %llx is stale", immHandle);
@@ -5285,6 +5383,7 @@ SaAisErrorT saImmOmClassDescriptionGet_2
cl_node->exposed = true;
}
+ clm_left:
client_not_found:
stale_handle:
bad_sync:
@@ -5341,6 +5440,13 @@ SaAisErrorT saImmOmClassDescriptionMemor
return SA_AIS_ERR_BAD_HANDLE;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
+ TRACE_LEAVE();
+ return SA_AIS_ERR_UNAVAILABLE;
+ }
+
if (cl_node->stale) {
TRACE_1("IMM Handle %llx is stale - ignoring", immHandle);
/*return SA_AIS_ERR_BAD_HANDLE;*/
@@ -5406,6 +5512,11 @@ SaAisErrorT saImmOmClassDelete(SaImmHand
rc = SA_AIS_ERR_BAD_HANDLE;
goto client_not_found;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
if (cl_node->stale) {
TRACE_1("IMM Handle %llx is stale", immHandle);
@@ -5494,6 +5605,7 @@ SaAisErrorT saImmOmClassDelete(SaImmHand
cl_node->exposed = true;
}
+ clm_left:
stale_handle:
client_not_found:
bad_sync:
@@ -5544,7 +5656,12 @@ SaAisErrorT saImmOmAccessorInitialize(Sa
rc = SA_AIS_ERR_BAD_HANDLE;
goto release_lock;
}
-
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
+
if (cl_node->stale) {
TRACE_1("IMM Handle %llx is stale", immHandle);
bool resurrected = imma_om_resurrect(cb, cl_node, &locked);
@@ -5606,6 +5723,7 @@ SaAisErrorT saImmOmAccessorInitialize(Sa
*accessorHandle = search_node->search_hdl;
cl_node->searchHandleSize++;
+ clm_left:
release_lock:
if (locked) {
m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
@@ -5657,6 +5775,13 @@ SaAisErrorT saImmOmAccessorFinalize(SaIm
search_node->mLastObjectName = NULL;
immHandle = search_node->mImmHandle;
+ imma_client_node_get(&cb->client_tree, &immHandle, &cl_node);
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
+
proc_rc = imma_search_node_delete(cb, search_node);
search_node = NULL;
if (proc_rc != NCSCC_RC_SUCCESS) {
@@ -5664,7 +5789,6 @@ SaAisErrorT saImmOmAccessorFinalize(SaIm
rc = SA_AIS_ERR_LIBRARY;
} else {
/* Decrease number of search handles per IMM handle */
- imma_client_node_get(&cb->client_tree, &immHandle, &cl_node);
if (cl_node && cl_node->isOm) { /* TODO: Is osafassert(cl_node
&& cl_node->isOm) better solution */
osafassert(cl_node->searchHandleSize);
cl_node->searchHandleSize--;
@@ -5674,6 +5798,7 @@ SaAisErrorT saImmOmAccessorFinalize(SaIm
}
}
+ clm_left:
release_lock:
if (locked) {
m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
@@ -5827,7 +5952,12 @@ static SaAisErrorT accessor_get_common(S
if(ccbId) {
TRACE_2("This is a SAFE read, ccbId:%u", ccbId);
}
-
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
+
if (cl_node->stale) {
TRACE_1("IMM Handle %llx is stale", immHandle);
bool resurrected = imma_om_resurrect(cb, cl_node, &locked);
@@ -6073,6 +6203,7 @@ mds_send_fail:
}
/*error cases only */
+ clm_left:
release_lock:
if (locked) {
m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
@@ -6293,7 +6424,12 @@ SaAisErrorT saImmOmCcbObjectRead(SaImmCc
TRACE_4("ERR_LIBRARY: No valid SaImmHandleT associated with
Ccb");
goto done;
}
-
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
+
if(!cl_node->isImmA2x11) {
rc = SA_AIS_ERR_VERSION;
TRACE_2("ERR_VERSION: saImmOmCcbObjectRead only supported for "
@@ -6532,6 +6668,7 @@ SaAisErrorT saImmOmCcbObjectRead(SaImmCc
rc = accessor_get_common(accessorHandle, objectName,
attributeNames, attributes, true, ccbId);
}
+ clm_left:
done:
//imma_free_errorStrings(newErrorStrings); /* In case of failed
resurrect only */
@@ -7066,7 +7203,12 @@ static SaAisErrorT search_init_common(Sa
"A.02.15 and above");
goto release_lock;
}
-
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
+
if (cl_node->stale) {
TRACE_1("IMM Handle %llx is stale", immHandle);
bool resurrected = imma_om_resurrect(cb, cl_node, &locked);
@@ -7402,12 +7544,12 @@ static SaAisErrorT search_init_common(Sa
/*Node never added to tree */
free(search_node);
}
-
+ clm_left:
release_lock:
if (locked) {
m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
}
-lock_fail:
+ lock_fail:
if(out_evt) {
free(out_evt);
out_evt=NULL;
@@ -7532,6 +7674,12 @@ static SaAisErrorT search_next_common(Sa
goto release_lock;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ error = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
+
if (cl_node->stale) {
TRACE_3("ERR_BAD_HANDLE: IMM Handle %llx is stale", immHandle);
cl_node->exposed = true;
@@ -7770,6 +7918,7 @@ searchresult:
free(searchBundle);
}
+ clm_left:
release_lock:
if (locked) {
m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
@@ -7848,7 +7997,12 @@ SaAisErrorT saImmOmSearchFinalize(SaImmS
TRACE_4("ERR_LIBRARY: Invalid SaImmHandleT related to search
handle");
goto release_lock;
}
-
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ error = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
+
if (cl_node->stale) {
TRACE_1("IMM Handle %llx is stale", immHandle);
error = SA_AIS_OK; /*Dont punish the client for closing
stale handle */
@@ -7943,6 +8097,7 @@ SaAisErrorT saImmOmSearchFinalize(SaImmS
}
}
+ clm_left:
mds_failed:
release_lock:
if (locked) {
@@ -8098,7 +8253,12 @@ static SaAisErrorT admin_owner_set_commo
"A.02.15 and above");
goto done;
}
-
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
+
if (cl_node->stale) {
TRACE_1("IMM Handle %llx is stale", immHandle);
bool resurrected = imma_om_resurrect(cb, cl_node, &locked);
@@ -8197,6 +8357,7 @@ static SaAisErrorT admin_owner_set_commo
/* Ignore possibly stale handle, will be discovered in next op. */
+ clm_left:
done:
if (locked)
m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
@@ -8563,7 +8724,12 @@ static SaAisErrorT admin_owner_clear_com
"A.02.15 and above");
goto done;
}
-
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
+
if (cl_node->stale) {
TRACE_1("IMM Handle %llx is stale", immHandle);
bool resurrected = imma_om_resurrect(cb, cl_node, &locked);
@@ -8655,6 +8821,7 @@ static SaAisErrorT admin_owner_clear_com
/* Ignore possibly stale handle */
+ clm_left:
done:
if (locked)
m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
@@ -8719,6 +8886,11 @@ SaAisErrorT saImmOmAdminOwnerFinalize(Sa
TRACE_4("ERR_LIBRARY: Admin owner associated with closed
client");
goto done;
}
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
if (cl_node->stale) {
TRACE_1("IMM Handle %llx is stale", immHandle);
@@ -8788,6 +8960,7 @@ SaAisErrorT saImmOmAdminOwnerFinalize(Sa
}
}
+ clm_left:
done:
if (locked)
m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
@@ -8888,7 +9061,12 @@ static SaAisErrorT imma_finalizeCcb(SaIm
TRACE_4("ERR_LIBRARY: No valid SaImmHandleT associated with
Ccb");
goto done;
}
-
+ if(cl_node->isImmA2x12 && cl_node->clmExposed){
+ TRACE_2("SA_AIS_ERR_UNAVAILABLE: imma CLM node left the
cluster");
+ rc = SA_AIS_ERR_UNAVAILABLE;
+ goto clm_left;
+ }
+
if (cl_node->stale) {
TRACE_1("IMM Handle %llx is stale", immHandle);
rc = SA_AIS_OK; /*Dont punish the client for closing stale
handle */
@@ -9033,7 +9211,8 @@ static SaAisErrorT imma_finalizeCcb(SaIm
*/
}
}
-
+
+ clm_left:
done:
if (locked) {
m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
diff --git a/src/imm/agent/imma_proc.cc b/src/imm/agent/imma_proc.cc
--- a/src/imm/agent/imma_proc.cc
+++ b/src/imm/agent/imma_proc.cc
@@ -1,6 +1,7 @@
/* -*- OpenSAF -*-
*
* (C) Copyright 2008 The OpenSAF Foundation
+ * Copyright (C) 2017, Oracle and/or its affiliates. All rights reserved.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
@@ -1350,6 +1351,31 @@ void imma_proc_free_pointers(IMMA_CB *cb
}
/****************************************************************************
+ Name : imma_proc_clm_status_changed
+ Description : This function will process the clm state changes.
+ Arguments : cb - IMMA CB.
+ evt - IMMA_EVT.
+ Return Values : None
+******************************************************************************/
+static void imma_proc_clm_status_changed(IMMA_CB *cb, IMMA_EVT *evt)
+{
+ if (m_NCS_LOCK(&cb->cb_lock, NCS_LOCK_WRITE) != NCSCC_RC_SUCCESS) {
+ TRACE_3("Lock failure");
+ return;
+ }
+
+ if(evt->type == IMMA_EVT_ND2A_IMM_CLM_NODE_LEFT){
+ cb->clmMemberNode = false;
+ LOG_NO("CLM node left the cluster");
+ imma_client_tree_mark_clmexposed(cb);
+ } else if ( evt->type == IMMA_EVT_ND2A_IMM_CLM_NODE_JOINED){
+ cb->clmMemberNode = true;
+ TRACE("CLM node join the cluster");
+ }
+ m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE);
+}
+
+/****************************************************************************
Name : imma_process_evt
Description : This routine will process the callback event received from
IMMND.
@@ -1417,6 +1443,11 @@ void imma_process_evt(IMMA_CB *cb, IMMSV
imma_process_stale_clients(cb);
break;
+ case IMMA_EVT_ND2A_IMM_CLM_NODE_LEFT:
+ case IMMA_EVT_ND2A_IMM_CLM_NODE_JOINED:
+ imma_proc_clm_status_changed(cb, &evt->info.imma);
+ break;
+
default:
TRACE_4("Unknown event type %u", evt->info.imma.type);
break;
diff --git a/src/imm/common/immsv_api.h b/src/imm/common/immsv_api.h
--- a/src/imm/common/immsv_api.h
+++ b/src/imm/common/immsv_api.h
@@ -1,6 +1,7 @@
/* -*- OpenSAF -*-
*
* (C) Copyright 2008 The OpenSAF Foundation
+ * Copyright (C) 2017, Oracle and/or its affiliates. All rights reserved.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
@@ -149,7 +150,6 @@ typedef enum {
#define OPENSAF_IMM_FLAG_PRT50_ALLOW 0x00000080
#define OPENSAF_IMM_FLAG_PRT51_ALLOW 0x00000100
-
#define OPENSAF_IMM_SERVICE_NAME "safImmService"
typedef enum {
diff --git a/src/imm/common/immsv_evt.c b/src/imm/common/immsv_evt.c
--- a/src/imm/common/immsv_evt.c
+++ b/src/imm/common/immsv_evt.c
@@ -1,6 +1,7 @@
/* -*- OpenSAF -*-
*
* (C) Copyright 2008 The OpenSAF Foundation
+ * Copyright (C) 2017, Oracle and/or its affiliates. All rights reserved.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
@@ -2798,6 +2799,13 @@ static uint32_t immsv_evt_enc_toplevel(I
case IMMA_EVT_ND2A_IMM_SYNC_RSP:
break;
*/
+
+ case IMMA_EVT_ND2A_IMM_CLM_NODE_LEFT:
+ case IMMA_EVT_ND2A_IMM_CLM_NODE_JOINED:
+ /* Noinformation is shared because of these evevts
+ encoding/decoding is not required */
+ break;
+
default:
LOG_ER("Illegal IMMA message type:%u", immaevt->type);
rc = NCSCC_RC_OUT_OF_MEM;
@@ -4203,6 +4211,13 @@ static uint32_t immsv_evt_dec_toplevel(N
case IMMA_EVT_ND2A_IMM_SYNC_RSP:
break;
*/
+
+ case IMMA_EVT_ND2A_IMM_CLM_NODE_LEFT:
+ case IMMA_EVT_ND2A_IMM_CLM_NODE_JOINED:
+ /* Noinformation is shared because of these evevts
+ encoding/decoding is not required */
+ break;
+
default:
LOG_ER("Illegal IMMA message type:%u", immaevt->type);
rc = NCSCC_RC_FAILURE;
diff --git a/src/imm/common/immsv_evt.h b/src/imm/common/immsv_evt.h
--- a/src/imm/common/immsv_evt.h
+++ b/src/imm/common/immsv_evt.h
@@ -93,6 +93,8 @@ typedef enum imma_evt_type {
IMMA_EVT_ND2A_OI_OBJ_CREATE_LONG_UC = 31, /*OBJ CREATE UP-CALL
with long DN. */
IMMA_EVT_ND2A_OI_OBJ_MODIFY_LONG_UC = 32, /*OBJ MODIFY UP-CALL
with long DN. */
IMMA_EVT_ND2A_OI_OBJ_DELETE_LONG_UC = 33, /*OBJ DELETE UP-CALL
with long DN. */
+ IMMA_EVT_ND2A_IMM_CLM_NODE_LEFT = 34, /* when clm-lock/clm-node left
the cluster */
+ IMMA_EVT_ND2A_IMM_CLM_NODE_JOINED = 35, /* when clm-lock/clm-node join
the cluster */
IMMA_EVT_MAX
} IMMA_EVT_TYPE;
------------------------------------------------------------------------------
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