Yes, I got BAD_HANDLE during testing. IMM can return BAD_HANDLE at any time, and I have created a generic ticket [#1607] for introducing proper handling of AIS error codes.
regards, Anders Widell On 03/31/2016 03:06 PM, Mathivanan Naickan Palanivelu wrote: > 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