/**************************************************************************** * Name : gld_quisced_process * * Description : Instruction from the GLND to set the orphan flag * * Arguments : evt - Event structure * * Return Values : NCSCC_RC_SUCCESS/ NCSCC_RC_FAILURE * * Notes : None. *****************************************************************************/ static uint32_t gld_quisced_process(GLSV_GLD_EVT *evt) { GLSV_GLD_CB *gld_cb = evt->gld_cb; SaAisErrorT saErr = SA_AIS_OK; uint32_t rc = NCSCC_RC_SUCCESS; TRACE_ENTER(); if ((evt == GLSV_GLD_EVT_NULL) || (gld_cb == NULL)){ rc = NCSCC_RC_FAILURE; goto end; } if (gld_cb->is_quiasced) { gld_cb->ha_state = SA_AMF_HA_QUIESCED; /* Give up our IMM OI implementer role */ rc = immutil_saImmOiImplementerClear(gld_cb->immOiHandle); if (rc != SA_AIS_OK) { LOG_ER("saImmOiImplementerClear failed: err = %d", rc); } gld_cb->is_impl_set = false; rc = glsv_gld_mbcsv_chgrole(gld_cb); if (rc != NCSCC_RC_SUCCESS) { m_LEAP_DBG_SINK(NCSCC_RC_FAILURE); goto end; } saAmfResponse(gld_cb->amf_hdl, gld_cb->invocation, saErr); gld_cb->is_quiasced = false; } end: TRACE_LEAVE(); return rc; }
/**************************************************************************** * Name : amf_quiesced_state_handler * * Description : This function is called upon receving an Quiesced state * assignment from AMF. * * Arguments : invocation - Designates a particular invocation. * cb - A pointer to the LGS control block. * * Return Values : None * * Notes : None *****************************************************************************/ static SaAisErrorT amf_quiesced_state_handler(lgs_cb_t *cb, SaInvocationT invocation) { V_DEST_RL mds_role; SaAisErrorT rc = SA_AIS_OK; TRACE_ENTER2("HA AMF QUIESCED STATE request"); close_all_files(); /* Give up our IMM OI implementer role */ immutilWrapperProfile.errorsAreFatal = 0; (void)immutil_saImmOiImplementerClear(cb->immOiHandle); immutilWrapperProfile.errorsAreFatal = 1; /* ** Change the MDS VDSET role to Quiesced. Wait for MDS callback with type ** MDS_CALLBACK_QUIESCED_ACK. Then change MBCSv role. Don't change ** cb->ha_state now. */ mds_role = cb->mds_role; cb->mds_role = V_DEST_RL_QUIESCED; if ((rc = lgs_mds_change_role(cb)) != NCSCC_RC_SUCCESS) { LOG_ER("lgs_mds_change_role FAILED"); rc = SA_AIS_ERR_FAILED_OPERATION; cb->mds_role = mds_role; goto done; } cb->amf_invocation_id = invocation; cb->is_quiesced_set = true; done: return rc; }
/**************************************************************************** * Name : amf_quiescing_state_handler * * Description : This function is called upon receving an Quiescing state * assignment from AMF. * * Arguments : invocation - Designates a particular invocation. * cb - A pointer to the LGS control block. * * Return Values : None * * Notes : None *****************************************************************************/ static SaAisErrorT amf_quiescing_state_handler(lgs_cb_t *cb, SaInvocationT invocation) { TRACE_ENTER2("HA QUIESCING request"); close_all_files(); /* Give up our IMM OI implementer role */ immutilWrapperProfile.errorsAreFatal = 0; (void)immutil_saImmOiImplementerClear(cb->immOiHandle); immutilWrapperProfile.errorsAreFatal = 1; return saAmfCSIQuiescingComplete(cb->amf_hdl, invocation, SA_AIS_OK); }
uns32 amfd_switch_actv_qsd(AVD_CL_CB *cb) { AVD_AVND *avnd = NULL; AVD_AVND *avnd_other = NULL; uns32 rc = NCSCC_RC_SUCCESS; TRACE_ENTER(); LOG_NO("ROLE SWITCH Active --> Quiesced"); if (cb->init_state != AVD_APP_STATE) { LOG_ER("ROLE SWITCH Active --> Quiesced, AMFD not in APP State"); cb->swap_switch = SA_FALSE; return NCSCC_RC_FAILURE; } /* get the avnd from node_id */ if (NULL == (avnd = avd_node_find_nodeid(cb->node_id_avd))) { LOG_ER("ROLE SWITCH Active --> Quiesced, Local Node not found"); cb->swap_switch = SA_FALSE; return NCSCC_RC_FAILURE; } /* get the avnd from node_id */ if (NULL == (avnd_other = avd_node_find_nodeid(cb->node_id_avd_other))) { LOG_ER("ROLE SWITCH Active --> Quiesced, remote Node not found"); cb->swap_switch = SA_FALSE; return NCSCC_RC_FAILURE; } /* check if the other AVD is up and has standby role. verify that * the AvND on the node is in present state. */ if ((cb->node_id_avd_other == 0) || (avnd->node_state != AVD_AVND_STATE_PRESENT) || (avnd_other->node_state != AVD_AVND_STATE_PRESENT)) { LOG_NO("Peer controller not available for switch over"); cb->swap_switch = SA_FALSE; return NCSCC_RC_FAILURE; } /* Mark AVD as Quiesced. */ cb->avail_state_avd = SA_AMF_HA_QUIESCED; if (avd_clm_track_stop() != SA_AIS_OK) { LOG_ER("ClmTrack stop failed"); } /* Go ahead and set mds role as already the NCS SU has been switched */ if (NCSCC_RC_SUCCESS != (rc = avd_mds_set_vdest_role(cb, SA_AMF_HA_QUIESCED))) { LOG_ER("ROLE SWITCH Active --> Quiesced, vdest role set failed"); cb->swap_switch = SA_FALSE; return NCSCC_RC_FAILURE; } if (NCSCC_RC_SUCCESS != avd_rde_set_role(SA_AMF_HA_QUIESCED)) { LOG_ER("rde role change failed from actv -> qsd"); } /* We need to send the role to AvND. */ rc = avd_avnd_send_role_change(cb, cb->node_id_avd, cb->avail_state_avd); if (NCSCC_RC_SUCCESS != rc) { LOG_ER("%s: avd_avnd_send_role_change failed", __FUNCTION__); } else { avd_d2n_msg_dequeue(cb); } /* Give up our IMM OI implementer role */ (void)immutil_saImmOiImplementerClear(cb->immOiHandle); cb->is_implementer = FALSE; TRACE_LEAVE(); return NCSCC_RC_SUCCESS; }