osaf/libs/common/cpsv/include/cpd_cb.h | 4 +
osaf/libs/common/cpsv/include/cpd_imm.h | 4 +-
osaf/libs/common/cpsv/include/cpd_init.h | 12 ++
osaf/services/saf/cpsv/cpd/cpd_amf.c | 16 ++-
osaf/services/saf/cpsv/cpd/cpd_db.c | 5 +
osaf/services/saf/cpsv/cpd/cpd_imm.c | 62 ++++++++++----
osaf/services/saf/cpsv/cpd/cpd_init.c | 136 ++++++++++++++++++------------
7 files changed, 157 insertions(+), 82 deletions(-)
Add support for configuring the system with more than two OpenSAF 2N SUs. In
particular, this means that all OpenSAF directors must support starting up
and running without (initially) getting any assignment from AMF. Locking of
an OpenSAF 2N SU is currently not supported on a system configured with more
than two OpenSAF 2N SUs.
diff --git a/osaf/libs/common/cpsv/include/cpd_cb.h
b/osaf/libs/common/cpsv/include/cpd_cb.h
--- a/osaf/libs/common/cpsv/include/cpd_cb.h
+++ b/osaf/libs/common/cpsv/include/cpd_cb.h
@@ -18,7 +18,9 @@
#ifndef CPD_CB_H
#define CPD_CB_H
+#include <stdbool.h>
#include <saClm.h>
+#include "cpd_tmr.h"
#define CPSV_CPD_MBCSV_VERSION 1
@@ -206,6 +208,8 @@ typedef struct cpd_cb_tag {
SaImmOiHandleT immOiHandle; /* IMM OI Handle */
SaSelectionObjectT imm_sel_obj; /*Selection object to wait for IMM
events */
+ SaSelectionObjectT clm_sel_obj;
+ bool fully_initialized;
} CPD_CB;
diff --git a/osaf/libs/common/cpsv/include/cpd_imm.h
b/osaf/libs/common/cpsv/include/cpd_imm.h
--- a/osaf/libs/common/cpsv/include/cpd_imm.h
+++ b/osaf/libs/common/cpsv/include/cpd_imm.h
@@ -1,8 +1,8 @@
#include "cpd.h"
-extern SaAisErrorT cpd_imm_init(CPD_CB *cb);
+extern SaAisErrorT cpd_imm_init(SaImmOiHandleT* immOiHandle,
SaSelectionObjectT* imm_sel_obj);
extern void cpd_imm_reinit_bg(CPD_CB * cb);
-extern void cpd_imm_declare_implementer(CPD_CB *cb);
+extern void cpd_imm_declare_implementer(SaImmOiHandleT* immOiHandle,
SaSelectionObjectT* imm_sel_obj);
extern SaAisErrorT create_runtime_ckpt_object(CPD_CKPT_INFO_NODE *ckpt_node,
SaImmOiHandleT immOiHandle);
extern SaAisErrorT create_runtime_replica_object(CPD_CKPT_REPLOC_INFO
*ckpt_reploc_node, SaImmOiHandleT immOiHandle);
extern void cpd_create_association_class_dn(const SaNameT *child_dn, const
SaNameT *parent_dn, const char *rdn_tag, SaNameT *dn);
diff --git a/osaf/libs/common/cpsv/include/cpd_init.h
b/osaf/libs/common/cpsv/include/cpd_init.h
--- a/osaf/libs/common/cpsv/include/cpd_init.h
+++ b/osaf/libs/common/cpsv/include/cpd_init.h
@@ -26,6 +26,13 @@
This file consists of constats, enums and data structs used by cpd_init.c
******************************************************************************/
+#ifndef OPENSAF_OSAF_LIBS_COMMON_CPSV_INCLUDE_CPD_INIT_H_
+#define OPENSAF_OSAF_LIBS_COMMON_CPSV_INCLUDE_CPD_INIT_H_
+
+#include <stdint.h>
+#include "saAmf.h"
+#include "cpd_cb.h"
+
uint32_t gl_cpd_cb_hdl;
/* Macro to get the component name for the component type */
@@ -62,3 +69,8 @@ typedef struct cpd_create_info {
typedef struct cpd_destroy_info {
uint32_t dummy;
} CPD_DESTROY_INFO;
+
+extern uint32_t initialize_for_assignment(CPD_CB *cb,
+ SaAmfHAStateT ha_state);
+
+#endif /* OPENSAF_OSAF_LIBS_COMMON_CPSV_INCLUDE_CPD_INIT_H_ */
diff --git a/osaf/services/saf/cpsv/cpd/cpd_amf.c
b/osaf/services/saf/cpsv/cpd/cpd_amf.c
--- a/osaf/services/saf/cpsv/cpd/cpd_amf.c
+++ b/osaf/services/saf/cpsv/cpd/cpd_amf.c
@@ -131,6 +131,16 @@ void cpd_saf_csi_set_cb(SaInvocationT in
TRACE_ENTER();
cb = ncshm_take_hdl(NCS_SERVICE_ID_CPD, gl_cpd_cb_hdl);
if (cb) {
+ if ((rc = initialize_for_assignment(cb, haState)) !=
+ NCSCC_RC_SUCCESS) {
+ LOG_ER("initialize_for_assignment FAILED %u",
(unsigned) rc);
+ saErr = SA_AIS_ERR_FAILED_OPERATION;
+ saAmfResponse(cb->amf_hdl, invocation, saErr);
+ ncshm_give_hdl(cb->cpd_hdl);
+ m_CPSV_DBG_SINK(NCSCC_RC_FAILURE,
+ "cpd_saf_csi_set_cb: Initialization
failed");
+ return;
+ }
if ((cb->ha_state == SA_AMF_HA_STANDBY) && (haState ==
SA_AMF_HA_ACTIVE)) {
if (cb->cold_or_warm_sync_on == true) {
@@ -163,11 +173,7 @@ void cpd_saf_csi_set_cb(SaInvocationT in
/* If this is the active server, become implementer
again. */
/* If this is the active Director, become implementer */
- saErr = immutil_saImmOiImplementerSet(cb->immOiHandle,
implementer_name);
- if (saErr != SA_AIS_OK){
- LOG_ER("cpd immOiImplmenterSet failed with err
= %u",saErr);
- exit(EXIT_FAILURE);
- }
+ cpd_imm_declare_implementer(&cb->immOiHandle,
&cb->imm_sel_obj);
/* anchor = cb->cpd_anc; */
} else if (SA_AMF_HA_QUIESCED == haState) {
mds_role = V_DEST_RL_QUIESCED;
diff --git a/osaf/services/saf/cpsv/cpd/cpd_db.c
b/osaf/services/saf/cpsv/cpd/cpd_db.c
--- a/osaf/services/saf/cpsv/cpd/cpd_db.c
+++ b/osaf/services/saf/cpsv/cpd/cpd_db.c
@@ -922,6 +922,11 @@ uint32_t cpd_cb_db_init(CPD_CB *cb)
TRACE_ENTER();
cb->nxt_ckpt_id = 1;
+ cb->mbcsv_sel_obj = -1;
+ cb->ha_state = SA_AMF_HA_QUIESCED;
+ cb->imm_sel_obj = -1;
+ cb->clm_sel_obj = -1;
+ cb->fully_initialized = false;
rc = cpd_ckpt_tree_init(cb);
if (rc != NCSCC_RC_SUCCESS) {
diff --git a/osaf/services/saf/cpsv/cpd/cpd_imm.c
b/osaf/services/saf/cpsv/cpd/cpd_imm.c
--- a/osaf/services/saf/cpsv/cpd/cpd_imm.c
+++ b/osaf/services/saf/cpsv/cpd/cpd_imm.c
@@ -465,13 +465,14 @@ SaAisErrorT create_runtime_ckpt_object(C
*
* Notes : None.
*****************************************************************************/
-SaAisErrorT cpd_imm_init(CPD_CB *cb)
+SaAisErrorT cpd_imm_init(SaImmOiHandleT* immOiHandle, SaSelectionObjectT*
imm_sel_obj)
{
SaAisErrorT rc;
immutilWrapperProfile.errorsAreFatal = 0;
- rc = immutil_saImmOiInitialize_2(&cb->immOiHandle, &oi_cbks,
&imm_version);
+
+ rc = immutil_saImmOiInitialize_2(immOiHandle, &oi_cbks, &imm_version);
if (rc == SA_AIS_OK) {
- rc = immutil_saImmOiSelectionObjectGet(cb->immOiHandle,
&cb->imm_sel_obj);
+ rc = immutil_saImmOiSelectionObjectGet(*immOiHandle,
imm_sel_obj);
}
return rc;
}
@@ -487,25 +488,46 @@ SaAisErrorT cpd_imm_init(CPD_CB *cb)
*
* Notes : None.
*****************************************************************************/
-static void *_cpd_imm_declare_implementer(void *cb)
+void cpd_imm_declare_implementer(SaImmOiHandleT* immOiHandle,
SaSelectionObjectT* imm_sel_obj)
{
SaAisErrorT error = SA_AIS_OK;
- CPD_CB *cpd_cb = (CPD_CB *)cb;
TRACE_ENTER();
- error = saImmOiImplementerSet(cpd_cb->immOiHandle, implementer_name);
- unsigned int nTries = 1;
- while (error == SA_AIS_ERR_TRY_AGAIN && nTries < 25) {
- usleep(400 * 1000);
- error = saImmOiImplementerSet(cpd_cb->immOiHandle,
implementer_name);
- nTries++;
- }
- if (error != SA_AIS_OK) {
- LOG_ER("saImmOiImplementerSet FAILED, rc = %u", error);
- exit(EXIT_FAILURE);
+ static const unsigned sleep_delay_ms = 400;
+ static const unsigned max_waiting_time_ms = 60 * 1000;
+ unsigned msecs_waited = 0;
+ for (;;) {
+ if (msecs_waited >= max_waiting_time_ms) {
+ LOG_ER("Timeout in cpd_imm_declare_implementer");
+ exit(EXIT_FAILURE);
+ }
+
+ error = saImmOiImplementerSet(*immOiHandle, implementer_name);
+ while (error == SA_AIS_ERR_TRY_AGAIN && msecs_waited <
max_waiting_time_ms) {
+ usleep(sleep_delay_ms * 1000);
+ msecs_waited += sleep_delay_ms;
+ error = saImmOiImplementerSet(*immOiHandle,
implementer_name);
+ }
+ if (error == SA_AIS_ERR_TIMEOUT || error ==
SA_AIS_ERR_BAD_HANDLE) {
+ LOG_WA("saImmOiImplementerSet returned %u", (unsigned)
error);
+ usleep(sleep_delay_ms * 1000);
+ msecs_waited += sleep_delay_ms;
+ saImmOiFinalize(*immOiHandle);
+ *immOiHandle = 0;
+ *imm_sel_obj = -1;
+ if ((error = cpd_imm_init(immOiHandle, imm_sel_obj)) !=
SA_AIS_OK) {
+ LOG_ER("cpd_imm_init FAILED, rc = %u",
(unsigned) error);
+ exit(EXIT_FAILURE);
+ }
+ continue;
+ }
+ if (error != SA_AIS_OK) {
+ LOG_ER("saImmOiImplementerSet FAILED, rc = %u",
(unsigned) error);
+ exit(EXIT_FAILURE);
+ }
+ break;
}
TRACE_LEAVE();
- return NULL;
}
@@ -662,13 +684,17 @@ static void *cpd_imm_reinit_thread(void
{
SaAisErrorT error = SA_AIS_OK;
CPD_CB *cb = (CPD_CB *)_cb;
+ SaImmOiHandleT immOiHandle;
+ SaSelectionObjectT imm_sel_obj;
TRACE_ENTER();
/* Reinitiate IMM */
- error = cpd_imm_init(cb);
+ error = cpd_imm_init(&immOiHandle, &imm_sel_obj);
if (error == SA_AIS_OK) {
/* If this is the active server, become implementer again. */
if (cb->ha_state == SA_AMF_HA_ACTIVE)
- _cpd_imm_declare_implementer(cb);
+ cpd_imm_declare_implementer(&immOiHandle, &imm_sel_obj);
+ cb->imm_sel_obj = imm_sel_obj;
+ cb->immOiHandle = immOiHandle;
}
else
{
diff --git a/osaf/services/saf/cpsv/cpd/cpd_init.c
b/osaf/services/saf/cpsv/cpd/cpd_init.c
--- a/osaf/services/saf/cpsv/cpd/cpd_init.c
+++ b/osaf/services/saf/cpsv/cpd/cpd_init.c
@@ -28,6 +28,7 @@
******************************************************************************/
#include <poll.h>
+#include <stdlib.h>
#include <daemon.h>
#include "cpd.h"
@@ -170,10 +171,6 @@ static uint32_t cpd_lib_init(CPD_CREATE_
SaAisErrorT amf_error;
SaAmfHealthcheckKeyT healthy;
int8_t *health_key;
- SaVersionT clm_version;
-
- m_CPSV_GET_AMF_VER(clm_version);
- SaClmCallbacksT cpd_clm_cbk;
/* allocate a CB */
cb = m_MMGR_ALLOC_CPD_CB;
@@ -215,11 +212,6 @@ static uint32_t cpd_lib_init(CPD_CREATE_
goto cpd_ipc_att_fail;
}
- if ((rc = cpd_mds_register(cb)) != NCSCC_RC_SUCCESS) {
- LOG_ER("cpd mds register failed");
- goto cpd_mds_fail;
- }
-
/* Initialise with the AMF service */
if (cpd_amf_init(cb) != NCSCC_RC_SUCCESS) {
LOG_ER("cpd amf init failed");
@@ -234,26 +226,6 @@ static uint32_t cpd_lib_init(CPD_CREATE_
goto amf_reg_err;
}
- /* Initialise with the MBCSV service */
- if (cpd_mbcsv_register(cb) != NCSCC_RC_SUCCESS) {
- LOG_ER("cpd mbcsv register failed");
- goto mbcsv_reg_err;
- }
-
- cpd_clm_cbk.saClmClusterNodeGetCallback = NULL;
- cpd_clm_cbk.saClmClusterTrackCallback = cpd_clm_cluster_track_cb;
-
- if (saClmInitialize(&cb->clm_hdl, &cpd_clm_cbk, &clm_version) !=
SA_AIS_OK) {
- LOG_ER("cpd clm Initialize failed");
- goto cpd_clm_fail;
- }
-
- if (cpd_imm_init(cb) != SA_AIS_OK) {
- LOG_ER("cpd imm initialize failed ");
- goto cpd_imm_fail;
- }
-
-
/* Register with CLM */
memset(&healthy, 0, sizeof(healthy));
@@ -277,27 +249,23 @@ static uint32_t cpd_lib_init(CPD_CREATE_
if (amf_error != SA_AIS_OK) {
LOG_ER("cpd health check start failed");
}
+
+ if ((rc = initialize_for_assignment(cb, cb->ha_state)) !=
+ NCSCC_RC_SUCCESS) {
+ LOG_ER("initialize_for_assignment FAILED %u", (unsigned) rc);
+ exit(EXIT_FAILURE);
+ }
+
TRACE_LEAVE();
return NCSCC_RC_SUCCESS;
- cpd_imm_fail:
cpd_mab_fail:
- cpd_mds_unregister(cb);
- cpd_clm_fail:
- saClmFinalize(cb->clm_hdl);
-
- cpd_mbcsv_finalize(cb);
-
- mbcsv_reg_err:
cpd_amf_deregister(cb);
amf_reg_err:
cpd_amf_de_init(cb);
amf_init_err:
- cpd_mds_unregister(cb);
-
- cpd_mds_fail:
m_NCS_IPC_DETACH(&cb->cpd_mbx, cpd_clear_mbx, cb);
cpd_ipc_att_fail:
@@ -319,6 +287,71 @@ static uint32_t cpd_lib_init(CPD_CREATE_
return (rc);
}
+uint32_t initialize_for_assignment(CPD_CB *cb, SaAmfHAStateT ha_state)
+{
+ TRACE_ENTER2("ha_state = %d", (int) ha_state);
+ SaVersionT clm_version;
+ m_CPSV_GET_AMF_VER(clm_version);
+ SaClmCallbacksT cpd_clm_cbk;
+ uint32_t rc = NCSCC_RC_SUCCESS;
+ SaAisErrorT error;
+ if (cb->fully_initialized || ha_state == SA_AMF_HA_QUIESCED) {
+ goto done;
+ }
+ cb->ha_state = ha_state;
+ if ((rc = cpd_mds_register(cb)) != NCSCC_RC_SUCCESS) {
+ LOG_ER("cpd mds register failed");
+ goto cpd_mds_fail;
+ }
+ /* Initialise with the MBCSV service */
+ if ((rc = cpd_mbcsv_register(cb)) != NCSCC_RC_SUCCESS) {
+ LOG_ER("cpd mbcsv register failed");
+ goto mbcsv_reg_err;
+ }
+
+ cpd_clm_cbk.saClmClusterNodeGetCallback = NULL;
+ cpd_clm_cbk.saClmClusterTrackCallback = cpd_clm_cluster_track_cb;
+
+ if (saClmInitialize(&cb->clm_hdl, &cpd_clm_cbk, &clm_version) !=
SA_AIS_OK) {
+ LOG_ER("cpd clm Initialize failed");
+ rc = NCSCC_RC_FAILURE;
+ goto cpd_clm_fail;
+ }
+
+ error = saClmSelectionObjectGet(cb->clm_hdl, &cb->clm_sel_obj);
+ if (error != SA_AIS_OK) {
+ LOG_ER("cpd clm selectionobjget failed %u",error);
+ rc = NCSCC_RC_FAILURE;
+ goto cpd_imm_fail;
+ }
+
+ error = saClmClusterTrack(cb->clm_hdl, SA_TRACK_CHANGES_ONLY, NULL);
+ if (error != SA_AIS_OK) {
+ LOG_ER("cpd clm cluster track failed %u",error);
+ rc = NCSCC_RC_FAILURE;
+ goto cpd_imm_fail;
+ }
+
+ if (cpd_imm_init(&cb->immOiHandle, &cb->imm_sel_obj) != SA_AIS_OK) {
+ LOG_ER("cpd imm initialize failed ");
+ rc = NCSCC_RC_FAILURE;
+ goto cpd_imm_fail;
+ }
+ cb->fully_initialized = true;
+done:
+ TRACE_LEAVE();
+ return rc;
+cpd_imm_fail:
+ saClmFinalize(cb->clm_hdl);
+cpd_clm_fail:
+ cpd_mbcsv_finalize(cb);
+mbcsv_reg_err:
+ cpd_mds_unregister(cb);
+cpd_mds_fail:
+ TRACE_LEAVE2("rc = %u", rc);
+ return rc;
+}
+
/****************************************************************************
* Name : cpd_lib_destroy
*
@@ -427,7 +460,7 @@ void cpd_main_process(CPD_CB *cb)
NCS_SEL_OBJ mbx_fd;
SYSF_MBX mbx = cb->cpd_mbx;
NCS_MBCSV_ARG mbcsv_arg;
- SaSelectionObjectT amf_sel_obj, clm_sel_obj;
+ SaSelectionObjectT amf_sel_obj;
SaAisErrorT error = SA_AIS_OK;
int term_fd;
@@ -437,36 +470,24 @@ void cpd_main_process(CPD_CB *cb)
LOG_ER("cpd amf selectionobjget failed %u",error);
return;
}
- error = saClmSelectionObjectGet(cb->clm_hdl, &clm_sel_obj);
- if (error != SA_AIS_OK) {
- LOG_ER("cpd clm selectionobjget failed %u",error);
- return;
- }
daemon_sigterm_install(&term_fd);
-
- error = saClmClusterTrack(cb->clm_hdl, SA_TRACK_CHANGES_ONLY, NULL);
- if (error != SA_AIS_OK) {
- LOG_ER("cpd clm cluster track failed %u",error);
- return;
- }
-
/* Set up all file descriptors to listen to */
fds[FD_TERM].fd = term_fd;
fds[FD_TERM].events = POLLIN;
fds[FD_AMF].fd = amf_sel_obj;
fds[FD_AMF].events = POLLIN;
- fds[FD_CLM].fd = clm_sel_obj;
- fds[FD_CLM].events = POLLIN;
- fds[FD_MBCSV].fd = cb->mbcsv_sel_obj;
- fds[FD_MBCSV].events = POLLIN;
fds[FD_MBX].fd = mbx_fd.rmv_obj;
fds[FD_MBX].events = POLLIN;
fds[FD_IMM].fd = cb->imm_sel_obj;
fds[FD_IMM].events = POLLIN;
while (1) {
+ fds[FD_CLM].fd = cb->clm_sel_obj;
+ fds[FD_CLM].events = POLLIN;
+ fds[FD_MBCSV].fd = cb->mbcsv_sel_obj;
+ fds[FD_MBCSV].events = POLLIN;
if (cb->immOiHandle != 0) {
fds[FD_IMM].fd = cb->imm_sel_obj;
@@ -552,6 +573,7 @@ void cpd_main_process(CPD_CB *cb)
*/
saImmOiFinalize(cb->immOiHandle);
cb->immOiHandle = 0;
+ cb->imm_sel_obj = -1;
cpd_imm_reinit_bg(cb);
} else if (error != SA_AIS_OK) {
------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel