There's a check for BAD_HANDLE error code for implementerSet(), Do you foresee a new flow where this API can receive a BAD_HANDLE error code? Other than that Ack for this patch 1.
Mathi. >-----Original Message----- >From: Anders Widell [mailto:anders.wid...@ericsson.com] >Sent: Monday, February 29, 2016 8:39 PM >To: Mathivanan Naickan Palanivelu >Cc: opensaf-devel@lists.sourceforge.net >Subject: [PATCH 1 of 2] clm: Support AMF configurations containing more than >two OpenSAF 2N SUs [#79] > > osaf/services/saf/clmsv/clms/clms.h | 4 + > osaf/services/saf/clmsv/clms/clms_amf.c | 37 ++-- > osaf/services/saf/clmsv/clms/clms_cb.h | 2 +- > osaf/services/saf/clmsv/clms/clms_evt.c | 20 ++- > osaf/services/saf/clmsv/clms/clms_imm.c | 208 >++++++++++++++++++++++++----- > osaf/services/saf/clmsv/clms/clms_main.c | 120 +++++++++------- > osaf/services/saf/clmsv/clms/clms_mbcsv.c | 8 +- > osaf/services/saf/clmsv/clms/clms_mbcsv.h | 7 +- > osaf/services/saf/clmsv/clms/clms_ntf.c | 18 +- > osaf/services/saf/clmsv/clms/clms_util.c | 20 ++- > 10 files changed, 322 insertions(+), 122 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/services/saf/clmsv/clms/clms.h >b/osaf/services/saf/clmsv/clms/clms.h >--- a/osaf/services/saf/clmsv/clms/clms.h >+++ b/osaf/services/saf/clmsv/clms/clms.h >@@ -31,6 +31,8 @@ > #include <string.h> > #include <signal.h> > #include <time.h> >+#include <stdint.h> >+#include "saAmf.h" > > #include <ncsgl_defs.h> > #include <ncs_lib.h> >@@ -85,6 +87,7 @@ extern CLMS_CB *clms_cb; extern >CLMS_CLUSTER_INFO *osaf_cluster; extern const SaNameT >*clmSvcUsrName; > >+extern uint32_t initialize_for_assignment(CLMS_CB *cb, SaAmfHAStateT >+ha_state); > extern uint32_t clms_amf_init(CLMS_CB *); extern uint32_t >clms_mds_init(CLMS_CB * cb); extern uint32_t clms_cb_init(CLMS_CB * >clms_cb); @@ -111,6 +114,7 @@ extern SaAisErrorT clms_plm_init(CLMS_CB >#endif extern void clms_node_add_to_model(CLMS_CLUSTER_NODE * >node); extern SaTimeT clms_get_SaTime(void); >+extern SaTimeT clms_get_BootTime(void); > extern void clms_imm_impl_set(CLMS_CB * cb); extern uint32_t >clms_rda_init(CLMS_CB * cb); extern void clms_adminop_pending(void); diff >--git a/osaf/services/saf/clmsv/clms/clms_amf.c >b/osaf/services/saf/clmsv/clms/clms_amf.c >--- a/osaf/services/saf/clmsv/clms/clms_amf.c >+++ b/osaf/services/saf/clmsv/clms/clms_amf.c >@@ -188,7 +188,8 @@ static void clms_amf_health_chk_callback > * Notes : None. > >*********************************************************** >******************/ > static void clms_amf_csi_set_callback(SaInvocationT invocation, >- const SaNameT *compName, >SaAmfHAStateT haState, SaAmfCSIDescriptorT csiDescriptor) >+ const SaNameT *compName, SaAmfHAStateT new_haState, >+ SaAmfCSIDescriptorT csiDescriptor) > { > SaAisErrorT error = SA_AIS_OK; > SaAmfHAStateT prev_haState; >@@ -202,8 +203,15 @@ static void clms_amf_csi_set_callback(Sa > */ > prev_haState = clms_cb->ha_state; > >+ if ((rc = initialize_for_assignment(clms_cb, new_haState)) != >+ NCSCC_RC_SUCCESS) { >+ LOG_ER("initialize_for_assignment FAILED %u", (unsigned) >rc); >+ error = SA_AIS_ERR_FAILED_OPERATION; >+ goto response; >+ } >+ > /* Invoke the appropriate state handler routine */ >- switch (haState) { >+ switch (new_haState) { > case SA_AMF_HA_ACTIVE: > error = amf_active_state_handler(clms_cb, invocation); > break; >@@ -219,7 +227,7 @@ static void clms_amf_csi_set_callback(Sa > error = amf_quiescing_state_handler(clms_cb, invocation); > break; > default: >- LOG_WA("invalid state: %d ", haState); >+ LOG_WA("invalid state: %d ", new_haState); > error = SA_AIS_ERR_FAILED_OPERATION; > break; > } >@@ -227,44 +235,39 @@ static void clms_amf_csi_set_callback(Sa > if (error != SA_AIS_OK) > goto response; > >- if (haState == SA_AMF_HA_QUIESCED) { >+ if (new_haState == SA_AMF_HA_QUIESCED) { > /* AMF response will be done later when MDS quiesced ack >has been received */ > goto done; > } > > /* Update control block */ >- clms_cb->ha_state = haState; >+ clms_cb->ha_state = new_haState; > >- if (clms_cb->csi_assigned == false) { >- clms_cb->csi_assigned = true; >- /* We shall open checkpoint only once in our life time. >currently doing at lib init */ >- } else if ((haState == SA_AMF_HA_ACTIVE) || (haState == >SA_AMF_HA_STANDBY)) { /* It is a switch over */ >+ if (new_haState == SA_AMF_HA_ACTIVE || new_haState == >+SA_AMF_HA_STANDBY) { > clms_cb->ckpt_state = COLD_SYNC_IDLE; >- /* NOTE: This behaviour has to be checked later, when scxb >redundancy is available >- * Also, change role of mds, mbcsv during quiesced has to be >done after mds >- * supports the same. TBD >- */ > } > > /* Handle active to active role change. */ >- if ((prev_haState == SA_AMF_HA_ACTIVE) && (haState == >SA_AMF_HA_ACTIVE)) >+ if ((prev_haState == SA_AMF_HA_ACTIVE) && (new_haState == >+SA_AMF_HA_ACTIVE)) > role_change = false; > > /* Handle Stby to Stby role change. */ >- if ((prev_haState == SA_AMF_HA_STANDBY) && (haState == >SA_AMF_HA_STANDBY)) >+ if ((prev_haState == SA_AMF_HA_STANDBY) && (new_haState == >+SA_AMF_HA_STANDBY)) > role_change = false; > > if (role_change == true) { > /* i.e Set up the infrastructure first. > * i.e. Declare yourself as ACTIVE first. > */ >- if ((rc = clms_mds_change_role(clms_cb)) != >NCSCC_RC_SUCCESS) { >+ if ((rc = clms_mds_change_role(clms_cb)) != >+ NCSCC_RC_SUCCESS) { > LOG_ER("clms_mds_change_role FAILED"); > error = SA_AIS_ERR_FAILED_OPERATION; > } > > /* Inform MBCSV of HA state change */ >- if (NCSCC_RC_SUCCESS != (error = >clms_mbcsv_change_HA_state(clms_cb))) >+ if (NCSCC_RC_SUCCESS != (error = >clms_mbcsv_change_HA_state( >+ clms_cb, new_haState))) > error = SA_AIS_ERR_FAILED_OPERATION; > > if(clms_cb->ha_state == SA_AMF_HA_ACTIVE) { diff --git >a/osaf/services/saf/clmsv/clms/clms_cb.h >b/osaf/services/saf/clmsv/clms/clms_cb.h >--- a/osaf/services/saf/clmsv/clms/clms_cb.h >+++ b/osaf/services/saf/clmsv/clms/clms_cb.h >@@ -178,7 +178,7 @@ typedef struct clms_cb_t { > SaSelectionObjectT amf_sel_obj; /* AMF provided selection >object */ > NCS_SEL_OBJ sighdlr_sel_obj; /* Selection object to handle SIGUSR1 >*/ > SaAmfHAStateT ha_state; /* My current AMF HA state */ >- bool csi_assigned; >+ bool fully_initialized; > NCS_MBCSV_HDL mbcsv_hdl; > SaSelectionObjectT mbcsv_sel_obj; /* MBCSv Selection Object to >maintain a HotStandBy CLMS */ > NCS_MBCSV_CKPT_HDL mbcsv_ckpt_hdl; >diff --git a/osaf/services/saf/clmsv/clms/clms_evt.c >b/osaf/services/saf/clmsv/clms/clms_evt.c >--- a/osaf/services/saf/clmsv/clms/clms_evt.c >+++ b/osaf/services/saf/clmsv/clms/clms_evt.c >@@ -753,11 +753,17 @@ static uint32_t proc_rda_evt(CLMSV_CLMS_ > SaAmfHAStateT prev_haState; > bool role_change = true; > >- TRACE_ENTER2("%u", evt->info.rda_info.io_role); >+ TRACE_ENTER2("%d", (int) evt->info.rda_info.io_role); >+ prev_haState = clms_cb->ha_state; >+ if ((rc = initialize_for_assignment(clms_cb, >+ (SaAmfHAStateT) evt->info.rda_info.io_role)) >+ != NCSCC_RC_SUCCESS) { >+ LOG_ER("initialize_for_assignment FAILED %u", (unsigned) >rc); >+ exit(EXIT_FAILURE); >+ } > >- prev_haState = clms_cb->ha_state; >- >- if (evt->info.rda_info.io_role == PCS_RDA_ACTIVE) { >+ if (evt->info.rda_info.io_role == PCS_RDA_ACTIVE && >+ clms_cb->ha_state != SA_AMF_HA_ACTIVE) { > LOG_NO("ACTIVE request"); > clms_cb->mds_role = V_DEST_RL_ACTIVE; > clms_cb->ha_state = SA_AMF_HA_ACTIVE; @@ -780,7 +786,8 >@@ static uint32_t proc_rda_evt(CLMSV_CLMS_ > goto done; > } > >- if (NCSCC_RC_SUCCESS != >clms_mbcsv_change_HA_state(clms_cb)) >+ if (NCSCC_RC_SUCCESS != >clms_mbcsv_change_HA_state( >+ clms_cb, clms_cb->ha_state)) > goto done; > > /* fail over, become implementer */ >@@ -1001,7 +1008,8 @@ static uint32_t proc_mds_quiesced_ack_ms > (void)immutil_saImmOiImplementerClear(clms_cb- >>immOiHandle); > clms_cb->ha_state = SA_AMF_HA_QUIESCED; > /* Inform MBCSV of HA state change */ >- if (clms_mbcsv_change_HA_state(clms_cb) != >NCSCC_RC_SUCCESS) >+ if (clms_mbcsv_change_HA_state(clms_cb, clms_cb- >>ha_state) != >+ NCSCC_RC_SUCCESS) > TRACE("clms_mbcsv_change_HA_state FAILED"); > > /* Update control block */ >diff --git a/osaf/services/saf/clmsv/clms/clms_imm.c >b/osaf/services/saf/clmsv/clms/clms_imm.c >--- a/osaf/services/saf/clmsv/clms/clms_imm.c >+++ b/osaf/services/saf/clmsv/clms/clms_imm.c >@@ -410,23 +410,92 @@ SaAisErrorT clms_imm_activate(CLMS_CB *c > } > > if (clms_cb->ha_state == SA_AMF_HA_ACTIVE) { >- if ((rc = immutil_saImmOiImplementerSet(cb->immOiHandle, >IMPLEMENTER_NAME)) != SA_AIS_OK) { >- LOG_ER("saImmOiImplementerSet failed rc:%u", rc); >- goto done; >+ int msecs_waited = 0; >+ for (;;) { >+ if (msecs_waited >= max_waiting_time_ms) { >+ LOG_ER("Timeout in clms_imm_activate"); >+ goto done; >+ } >+ >+ rc = immutil_saImmOiImplementerSet(cb- >>immOiHandle, >+ >IMPLEMENTER_NAME); >+ if (rc == SA_AIS_ERR_TIMEOUT || >+ rc == SA_AIS_ERR_BAD_HANDLE) { >+ LOG_WA("saImmOiImplementerSet returned >%u", >+ (unsigned) rc); >+ usleep(sleep_delay_ms * 1000); >+ msecs_waited += sleep_delay_ms; >+ saImmOiFinalize(cb->immOiHandle); >+ cb->immOiHandle = 0; >+ cb->imm_sel_obj = -1; >+ cb->is_impl_set = false; >+ if ((rc = clms_imm_init(clms_cb)) != >+ NCSCC_RC_SUCCESS) { >+ LOG_ER("clms_imm_init FAILED"); >+ goto done; >+ } >+ continue; >+ } >+ if (rc != SA_AIS_OK) { >+ LOG_ER("saImmOiImplementerSet failed rc: >%u", >+ (unsigned) rc); >+ goto done; >+ } >+ >+ rc = immutil_saImmOiClassImplementerSet(cb- >>immOiHandle, >+ "SaClmNode"); >+ if (rc == SA_AIS_ERR_TIMEOUT || >+ rc == SA_AIS_ERR_BAD_HANDLE) { >+ LOG_WA("saImmOiClassImplementerSet >returned %u", >+ (unsigned) rc); >+ usleep(sleep_delay_ms * 1000); >+ msecs_waited += sleep_delay_ms; >+ saImmOiFinalize(cb->immOiHandle); >+ cb->immOiHandle = 0; >+ cb->imm_sel_obj = -1; >+ cb->is_impl_set = false; >+ if ((rc = clms_imm_init(clms_cb)) != >+ NCSCC_RC_SUCCESS) { >+ LOG_ER("clms_imm_init FAILED"); >+ goto done; >+ } >+ continue; >+ } >+ if (rc != SA_AIS_OK) { >+ LOG_ER("saImmOiClassImplementerSet failed >for " >+ "class SaClmNode rc: %u", (unsigned) rc); >+ goto done; >+ } >+ >+ rc = immutil_saImmOiClassImplementerSet(cb- >>immOiHandle, >+ > "SaClmCluster"); >+ if (rc == SA_AIS_ERR_TIMEOUT || >+ rc == SA_AIS_ERR_BAD_HANDLE) { >+ LOG_WA("saImmOiClassImplementerSet >returned %u", >+ (unsigned) rc); >+ usleep(sleep_delay_ms * 1000); >+ msecs_waited += sleep_delay_ms; >+ saImmOiFinalize(cb->immOiHandle); >+ cb->immOiHandle = 0; >+ cb->imm_sel_obj = -1; >+ cb->is_impl_set = false; >+ if ((rc = clms_imm_init(clms_cb)) != >+ NCSCC_RC_SUCCESS) { >+ LOG_ER("clms_imm_init FAILED"); >+ goto done; >+ } >+ continue; >+ } >+ if (rc != SA_AIS_OK) { >+ LOG_ER("saImmOiClassImplementerSet failed >for " >+ "class SaClmNode rc %u", (unsigned) rc); >+ goto done; >+ } >+ >+ cb->is_impl_set = true; >+ clms_all_node_rattr_update(); >+ break; > } >- >- if ((rc = immutil_saImmOiClassImplementerSet(cb- >>immOiHandle, "SaClmNode")) != SA_AIS_OK) { >- LOG_ER("saImmOiClassImplementerSet failed for >class SaClmNode rc:%u", rc); >- goto done; >- } >- >- if ((rc = immutil_saImmOiClassImplementerSet(cb- >>immOiHandle, "SaClmCluster")) != SA_AIS_OK) { >- LOG_ER("saImmOiClassImplementerSet failed for >class SaClmCluster rc:%u", rc); >- goto done; >- } >- >- cb->is_impl_set = true; >- clms_all_node_rattr_update(); > } > > rc = SA_AIS_OK; >@@ -499,6 +568,7 @@ void clms_admin_state_update_rattr(CLMS_ > > saImmOiFinalize(clms_cb->immOiHandle); > clms_cb->immOiHandle = 0; >+ clms_cb->imm_sel_obj = -1; > clms_cb->is_impl_set = false; > > /* Initiate IMM reinitializtion in the background */ @@ -590,6 >+660,7 @@ void clms_node_update_rattr(CLMS_CLUSTER > > saImmOiFinalize(clms_cb->immOiHandle); > clms_cb->immOiHandle = 0; >+ clms_cb->imm_sel_obj = -1; > clms_cb->is_impl_set = false; > > /* Initiate IMM reinitializtion in the background */ @@ -766,6 >+837,7 @@ void clms_cluster_update_rattr(CLMS_CLUS > > saImmOiFinalize(clms_cb->immOiHandle); > clms_cb->immOiHandle = 0; >+ clms_cb->imm_sel_obj = -1; > clms_cb->is_impl_set = false; > > /* Initiate IMM reinitializtion in the background */ @@ - >2295,33 +2367,99 @@ static void *clm_imm_reinit_thread(void > CLMS_CB *cb = (CLMS_CB *)_cb; > > TRACE_ENTER(); >- if ((ais_rc = immutil_saImmOiInitialize_2(&cb->immOiHandle, >&callbacks, &immVersion)) != SA_AIS_OK) { >- LOG_ER("saImmOiInitialize_2 failed %u, exiting", ais_rc); >- exit(EXIT_FAILURE); >- } >- >- if ((ais_rc = immutil_saImmOiSelectionObjectGet(cb->immOiHandle, >&cb->imm_sel_obj)) != SA_AIS_OK) { >- LOG_ER("saImmOiSelectionObjectGet failed %u, exiting", >ais_rc); >- exit(EXIT_FAILURE); >- } >- >- if (cb->ha_state == SA_AMF_HA_ACTIVE){ >- /* Update IMM */ >- if ((ais_rc = immutil_saImmOiImplementerSet(cb- >>immOiHandle, IMPLEMENTER_NAME)) != SA_AIS_OK) { >- LOG_ER("saImmOiImplementerSet failed rc:%u, >exiting", ais_rc); >+ int msecs_waited = 0; >+ for (;;) { >+ if (msecs_waited >= max_waiting_time_ms) { >+ LOG_ER("Timeout in clm_imm_reinit_thread, >exiting"); > exit(EXIT_FAILURE); > } > >- if ((ais_rc = immutil_saImmOiClassImplementerSet(cb- >>immOiHandle, "SaClmNode")) != SA_AIS_OK) { >- LOG_ER("saImmOiClassImplementerSet failed for >class SaClmNode rc:%u, exiting", ais_rc); >+ if ((ais_rc = immutil_saImmOiInitialize_2(&cb->immOiHandle, >+ &callbacks, >+ &immVersion)) != >+ SA_AIS_OK) { >+ LOG_ER("saImmOiInitialize_2 failed %u, exiting", >+ ais_rc); > exit(EXIT_FAILURE); > } > >- if ((ais_rc = immutil_saImmOiClassImplementerSet(cb- >>immOiHandle, "SaClmCluster")) != SA_AIS_OK) { >- LOG_ER("saImmOiClassImplementerSet failed for >class SaClmCluster rc:%u, exiting", ais_rc); >+ if ((ais_rc = immutil_saImmOiSelectionObjectGet(cb- >>immOiHandle, >+ &cb-> >+ imm_sel_obj)) >!= >+ SA_AIS_OK) { >+ LOG_ER("saImmOiSelectionObjectGet failed %u, >exiting", >+ ais_rc); > exit(EXIT_FAILURE); > } >- cb->is_impl_set = true; >+ >+ if (cb->ha_state == SA_AMF_HA_ACTIVE) { >+ /* Update IMM */ >+ if ((ais_rc = >+ immutil_saImmOiImplementerSet(cb- >>immOiHandle, >+ >IMPLEMENTER_NAME)) != >+ SA_AIS_OK) { >+ if (ais_rc == SA_AIS_ERR_TIMEOUT) { >+ LOG_WA("saImmOiImplementerSet >returned " >+ "%u", (unsigned) ais_rc); >+ usleep(sleep_delay_ms * 1000); >+ msecs_waited += sleep_delay_ms; >+ saImmOiFinalize(cb->immOiHandle); >+ cb->immOiHandle = 0; >+ cb->imm_sel_obj = -1; >+ cb->is_impl_set = false; >+ continue; >+ } >+ LOG_ER("saImmOiImplementerSet failed rc: >%u, " >+ "exiting", (unsigned) ais_rc); >+ exit(EXIT_FAILURE); >+ } >+ >+ if ((ais_rc = >+ immutil_saImmOiClassImplementerSet(cb- >>immOiHandle, >+ > "SaClmNode")) != >+ SA_AIS_OK) { >+ if (ais_rc == SA_AIS_ERR_TIMEOUT) { >+ > LOG_WA("saImmOiClassImplementerSet " >+ "returned %u", >+ (unsigned) ais_rc); >+ usleep(sleep_delay_ms * 1000); >+ msecs_waited += sleep_delay_ms; >+ saImmOiFinalize(cb->immOiHandle); >+ cb->immOiHandle = 0; >+ cb->imm_sel_obj = -1; >+ cb->is_impl_set = false; >+ continue; >+ } >+ LOG_ER("saImmOiClassImplementerSet failed >for " >+ "class SaClmNode rc: %u, exiting", >+ (unsigned) ais_rc); >+ exit(EXIT_FAILURE); >+ } >+ >+ if ((ais_rc = >+ immutil_saImmOiClassImplementerSet(cb- >>immOiHandle, >+ > "SaClmCluster")) >+ != SA_AIS_OK) { >+ if (ais_rc == SA_AIS_ERR_TIMEOUT) { >+ > LOG_WA("saImmOiClassImplementerSet " >+ "returned %u", >+ (unsigned) ais_rc); >+ usleep(sleep_delay_ms * 1000); >+ msecs_waited += sleep_delay_ms; >+ saImmOiFinalize(cb->immOiHandle); >+ cb->immOiHandle = 0; >+ cb->imm_sel_obj = -1; >+ cb->is_impl_set = false; >+ continue; >+ } >+ LOG_ER("saImmOiClassImplementerSet failed >for " >+ "class SaClmCluster rc: %u, exiting", >+ (unsigned) ais_rc); >+ exit(EXIT_FAILURE); >+ } >+ cb->is_impl_set = true; >+ } >+ break; > } > > TRACE_LEAVE(); >diff --git a/osaf/services/saf/clmsv/clms/clms_main.c >b/osaf/services/saf/clmsv/clms/clms_main.c >--- a/osaf/services/saf/clmsv/clms/clms_main.c >+++ b/osaf/services/saf/clmsv/clms/clms_main.c >@@ -174,11 +174,11 @@ static uint32_t clms_self_node_info(void > if (node->admin_state == SA_CLM_ADMIN_UNLOCKED) { > node->member = SA_TRUE; > ++(osaf_cluster->num_nodes); >- node->boot_time = clms_get_SaTime(); >+ node->boot_time = clms_get_BootTime(); > #ifdef ENABLE_AIS_PLM > node->ee_red_state = SA_PLM_READINESS_IN_SERVICE; > /*TBD : changed when plm scripts are added to rc scripts */ > #endif >- osaf_cluster->init_time = node->boot_time; >+ osaf_cluster->init_time = clms_get_SaTime(); > } > rc = NCSCC_RC_SUCCESS; > done: >@@ -221,7 +221,7 @@ uint32_t clms_cb_init(CLMS_CB * clms_cb) > osaf_cluster = NULL; > clms_cb->reg_with_plm = SA_FALSE; > clms_cb->cluster_view_num = 0; >- clms_cb->csi_assigned = false; >+ clms_cb->fully_initialized = false; > clms_cb->curr_invid = 1; > clms_cb->immOiHandle = 0; > clms_cb->is_impl_set = false; >@@ -252,6 +252,12 @@ uint32_t clms_cb_init(CLMS_CB * clms_cb) > clms_cb->clm_ver.releaseCode = CLM_RELEASE_CODE; > clms_cb->clm_ver.majorVersion = CLM_MAJOR_VERSION_4; > clms_cb->clm_ver.minorVersion = CLM_MINOR_VERSION; >+ clms_cb->amf_sel_obj = -1; >+ clms_cb->sighdlr_sel_obj.raise_obj = -1; >+ clms_cb->sighdlr_sel_obj.rmv_obj = -1; >+ clms_cb->mbcsv_sel_obj = -1; >+ clms_cb->imm_sel_obj = -1; >+ clms_cb->plm_sel_obj = -1; > > /* Initialize patricia tree for reg list */ > if (NCSCC_RC_SUCCESS != ncs_patricia_tree_init(&clms_cb- >>client_db, &client_param)) @@ -326,18 +332,63 @@ static uint32_t >clms_init(void) > goto done; > } > >- /*Initialize mds */ >- if ((rc = clms_mds_init(clms_cb)) != NCSCC_RC_SUCCESS) { >+ /* Create a selection object */ >+ if (clms_cb->nid_started && >+ (rc = ncs_sel_obj_create(&usr1_sel_obj)) != >NCSCC_RC_SUCCESS) { >+ LOG_ER("ncs_sel_obj_create failed"); >+ goto done; >+ } >+ >+ /* >+ ** Initialize a signal handler that will use the selection object. >+ ** The signal is sent from our script when AMF does instantiate. >+ */ >+ if (clms_cb->nid_started && >+ signal(SIGUSR1, sigusr1_handler) == SIG_ERR) { >+ LOG_ER("signal USR1 failed: %s", strerror(errno)); >+ goto done; >+ } >+ >+ if (!clms_cb->nid_started && >+ clms_amf_init(clms_cb) != NCSCC_RC_SUCCESS) { >+ LOG_ER("AMF Initialization failed"); >+ goto done; >+ } >+ >+ if ((rc = initialize_for_assignment(clms_cb, clms_cb->ha_state)) != >+ NCSCC_RC_SUCCESS) { >+ LOG_ER("initialize_for_assignment FAILED %u", (unsigned) >rc); >+ goto done; >+ } >+ >+ rc = NCSCC_RC_SUCCESS; >+ >+ done: >+ if (clms_cb->nid_started && >+ nid_notify("CLMD", rc, NULL) != NCSCC_RC_SUCCESS) { >+ LOG_ER("nid_notify failed"); >+ rc = NCSCC_RC_FAILURE; >+ } >+ >+ TRACE_LEAVE(); >+ return rc; >+} >+ >+uint32_t initialize_for_assignment(CLMS_CB *cb, SaAmfHAStateT ha_state) >+{ >+ TRACE_ENTER2("ha_state = %d", (int) ha_state); >+ uint32_t rc = NCSCC_RC_SUCCESS; >+ if (cb->fully_initialized || ha_state == SA_AMF_HA_QUIESCED) goto >done; >+ cb->ha_state = ha_state; >+ if ((rc = clms_mds_init(cb)) != NCSCC_RC_SUCCESS) { > LOG_ER("clms_mds_init FAILED %d", rc); > goto done; > } >- >- /* Initialize with MBCSV */ >- if ((rc = clms_mbcsv_init(clms_cb)) != NCSCC_RC_SUCCESS) { >+ if ((rc = clms_mbcsv_init(cb, ha_state)) != NCSCC_RC_SUCCESS) { > LOG_ER("clms_mbcsv_init FAILED"); >+ clms_mds_finalize(cb); > goto done; > } >- > /* Initialize with IMMSv */ > if ((rc = clms_imm_init(clms_cb)) != NCSCC_RC_SUCCESS) { > LOG_ER("clms_imm_init FAILED"); >@@ -366,44 +417,14 @@ static uint32_t clms_init(void) > if ((rc = clms_self_node_info()) != NCSCC_RC_SUCCESS) > goto done; > >- /* Create a selection object */ >- if (clms_cb->nid_started && >- (rc = ncs_sel_obj_create(&usr1_sel_obj)) != >NCSCC_RC_SUCCESS) { >- LOG_ER("ncs_sel_obj_create failed"); >- goto done; >- } >- >- /* >- ** Initialize a signal handler that will use the selection object. >- ** The signal is sent from our script when AMF does instantiate. >- */ >- if (clms_cb->nid_started && >- signal(SIGUSR1, sigusr1_handler) == SIG_ERR) { >- LOG_ER("signal USR1 failed: %s", strerror(errno)); >- goto done; >- } >- >- if (!clms_cb->nid_started && >- clms_amf_init(clms_cb) != NCSCC_RC_SUCCESS) { >- LOG_ER("AMF Initialization failed"); >- goto done; >- } >- > /* Initialize with saflog. This is necessary to avoid > * getting blocked by LOG during role change (switchover/failover) > */ > saflog_init(); > >- rc = NCSCC_RC_SUCCESS; >- >- done: >- if (clms_cb->nid_started && >- nid_notify("CLMD", rc, NULL) != NCSCC_RC_SUCCESS) { >- LOG_ER("nid_notify failed"); >- rc = NCSCC_RC_FAILURE; >- } >- >- TRACE_LEAVE(); >+ cb->fully_initialized = true; >+done: >+ TRACE_LEAVE2("rc = %u", rc); > return rc; > } > >@@ -439,20 +460,16 @@ int main(int argc, char *argv[]) > fds[FD_AMF].fd = clms_cb->nid_started ? > usr1_sel_obj.rmv_obj : clms_cb->amf_sel_obj; > fds[FD_AMF].events = POLLIN; >- fds[FD_MBCSV].fd = clms_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 = clms_cb->imm_sel_obj; >- fds[FD_IMM].events = POLLIN; >- >+ while (1) { >+ fds[FD_MBCSV].fd = clms_cb->mbcsv_sel_obj; >+ fds[FD_MBCSV].events = POLLIN; > #ifdef ENABLE_AIS_PLM >- fds[FD_PLM].fd = clms_cb->plm_sel_obj; >- fds[FD_PLM].events = POLLIN; >+ fds[FD_PLM].fd = clms_cb->plm_sel_obj; >+ fds[FD_PLM].events = POLLIN; > #endif > >- while (1) { >- > if (clms_cb->rtu_pending == true) { > TRACE("There is an IMM task to be tried again. setting >poll time out to 500"); > timeout = 500; >@@ -550,6 +567,7 @@ int main(int argc, char *argv[]) > */ > saImmOiFinalize(clms_cb- >>immOiHandle); > clms_cb->immOiHandle = 0; >+ clms_cb->imm_sel_obj = -1; > clms_cb->is_impl_set = false; > > /* Initiate IMM reinitializtion in the >background */ diff --git a/osaf/services/saf/clmsv/clms/clms_mbcsv.c >b/osaf/services/saf/clmsv/clms/clms_mbcsv.c >--- a/osaf/services/saf/clmsv/clms/clms_mbcsv.c >+++ b/osaf/services/saf/clmsv/clms/clms_mbcsv.c >@@ -557,7 +557,7 @@ static uint32_t process_ckpt_data(CLMS_C > * > * Notes : None. > >*********************************************************** >******************/ >-uint32_t clms_mbcsv_init(CLMS_CB * cb) >+uint32_t clms_mbcsv_init(CLMS_CB * cb, SaAmfHAStateT ha_state) > { > uint32_t rc; > NCS_MBCSV_ARG arg; >@@ -613,7 +613,7 @@ uint32_t clms_mbcsv_init(CLMS_CB * cb) > goto done; > } > >- rc = clms_mbcsv_change_HA_state(cb); >+ rc = clms_mbcsv_change_HA_state(cb, ha_state); > > /* Set MBCSV role here itself */ > done: >@@ -636,7 +636,7 @@ uint32_t clms_mbcsv_init(CLMS_CB * cb) > * during the first CSI assignment from AVSv . > >*********************************************************** >******************/ > >-uint32_t clms_mbcsv_change_HA_state(CLMS_CB * cb) >+uint32_t clms_mbcsv_change_HA_state(CLMS_CB * cb, SaAmfHAStateT >+ha_state) > { > NCS_MBCSV_ARG mbcsv_arg; > uint32_t rc = SA_AIS_OK; >@@ -647,7 +647,7 @@ uint32_t clms_mbcsv_change_HA_state(CLMS > mbcsv_arg.i_op = NCS_MBCSV_OP_CHG_ROLE; > mbcsv_arg.i_mbcsv_hdl = cb->mbcsv_hdl; > mbcsv_arg.info.chg_role.i_ckpt_hdl = cb->mbcsv_ckpt_hdl; >- mbcsv_arg.info.chg_role.i_ha_state = cb->ha_state; >+ mbcsv_arg.info.chg_role.i_ha_state = ha_state; > > if (SA_AIS_OK != (rc = ncs_mbcsv_svc(&mbcsv_arg))) { > LOG_ER("ncs_mbcsv_svc FAILED"); >diff --git a/osaf/services/saf/clmsv/clms/clms_mbcsv.h >b/osaf/services/saf/clmsv/clms/clms_mbcsv.h >--- a/osaf/services/saf/clmsv/clms/clms_mbcsv.h >+++ b/osaf/services/saf/clmsv/clms/clms_mbcsv.h >@@ -18,6 +18,9 @@ > #ifndef CLMSV_CKPT_H > #define CLMSV_CKPT_H > >+#include <stdint.h> >+#include "saAmf.h" >+ > #define CLMS_MBCSV_VERSION 1 > #define CLMS_MBCSV_VERSION_MIN 1 > >@@ -152,12 +155,12 @@ typedef struct clms_ckpt_rec_t { } CLMS_CKPT_REC; > > typedef uint32_t (*CLMS_CKPT_HDLR) (CLMS_CB * cb, CLMS_CKPT_REC * >data); -extern uint32_t clms_mbcsv_change_HA_state(CLMS_CB * cb); >+extern uint32_t clms_mbcsv_change_HA_state(CLMS_CB * cb, >SaAmfHAStateT >+ha_state); > extern uint32_t clms_send_async_update(CLMS_CB * cb, CLMS_CKPT_REC * >ckpt_rec, uint32_t action); extern void >prepare_ckpt_node(CLMSV_CKPT_NODE * node, CLMS_CLUSTER_NODE * >cluster_node); extern void prepare_cluster_node(CLMS_CLUSTER_NODE * >node, CLMSV_CKPT_NODE * cluster_node); extern void >prepare_ckpt_config_node(CLMSV_CKPT_NODE_CONFIG_REC * node, >CLMS_CLUSTER_NODE * cluster_node); -extern uint32_t >clms_mbcsv_init(CLMS_CB * cb); >+extern uint32_t clms_mbcsv_init(CLMS_CB * cb, SaAmfHAStateT ha_state); > extern uint32_t clms_mbcsv_dispatch(NCS_MBCSV_HDL mbcsv_hdl); extern >void prepare_ckpt_to_ckpt_node(CLMSV_CKPT_NODE * node, >CLMSV_CKPT_NODE * cluster_node); extern void >prepare_ckpt_to_ckpt_config_node(CLMSV_CKPT_NODE_CONFIG_REC * >node, diff --git a/osaf/services/saf/clmsv/clms/clms_ntf.c >b/osaf/services/saf/clmsv/clms/clms_ntf.c >--- a/osaf/services/saf/clmsv/clms/clms_ntf.c >+++ b/osaf/services/saf/clmsv/clms/clms_ntf.c >@@ -16,6 +16,7 @@ > */ > > #include "clms.h" >+#include "osaf_time.h" > > #define ADDITION_TEXT_LENGTH 256 > #define CLMS_NTF_SENDER "safApp=safClmService" >@@ -270,14 +271,21 @@ void clms_node_admin_state_change_ntf(CL > > SaAisErrorT clms_ntf_init(CLMS_CB * cb) { >- >- SaAisErrorT rc = SA_AIS_OK; >- SaVersionT ntfVersion = { 'A', 0x01, 0x01 }; >+ SaAisErrorT rc = SA_AIS_ERR_TRY_AGAIN; > > TRACE_ENTER(); > >- rc = saNtfInitialize(&cb->ntf_hdl, NULL, &ntfVersion); >- TRACE("saNtfInitialize rc value %u", rc); >+ while (rc == SA_AIS_ERR_TRY_AGAIN || rc == SA_AIS_ERR_TIMEOUT) >{ >+ SaVersionT ntfVersion = { 'A', 0x01, 0x01 }; >+ rc = saNtfInitialize(&cb->ntf_hdl, NULL, &ntfVersion); >+ TRACE("saNtfInitialize rc value %u", rc); >+ if (rc == SA_AIS_ERR_TIMEOUT) { >+ LOG_WA("saNtfInitialize returned >SA_AIS_ERR_TIMEOUT"); >+ } >+ if (rc == SA_AIS_ERR_TRY_AGAIN || rc == >SA_AIS_ERR_TIMEOUT) { >+ osaf_nanosleep(&kHundredMilliseconds); >+ } >+ } > if (rc != SA_AIS_OK) { > LOG_ER("saNtfInitialize Failed (%u)", rc); > } >diff --git a/osaf/services/saf/clmsv/clms/clms_util.c >b/osaf/services/saf/clmsv/clms/clms_util.c >--- a/osaf/services/saf/clmsv/clms/clms_util.c >+++ b/osaf/services/saf/clmsv/clms/clms_util.c >@@ -16,6 +16,7 @@ > */ > > #include "clms.h" >+#include "osaf_time.h" > > static const SaNameT _clmSvcUsrName = { > .value = "safApp=safClmService", >@@ -261,7 +262,24 @@ uint32_t clms_node_delete(CLMS_CLUSTER_N */ >SaTimeT clms_get_SaTime(void) { >- return time(NULL) * SA_TIME_ONE_SECOND; >+ struct timespec realtime; >+ osaf_clock_gettime(CLOCK_REALTIME, &realtime); >+ return osaf_timespec_to_nanos(&realtime); >+} >+ >+SaTimeT clms_get_BootTime(void) >+{ >+ struct timespec monotonic; >+ struct timespec realtime; >+ struct timespec boottime; >+ osaf_clock_gettime(CLOCK_MONOTONIC, &monotonic); >+ osaf_clock_gettime(CLOCK_REALTIME, &realtime); >+ if (osaf_timespec_compare(&realtime, &monotonic) >= 0) { >+ osaf_timespec_subtract(&realtime, &monotonic, &boottime); >+ } else { >+ boottime = realtime; >+ } >+ return osaf_timespec_to_nanos(&boottime); > } > > /** ------------------------------------------------------------------------------ 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=278785471&iu=/4140 _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel