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

Reply via email to