Hi Anders Widell,
ACK from me.
As far as code cpsv changes , I see only re-organization of
MDS/MBCSV/CLM/IMM
Initialization, so limited my testing scope to only apply the patch
for just CPSV service and test legacy functionality is not broken (i.e.
run switchover, fail-over & regression/sanity tests).
-AVM
On 2/29/2016 8:10 PM, Anders Widell wrote:
> 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) {
------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785231&iu=/4140
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel