src/imm/Makefile.am | 5 +-
src/imm/immnd/ImmModel.cc | 44 ++++++++++++--
src/imm/immnd/ImmModel.h | 2 +
src/imm/immnd/immnd_cb.h | 18 ++++++
src/imm/immnd/immnd_db.c | 125 ++++++++++++++++++++++++++++++++++++++++++
src/imm/immnd/immnd_evt.c | 31 ++++++++-
src/imm/immnd/immnd_init.h | 7 ++
src/imm/immnd/immnd_main.c | 42 +++++++++++++-
src/imm/immnd/immnd_mds.c | 30 +++++++++-
src/nid/nodeinit.conf.payload | 2 +-
10 files changed, 289 insertions(+), 17 deletions(-)
diff --git a/src/imm/Makefile.am b/src/imm/Makefile.am
--- a/src/imm/Makefile.am
+++ b/src/imm/Makefile.am
@@ -2,6 +2,7 @@
#
# (C) Copyright 2016 The OpenSAF Foundation
# Copyright Ericsson AB 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
@@ -352,6 +353,7 @@ bin_osafimmnd_SOURCES = \
src/imm/immnd/immnd_main.c \
src/imm/immnd/immnd_mds.c \
src/imm/immnd/immnd_proc.c \
+ src/imm/immnd/immnd_clm.c \
src/imm/immnd/ImmAttrValue.cc \
src/imm/immnd/ImmSearchOp.cc \
src/imm/immnd/ImmModel.cc
@@ -359,7 +361,8 @@ bin_osafimmnd_SOURCES = \
bin_osafimmnd_LDADD = \
lib/libimm_common.la \
lib/libSaAmf.la \
- lib/libopensaf_core.la
+ lib/libopensaf_core.la \
+ lib/libSaClm.la
bin_osafimmpbed_CXXFLAGS = $(AM_CXXFLAGS)
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
@@ -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
@@ -671,12 +672,12 @@ immModel_pbePrtoPurgeMutations(IMMND_CB
ConnVector::iterator cvi;
unsigned int ix = 0;
ImmModel::instance(&cb->immModel)->pbePrtoPurgeMutations(nodeId, cv);
- *reqArrSize = (SaUint32T) cv.size();
- if(*reqArrSize) {
- *reqConnArr = (SaUint32T *) malloc((*reqArrSize)*
sizeof(SaUint32T));
- for(cvi = cv.begin(); cvi!= cv.end();++cvi,++ix) {
- (*reqConnArr)[ix] = (*cvi);
- }
+ if(reqArrSize && reqConnArr && cv.size()){
+ *reqArrSize = (SaUint32T) cv.size();
+ *reqConnArr = (SaUint32T *) malloc((*reqArrSize)* sizeof(SaUint32T));
+ for(cvi = cv.begin(); cvi!= cv.end();++cvi,++ix) {
+ (*reqConnArr)[ix] = (*cvi);
+ }
}
}
@@ -1162,6 +1163,12 @@ immModel_protocol51Allowed(IMMND_CB *cb)
return ImmModel::instance(&cb->immModel)->protocol51Allowed();
}
+bool
+immModel_protocol52Allowed(IMMND_CB *cb)
+{
+ return ImmModel::instance(&cb->immModel)->protocol52Allowed();
+}
+
OsafImmAccessControlModeT
immModel_accessControlMode(IMMND_CB *cb)
{
@@ -4056,6 +4063,30 @@ ImmModel::protocol51Allowed()
return noStdFlags & OPENSAF_IMM_FLAG_PRT51_ALLOW;
}
+bool
+ImmModel::protocol52Allowed()
+{
+ //TRACE_ENTER();
+ /* Assume that all nodes are running the same version when loading
+ if (sImmNodeState == IMM_NODE_LOADING) {
+ return true;
+ }*/
+ ObjectMap::iterator oi = sObjectMap.find(immObjectDn);
+ if(oi == sObjectMap.end()) {
+ return false;
+ }
+
+ ObjectInfo* immObject = oi->second;
+ ImmAttrValueMap::iterator avi =
+ immObject->mAttrValueMap.find(immAttrNostFlags);
+ osafassert(avi != immObject->mAttrValueMap.end());
+ osafassert(!(avi->second->isMultiValued()));
+ ImmAttrValue* valuep = avi->second;
+ unsigned int noStdFlags = valuep->getValue_int();
+
+ //TRACE_LEAVE();
+ return noStdFlags & OPENSAF_IMM_FLAG_PRT52_ALLOW;
+}
bool
ImmModel::protocol41Allowed()
@@ -5077,6 +5108,7 @@ ImmModel::adminOwnerDelete(SaUint32T own
noStdFlags |= OPENSAF_IMM_FLAG_PRT51_ALLOW;
}
+ noStdFlags |= OPENSAF_IMM_FLAG_PRT52_ALLOW;
valuep->setValue_int(noStdFlags);
LOG_NO("%s changed to: 0x%x", immAttrNostFlags.c_str(),
noStdFlags);
/* END Temporary code. */
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
@@ -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
@@ -117,6 +118,7 @@ public:
bool protocol47Allowed();
bool protocol50Allowed();
bool protocol51Allowed();
+ bool protocol52Allowed();
bool oneSafe2PBEAllowed();
bool purgeSyncRequest(SaUint32T clientId);
bool verifySchemaChange(const std::string& className,
diff --git a/src/imm/immnd/immnd_cb.h b/src/imm/immnd/immnd_cb.h
--- a/src/imm/immnd/immnd_cb.h
+++ b/src/imm/immnd/immnd_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
@@ -43,6 +44,11 @@ typedef struct immnd_om_search_node {
struct immnd_om_search_node *next;
} IMMND_OM_SEARCH_NODE;
+typedef struct immnd_clm_node_list {
+ NCS_PATRICIA_NODE patnode;
+ NCS_NODE_ID node_id;
+} IMMND_CLM_NODE_LIST;
+
typedef struct immnd_immom_client_node {
NCS_PATRICIA_NODE patnode;
SaImmHandleT imm_app_hdl; /* index for the client tree */
@@ -181,6 +187,11 @@ typedef struct immnd_cb_tag {
SaSelectionObjectT amf_sel_obj; /* Selection Object for AMF events */
int nid_started; /* true if started by NID */
bool isNodeTypeController; // true node type is controller
+ SaSelectionObjectT clmSelectionObject; /* Selection object to wait for
clms events*/
+ NCS_SEL_OBJ clm_init_sel_obj; /* Selection object wait for clms
intialization*/
+ bool isClmNodeJoined; /* True => If clm joined the cluster*/
+ //bool protocol52Allowed; // True, if protocol52 is allowed.
+ NCS_PATRICIA_TREE immnd_clm_list; /* IMMND_IMM_CLIENT_NODE - node
*/
} IMMND_CB;
/* CB prototypes */
@@ -200,6 +211,13 @@ uint32_t immnd_client_node_tree_init(IMM
void immnd_client_node_tree_cleanup(IMMND_CB *cb);
void immnd_client_node_tree_destroy(IMMND_CB *cb);
+uint32_t immnd_clm_node_list_init(IMMND_CB *cb);
+void immnd_clm_node_get(IMMND_CB *cb, NODE_ID node, IMMND_CLM_NODE_LIST
**imm_clm_node);
+uint32_t immnd_clm_node_add(IMMND_CB *cb, NODE_ID key);
+uint32_t immnd_clm_node_delete(IMMND_CB *cb, IMMND_CLM_NODE_LIST
*immnd_clm_node);
+void immnd_clm_node_cleanup(IMMND_CB *cb);
+void immnd_clm_node_destroy(IMMND_CB *cb);
+
/*
#define m_IMMSV_CONVERT_EXPTIME_TEN_MILLI_SEC(t) \
SaTimeT now; \
diff --git a/src/imm/immnd/immnd_db.c b/src/imm/immnd/immnd_db.c
--- a/src/imm/immnd/immnd_db.c
+++ b/src/imm/immnd/immnd_db.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
@@ -172,6 +173,130 @@ void immnd_client_node_tree_destroy(IMMN
return;
}
+/****************************************************************************
+ Name : immnd_clm_node_list_init
+ Description : This routine is used to initialize the IMMND clm node list
init
+ Arguments : cb - pointer to the IMMND Control Block
+ Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
+ Notes : None
+*****************************************************************************/
+uint32_t immnd_clm_node_list_init(IMMND_CB *cb)
+{
+ NCS_PATRICIA_PARAMS param;
+ memset(¶m, 0, sizeof(NCS_PATRICIA_PARAMS));
+
+ param.key_size = sizeof(NODE_ID);
+ if (ncs_patricia_tree_init(&cb->immnd_clm_list, ¶m) !=
NCSCC_RC_SUCCESS) {
+ return NCSCC_RC_FAILURE;
+ }
+ return NCSCC_RC_SUCCESS;
+}
+
+/****************************************************************************
+ * Name : immnd_clm_node_get
+ * Description : Function to get the clm node from the clm list.
+ * Arguments : IMMND_CB *cb, - IMMND Control Block
+ * : NODE_ID - CLM nodeid.
+ * Return Values : IMMND_CLM_NODE_LIST ** immnd_clm_node_list
+ * Notes : None.
+ *****************************************************************************/
+void immnd_clm_node_get(IMMND_CB *cb, NODE_ID node, IMMND_CLM_NODE_LIST
**imm_clm_node)
+{
+ *imm_clm_node = (IMMND_CLM_NODE_LIST*)
+ ncs_patricia_tree_get(&cb->immnd_clm_list, (uint8_t *)&node);
+ return;
+}
+
+/****************************************************************************
+ Name : immnd_clm_node_add
+ Description : This routine adds the new node to immnd_clm_node_list
+ Arguments : immnd_tree - IMMND Tree.
+ NODE_ID - CLM Node.
+ Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
+ Notes : The caller takes the cb lock before calling this function
+*****************************************************************************/
+uint32_t immnd_clm_node_add(IMMND_CB *cb, NODE_ID key)
+{
+ IMMND_CLM_NODE_LIST *immnd_clm_node = calloc(1,
sizeof(IMMND_CLM_NODE_LIST));
+ immnd_clm_node->node_id = key;
+ immnd_clm_node->patnode.key_info = (uint8_t *)&immnd_clm_node->node_id;
+
+ if (ncs_patricia_tree_add(&cb->immnd_clm_list,
&immnd_clm_node->patnode) != NCSCC_RC_SUCCESS) {
+ LOG_ER("IMMND - ncs_patricia_tree_add failed in
immnd_clm_node_add");
+ free(immnd_clm_node);
+ return NCSCC_RC_FAILURE;
+ }
+
+ return NCSCC_RC_SUCCESS;
+}
+
+/****************************************************************************
+ Name : immnd_clm_node_delete
+ Description : This routine deletes the node from immnd_clm_node_list
+ Arguments : IMMD_CB *cb - IMMD Control Block.
+ : NODE_ID - CLM Node.
+ Return Values : None
+*****************************************************************************/
+uint32_t immnd_clm_node_delete(IMMND_CB *cb, IMMND_CLM_NODE_LIST
*immnd_clm_node)
+{
+ uint32_t rc = NCSCC_RC_SUCCESS;
+
+ /* Remove the Node from the client tree */
+ if (ncs_patricia_tree_del(&cb->immnd_clm_list, (NCS_PATRICIA_NODE
*)&immnd_clm_node->patnode) != NCSCC_RC_SUCCESS) {
+ LOG_WA("IMMND CLM NODE DELETE FROM PAT TREE FAILED");
+ rc = NCSCC_RC_FAILURE;
+ }
+
+ /* Free the Client Node */
+ if (immnd_clm_node) {
+ free(immnd_clm_node);
+ }
+ return rc;
+}
+
+/****************************************************************************
+ Name : immnd_clm_node_cleanup
+ Description : This routine Free all the nodes in clm_node_list.
+ Arguments : IMMD_CB *cb - IMMD Control Block.
+ Return Values : None
+****************************************************************************/
+void immnd_clm_node_cleanup(IMMND_CB *cb)
+{
+ IMMND_CLM_NODE_LIST *immnd_clm_node;
+ NODE_ID key;
+ memset(&key, 0, sizeof(NODE_ID));
+
+ /* Get the First Node */
+ immnd_clm_node = (IMMND_CLM_NODE_LIST*)
+ ncs_patricia_tree_getnext(&cb->immnd_clm_list, (uint8_t *)&key);
+ while (immnd_clm_node) {
+ key = immnd_clm_node->node_id;
+ immnd_clm_node_delete(cb, immnd_clm_node);
+
+ immnd_clm_node = (IMMND_CLM_NODE_LIST*)
+ ncs_patricia_tree_getnext(&cb->immnd_clm_list, (uint8_t
*)&key);
+ }
+
+ return;
+}
+
+/****************************************************************************
+ Name : immnd_clm_node_destroy
+ Description : This routine destroys the IMMND clm node list.
+ Arguments : IMMD_CB *cb - IMMD Control Block.
+ Return Values : None
+*****************************************************************************/
+void immnd_clm_node_destroy(IMMND_CB *cb)
+{
+ /* cleanup the clm list */
+ immnd_clm_node_cleanup(cb);
+
+ /* destroy the tree */
+ ncs_patricia_tree_destroy(&cb->immnd_clm_list);
+
+ return;
+}
+
/* FEVS MESSAGE QUEUEING */
/*************************************************************************
diff --git a/src/imm/immnd/immnd_evt.c b/src/imm/immnd/immnd_evt.c
--- a/src/imm/immnd/immnd_evt.c
+++ b/src/imm/immnd/immnd_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
@@ -786,6 +787,16 @@ static uint32_t immnd_evt_proc_imm_init(
}
}
+ if (evt->info.initReq.version.minorVersion >= 0x12 &&
+ evt->info.initReq.version.majorVersion == 0x2 &&
+ evt->info.initReq.version.releaseCode == 'A') {
+ if ( immModel_protocol52Allowed(cb) && !cb->isClmNodeJoined &&
cb->mIntroduced != 2) {
+ error = SA_AIS_ERR_UNAVAILABLE;
+ LOG_ER("CLM node went down prot=%x
nodeJoined=%x",immModel_protocol52Allowed(cb), cb->isClmNodeJoined);
+ goto clm_left;
+ }
+ }
+
cl_node = calloc(1, sizeof(IMMND_IMM_CLIENT_NODE));
if (cl_node == NULL) {
LOG_ER("IMMND - Client Alloc Failed");
@@ -835,6 +846,7 @@ static uint32_t immnd_evt_proc_imm_init(
send_evt.info.imma.info.initRsp.immHandle = cl_node->imm_app_hdl;
error = SA_AIS_OK;
+ clm_left:
agent_rsp:
send_evt.type = IMMSV_EVT_TYPE_IMMA;
send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_INIT_RSP;
@@ -9419,6 +9431,14 @@ static void immnd_evt_proc_finalize_sync
"SA_IMM_KEEP_REPOSITORY":"SA_IMM_INIT_FROM_FILE");
}
immnd_adjustEpoch(cb, true);
+ /* If the node is payload give the indication to
clm_init_sel_obj
+ * because payload nodes are not subscribing for AVD up
+ */
+ if(!immnd_cb->isNodeTypeController && !cb->clm_hdl){
+ TRACE_8("clm_init_sel_obj indication is given at
payload");
+ ncs_sel_obj_ind(&immnd_cb->clm_init_sel_obj);
+
+ }
/* Sync completed for client => trigger active resurrect. */
memset(&send_evt, '\0', sizeof(IMMSV_EVT));
@@ -9429,25 +9449,25 @@ static void immnd_evt_proc_finalize_sync
prev_hdl = cl_node->imm_app_hdl;
if(!(cl_node->mIsResurrect)) {
LOG_WA("Found active client id: %llx version:%c
%u %u, after sync, should not happen",
- cl_node->imm_app_hdl,
cl_node->version.releaseCode,
- cl_node->version.majorVersion,
- cl_node->version.minorVersion);
+ cl_node->imm_app_hdl,
cl_node->version.releaseCode,
+ cl_node->version.majorVersion,
+ cl_node->version.minorVersion);
immnd_client_node_getnext(cb, prev_hdl,
&cl_node);
continue;
}
/* Send resurrect message. */
if (immnd_mds_msg_send(cb, cl_node->sv_id,
- cl_node->agent_mds_dest,
&send_evt)!=NCSCC_RC_SUCCESS)
+ cl_node->agent_mds_dest,
&send_evt)!=NCSCC_RC_SUCCESS)
{
LOG_WA("Failed to send active resurrect
message");
}
+ ++count;
/* Remove the temporary client node. */
immnd_client_node_del(cb, cl_node);
memset(cl_node, '\0', sizeof(IMMND_IMM_CLIENT_NODE));
free(cl_node);
cl_node = NULL;
- ++count;
immnd_client_node_getnext(cb, 0, &cl_node);
}
TRACE_2("Triggered %u active resurrects", count);
@@ -10417,6 +10437,7 @@ static uint32_t immnd_evt_proc_mds_evt(I
}
}
LOG_NO("IMMD SERVICE IS DOWN, HYDRA IS CONFIGURED =>
UNREGISTERING IMMND form MDS");
+
immnd_mds_unregister(cb);
/* Discard local clients ... */
immnd_proc_discard_other_nodes(cb); /* Isolate from the rest of
cluster */
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
@@ -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
@@ -322,6 +323,7 @@ extern "C" {
bool immModel_protocol46Allowed(IMMND_CB *cb);
bool immModel_protocol47Allowed(IMMND_CB *cb);
bool immModel_protocol50Allowed(IMMND_CB *cb);
+ bool immModel_protocol52Allowed(IMMND_CB *cb);
bool immModel_oneSafe2PBEAllowed(IMMND_CB *cb);
OsafImmAccessControlModeT immModel_accessControlMode(IMMND_CB *cb);
const char *immModel_authorizedGroup(IMMND_CB *cb);
@@ -502,4 +504,9 @@ void freeSearchNext(IMMSV_OM_RSP_SEARCH_
uint32_t immnd_proc_server(uint32_t *timeout);
/* End : ---- immnd_proc.c */
+/* File : ---- immnd_clm.c */
+uint32_t immnd_clm_node_change(bool left);
+void immnd_init_with_clm();
+/* Ebd : ---- immnd_clm.c */
+
#endif // IMM_IMMND_IMMND_INIT_H_
diff --git a/src/imm/immnd/immnd_main.c b/src/imm/immnd/immnd_main.c
--- a/src/imm/immnd/immnd_main.c
+++ b/src/imm/immnd/immnd_main.c
@@ -1,6 +1,7 @@
/* -*- OpenSAF -*-
*
* (C) Copyright 2008-2010 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
@@ -41,6 +42,8 @@
#define FD_TERM 0
#define FD_AMF 1
#define FD_MBX 2
+#define FD_CLM_INIT 3
+#define FD_CLM 4
static IMMND_CB _immnd_cb;
IMMND_CB *immnd_cb = &_immnd_cb;
@@ -86,6 +89,7 @@ static uint32_t immnd_cb_db_init(IMMND_C
if (rc == NCSCC_RC_FAILURE)
LOG_ER("client node tree init failed");
+ rc = immnd_clm_node_list_init(cb);
return (rc);
}
@@ -144,6 +148,8 @@ static uint32_t immnd_initialize(char *p
immnd_cb->mProgName = progname;
immnd_cb->mDir = getenv("IMMSV_ROOT_DIRECTORY");
immnd_cb->mFile = getenv("IMMSV_LOAD_FILE");
+ immnd_cb->clm_hdl = 0;
+ immnd_cb->clmSelectionObject = -1;
if ((envVar = getenv("IMMSV_NUM_NODES"))) {
int numNodes = atoi(envVar);
if(numNodes > 255) {
@@ -224,6 +230,12 @@ static uint32_t immnd_initialize(char *p
LOG_ER("m_NCS_IPC_ATTACH FAILED");
goto done;
}
+
+ /* Create a selection object for clm intialization*/
+ if ((rc = ncs_sel_obj_create(&immnd_cb->clm_init_sel_obj)) !=
NCSCC_RC_SUCCESS) {
+ LOG_ER("ncs_sel_obj_create failed for clm intialization");
+ goto done;
+ }
if ((rc = immnd_mds_register(immnd_cb)) != NCSCC_RC_SUCCESS) {
TRACE("immnd_mds_register FAILED %u", rc);
@@ -278,8 +290,8 @@ int main(int argc, char *argv[])
server task when we are very bussy. */
int maxEvt = 100;
struct timespec start_time;
- struct pollfd fds[3];
- int term_fd;
+ struct pollfd fds[5];
+ int term_fd, nfds=4;;
daemonize(argc, argv);
@@ -310,6 +322,8 @@ int main(int argc, char *argv[])
fds[FD_AMF].events = POLLIN;
fds[FD_MBX].fd = mbx_fd.rmv_obj;
fds[FD_MBX].events = POLLIN;
+ fds[FD_CLM_INIT].fd = immnd_cb->clm_init_sel_obj.rmv_obj;
+ fds[FD_CLM_INIT].events = POLLIN;
while (1) {
/* Watch out for performance bug. Possibly change from
event-count
@@ -327,7 +341,7 @@ int main(int argc, char *argv[])
maxEvt = (timeout == 100) ? 50 : 100;
/* Wait for events */
- int ret = poll(fds, 3, (passed_time_ms < timeout) ? (timeout -
passed_time_ms) : 0);
+ int ret = poll(fds, nfds, (passed_time_ms < timeout) ? (timeout
- passed_time_ms) : 0);
if (ret == -1) {
if (errno == EINTR)
@@ -377,6 +391,28 @@ int main(int argc, char *argv[])
}
}
+ if (fds[FD_CLM_INIT].revents & POLLIN &&
!immnd_cb->clm_hdl) {
+ TRACE("Initalize CLM ");
+
ncs_sel_obj_rmv_ind(&immnd_cb->clm_init_sel_obj, true, true);
+ immnd_init_with_clm();
+ nfds=5;
+ fds[FD_CLM].fd = immnd_cb->clmSelectionObject;
+ fds[FD_CLM].events = POLLIN;
+ }
+
+ if (fds[FD_CLM].revents & POLLIN) {
+ if ((error = saClmDispatch(immnd_cb->clm_hdl,
SA_DISPATCH_ALL)) != SA_AIS_OK) {
+ LOG_ER("saClmDispatch failed: %u",
error);
+ if(error == SA_AIS_ERR_BAD_HANDLE){
+ LOG_NO("Re-initializing with
CLMS");
+
immnd_clm_node_cleanup(immnd_cb);
+ immnd_init_with_clm();
+ } else {
+ break;
+ }
+ }
+ }
+
if (eventCount >= maxEvt) {
/* Make some progress on background task,
even when we are very busy. */
diff --git a/src/imm/immnd/immnd_mds.c b/src/imm/immnd/immnd_mds.c
--- a/src/imm/immnd/immnd_mds.c
+++ b/src/imm/immnd/immnd_mds.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
@@ -188,6 +189,23 @@ uint32_t immnd_mds_register(IMMND_CB *cb
goto error1;
}
+ if(cb->isNodeTypeController){
+
+ /* STEP 6: Subscribe to AVD events in MDS. This will be
+ used for CLM registration at controllers.*/
+
+ svc_id[0] = NCSMDS_SVC_ID_AVD;
+ svc_info.i_op = MDS_SUBSCRIBE;
+ svc_info.info.svc_subscribe.i_scope = NCSMDS_SCOPE_INTRANODE;
+ svc_info.info.svc_subscribe.i_num_svcs = 1;
+ svc_info.info.svc_subscribe.i_svc_ids = svc_id;
+
+ if (ncsmds_api(&svc_info) == NCSCC_RC_FAILURE) {
+ LOG_WA("MDS AVD Subscription Failed");
+ goto error1;
+ }
+ }
+
cb->node_id = m_NCS_GET_NODE_ID;
TRACE_2("cb->node_id:%x", cb->node_id);
@@ -601,7 +619,17 @@ static uint32_t immnd_mds_svc_evt(IMMND_
priority = NCS_IPC_PRIORITY_VERY_HIGH;
m_NCS_UNLOCK(&cb->immnd_immd_up_lock, NCS_LOCK_WRITE);
- }
+ } else if (svc_evt->i_svc_id == NCSMDS_SVC_ID_AVD) {
+ if (svc_evt->i_change == NCSMDS_UP) {
+ TRACE_8("MDS UP dest: %" PRIx64 ", node ID: %x, svc_id:
%d",
+ svc_evt->i_dest, svc_evt->i_node_id,
svc_evt->i_svc_id);
+ //Subscribed for only INTRA NODE, only one ADEST will
come.
+ if (m_MDS_DEST_IS_AN_ADEST(svc_evt->i_dest) ) {
+ TRACE_8("AVD ADEST UP");
+ ncs_sel_obj_ind(&immnd_cb->clm_init_sel_obj);
+ }
+ }
+ }
/* IMMA events from other nodes can not happen */
if ((svc_evt->i_svc_id == NCSMDS_SVC_ID_IMMA_OM) || (svc_evt->i_svc_id
== NCSMDS_SVC_ID_IMMA_OI))
diff --git a/src/nid/nodeinit.conf.payload b/src/nid/nodeinit.conf.payload
--- a/src/nid/nodeinit.conf.payload
+++ b/src/nid/nodeinit.conf.payload
@@ -54,6 +54,6 @@
#############################################################################
xxCLCCLIDIRxx/osaf-transport:TRANSPORT:S:xxCLCCLIDIRxx/osaf-transport:6000:-6:2:1:start:stop
+xxCLCCLIDIRxx/osaf-clmna:CLMNA:S:xxCLCCLIDIRxx/osaf-clmna:4000::9:1:start:stop
xxCLCCLIDIRxx/osaf-immnd:IMMND:S:xxCLCCLIDIRxx/osaf-immnd:48000:4:2:1:start:stop
-xxCLCCLIDIRxx/osaf-clmna:CLMNA:S:xxCLCCLIDIRxx/osaf-clmna:4000::9:1:start:stop
xxCLCCLIDIRxx/osaf-amfnd:AMFND:S:xxCLCCLIDIRxx/osaf-amfnd:99000::0:1:start:stop
------------------------------------------------------------------------------
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