Exemple #1
0
/****************************************************************************
 * 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;

}
Exemple #2
0
/****************************************************************************
 * 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;
}
Exemple #3
0
/****************************************************************************
 * 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;
}