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); } /** ------------------------------------------------------------------------------ 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 Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel