Beispiel #1
0
/****************************************************************************
 * Name          : cpd_evt_proc_mds_evt
 *
 * Description   : Function to process the Events received from MDS
 *
 * Arguments     : CPD_CB *cb - CPD CB pointer
 *                 CPSV_EVT *evt - Received Event structure
 *
 * Return Values : NCSCC_RC_SUCCESS/Error.
 *
 * Notes         : None.
 *****************************************************************************/
static uns32 cpd_evt_proc_mds_evt(CPD_CB *cb, CPD_EVT *evt)
{
	CPSV_MDS_INFO *mds_info;
	CPD_CPND_INFO_NODE *node_info = NULL;
	CPD_CKPT_INFO_NODE *ckpt_node = NULL;
	CPD_NODE_REF_INFO *nref_info;
	CPD_CKPT_REF_INFO *cref_info = NULL;
	CPD_CKPT_MAP_INFO *map_info = NULL;
	SaCkptCheckpointHandleT prev_ckpt_hdl;
	NCS_BOOL flag = FALSE;
	SaNameT ckpt_name;
	uns32 phy_slot_sub_slot;
	NCS_BOOL add_flag = TRUE;

	memset(&ckpt_name, 0, sizeof(SaNameT));
	mds_info = &evt->info.mds_info;

	memset(&phy_slot_sub_slot, 0, sizeof(uns32));

	switch (mds_info->change) {

	case NCSMDS_RED_UP:
		/* get the peer mds_red_up */
		/* get the mds_dest of remote CPND */
		if (cb->node_id != mds_info->node_id) {
			MDS_DEST tmpDest = 0LL;
			phy_slot_sub_slot = cpd_get_slot_sub_slot_id_from_node_id(mds_info->node_id);
			cb->cpd_remote_id = phy_slot_sub_slot;

			if (cb->is_rem_cpnd_up == FALSE) {
				cpd_cpnd_info_node_getnext(&cb->cpnd_tree, &tmpDest, &node_info);
				while (node_info) {	/* while-1 */
					if (mds_info->node_id == node_info->cpnd_key) {
						cb->is_rem_cpnd_up = TRUE;
						cb->rem_cpnd_dest = node_info->cpnd_dest;
						/* Break out of while-1. We found */
							if (cb->ha_state == SA_AMF_HA_ACTIVE) {
								cpd_ckpt_node_getnext(&cb->ckpt_tree, NULL, &ckpt_node);
								while (ckpt_node) {
									prev_ckpt_hdl = ckpt_node->ckpt_id;
									if (!m_IS_SA_CKPT_CHECKPOINT_COLLOCATED(&ckpt_node->attributes)) {
										nref_info = ckpt_node->node_list;
										while (nref_info) {
											if (m_CPD_IS_LOCAL_NODE
													(cb->cpd_remote_id,
													 cpd_get_slot_sub_id_from_mds_dest
													 (nref_info->dest))) {
												flag = TRUE;
											}
											nref_info = nref_info->next;
										}
										if (flag == FALSE) {
											cpd_ckpt_map_node_get(&cb->ckpt_map_tree,
													&ckpt_node->ckpt_name, &map_info);
											if (map_info) {
												cpd_noncolloc_ckpt_rep_create(cb,
														&cb->
														rem_cpnd_dest,
														ckpt_node,
														map_info);
											}
										}
									}
									cpd_ckpt_node_getnext(&cb->ckpt_tree, &prev_ckpt_hdl, &ckpt_node);
								}
							}
						break;
					}
					tmpDest = node_info->cpnd_dest;
					cpd_cpnd_info_node_getnext(&cb->cpnd_tree, &tmpDest, &node_info);
				}
			}
		} else {
			/* Don't handle RED_UP from our own node */
			break;
		}

		break;

	case NCSMDS_UP:

		if (mds_info->svc_id == NCSMDS_SVC_ID_CPD) {
			if (mds_info->change == NCSMDS_UP)
				return NCSCC_RC_SUCCESS;
		}

		if (mds_info->svc_id == NCSMDS_SVC_ID_CPND) {
			/* Save MDS address for this CPND */
			phy_slot_sub_slot = cpd_get_slot_sub_id_from_mds_dest(mds_info->dest);
			if (cb->cpd_remote_id == phy_slot_sub_slot) {
				cb->rem_cpnd_dest = mds_info->dest;
			}

			if (m_CPND_IS_ON_SCXB(cb->cpd_self_id, cpd_get_slot_sub_id_from_mds_dest(mds_info->dest))) {
				cb->is_loc_cpnd_up = TRUE;
				cb->loc_cpnd_dest = mds_info->dest;

				if (cb->ha_state == SA_AMF_HA_ACTIVE) {
					cpd_ckpt_node_getnext(&cb->ckpt_tree, NULL, &ckpt_node);
					while (ckpt_node) {
						prev_ckpt_hdl = ckpt_node->ckpt_id;
						if (!m_IS_SA_CKPT_CHECKPOINT_COLLOCATED(&ckpt_node->attributes)) {
							nref_info = ckpt_node->node_list;
							while (nref_info) {
								if (m_CPD_IS_LOCAL_NODE
								    (cb->cpd_self_id,
								     cpd_get_slot_sub_id_from_mds_dest
								     (nref_info->dest))) {
									flag = TRUE;
								}
								nref_info = nref_info->next;
							}
							if (flag == FALSE) {
								cpd_ckpt_map_node_get(&cb->ckpt_map_tree,
										      &ckpt_node->ckpt_name, &map_info);
								if (map_info) {
									cpd_noncolloc_ckpt_rep_create(cb,
												      &cb->
												      loc_cpnd_dest,
												      ckpt_node,
												      map_info);
								}
							}
						}

						cpd_ckpt_node_getnext(&cb->ckpt_tree, &prev_ckpt_hdl, &ckpt_node);
					}
				}
			}
			/* When CPND ON STANDBY COMES UP */
			if (m_CPND_IS_ON_SCXB(cb->cpd_remote_id, cpd_get_slot_sub_id_from_mds_dest(mds_info->dest))) {
				cb->is_rem_cpnd_up = TRUE;
				cb->rem_cpnd_dest = mds_info->dest;

				if (cb->ha_state == SA_AMF_HA_ACTIVE) {
					cpd_ckpt_node_getnext(&cb->ckpt_tree, NULL, &ckpt_node);
					while (ckpt_node) {
						prev_ckpt_hdl = ckpt_node->ckpt_id;
						if (!m_IS_SA_CKPT_CHECKPOINT_COLLOCATED(&ckpt_node->attributes)) {
							nref_info = ckpt_node->node_list;
							while (nref_info) {
								if (m_CPD_IS_LOCAL_NODE
								    (cb->cpd_remote_id,
								     cpd_get_slot_sub_id_from_mds_dest
								     (nref_info->dest))) {
									flag = TRUE;
								}
								nref_info = nref_info->next;
							}
							if (flag == FALSE) {
								cpd_ckpt_map_node_get(&cb->ckpt_map_tree,
										      &ckpt_node->ckpt_name, &map_info);
								if (map_info) {
									cpd_noncolloc_ckpt_rep_create(cb,
												      &cb->
												      rem_cpnd_dest,
												      ckpt_node,
												      map_info);

								}
							}
						}

						cpd_ckpt_node_getnext(&cb->ckpt_tree, &prev_ckpt_hdl, &ckpt_node);
					}
				}
			}

			if (cb->ha_state == SA_AMF_HA_ACTIVE) {
				cpd_cpnd_info_node_get(&cb->cpnd_tree, &mds_info->dest, &node_info);
				if (!node_info) {
					cpd_cpnd_info_node_find_add(&cb->cpnd_tree, &mds_info->dest, &node_info, &add_flag);
					/* No Checkpoints on this node, */
					return NCSCC_RC_SUCCESS;
				} else {
					cpnd_up_process(cb, mds_info, node_info);
				}
			}

			if (cb->ha_state == SA_AMF_HA_STANDBY) {
				cpd_cpnd_info_node_get(&cb->cpnd_tree, &mds_info->dest, &node_info);
				if (!node_info) {
					cpd_cpnd_info_node_find_add(&cb->cpnd_tree, &mds_info->dest, &node_info, &add_flag);
					/* No Checkpoints on this node, */
					return NCSCC_RC_SUCCESS;
				} else {
					node_info->cpnd_ret_timer.type = CPD_TMR_TYPE_CPND_RETENTION;
					node_info->cpnd_ret_timer.info.cpnd_dest = mds_info->dest;
					cpd_tmr_stop(&node_info->cpnd_ret_timer);
					node_info->timer_state = 1;

					cref_info = node_info->ckpt_ref_list;

					if (cref_info)
						cpd_cpnd_dest_replace(cb, cref_info, mds_info);
				}
			}
		}
		break;
	case NCSMDS_DOWN:

		if (mds_info->svc_id == NCSMDS_SVC_ID_CPD) {
			if (mds_info->change == NCSMDS_DOWN)
				return NCSCC_RC_SUCCESS;
		}

		if (mds_info->svc_id == NCSMDS_SVC_ID_CPND) {
			if (m_CPND_IS_ON_SCXB(cb->cpd_self_id, cpd_get_slot_sub_id_from_mds_dest(mds_info->dest))) {
				cb->is_loc_cpnd_up = FALSE;
			}

			if (m_CPND_IS_ON_SCXB(cb->cpd_remote_id, cpd_get_slot_sub_id_from_mds_dest(mds_info->dest))) {
				cb->is_rem_cpnd_up = FALSE;
			}

			/* MDS address for this CPND is no longer valid */
			phy_slot_sub_slot = cpd_get_slot_sub_id_from_mds_dest(mds_info->dest);

			if (cb->ha_state == SA_AMF_HA_ACTIVE) {
				cpd_cpnd_info_node_get(&cb->cpnd_tree, &mds_info->dest, &node_info);
				if (!node_info) {
					/* No Checkpoints on this node, */
					return NCSCC_RC_SUCCESS;
				} else if (node_info && (node_info->ckpt_ref_list == NULL)) {
					cpd_cpnd_info_node_delete(cb, node_info);
					return NCSCC_RC_SUCCESS;
				} else
					cpnd_down_process(cb, mds_info, node_info);
			}
			if (cb->ha_state == SA_AMF_HA_STANDBY) {
				cpd_cpnd_info_node_get(&cb->cpnd_tree, &mds_info->dest, &node_info);
				if (!node_info) {
					/* No Checkpoints on this node, */
					return NCSCC_RC_SUCCESS;
				}
				else if (node_info && (node_info->ckpt_ref_list == NULL)) {
					cpd_cpnd_info_node_delete(cb, node_info);
					return NCSCC_RC_SUCCESS;
				} else {
					node_info->timer_state = 1;
					node_info->cpnd_ret_timer.type = CPD_TMR_TYPE_CPND_RETENTION;
					node_info->cpnd_ret_timer.info.cpnd_dest = mds_info->dest;
					cpd_tmr_start(&node_info->cpnd_ret_timer, CPD_CPND_DOWN_RETENTION_TIME);
				}
			}
		}
		break;
	default:

		/* RSR:TBD Log */
		break;
	}

	return NCSCC_RC_SUCCESS;
}
Beispiel #2
0
void cpd_saf_csi_set_cb(SaInvocationT invocation,
			const SaNameT *compName, SaAmfHAStateT haState, SaAmfCSIDescriptorT csiDescriptor)
{
	CPD_CB *cb = 0;
	SaAisErrorT saErr = SA_AIS_OK;
	V_DEST_RL mds_role;
	/*  V_CARD_QA   anchor; */
	NCSVDA_INFO vda_info;
	uint32_t rc = NCSCC_RC_SUCCESS;
	CPD_CPND_INFO_NODE *node_info = NULL;
	MDS_DEST prev_dest;

	TRACE_ENTER();
	cb = ncshm_take_hdl(NCS_SERVICE_ID_CPD, gl_cpd_cb_hdl);
	if (cb) {

		if ((cb->ha_state == SA_AMF_HA_STANDBY) && (haState == SA_AMF_HA_ACTIVE)) {
			if (cb->cold_or_warm_sync_on == true) {
				TRACE("STANDBY cpd_saf_csi_set_cb -cb->cold_or_warm_sync_on == true ");
				saErr = SA_AIS_ERR_TRY_AGAIN;
				saAmfResponse(cb->amf_hdl, invocation, saErr);
				ncshm_give_hdl(cb->cpd_hdl);
				TRACE_4("cpd vdest change role failed");
				m_CPSV_DBG_SINK(NCSCC_RC_FAILURE,
						"cpd_role_change: Failed to send Error report to AMF for Active role assignment during Cold-Sync");
				return;
			}
		}

		if ((cb->ha_state == SA_AMF_HA_ACTIVE) && (haState == SA_AMF_HA_QUIESCED)) {
			if (cb->cold_or_warm_sync_on == true) {
				TRACE("ACTIVE cpd_saf_csi_set_cb -cb->cold_or_warm_sync_on == true ");
			}
		}

		/* cb->ha_state = haState; */

		/*     saAmfResponse(cb->amf_hdl, invocation, saErr); */

   		if (SA_AMF_HA_ACTIVE == haState) {
		        /** Change the MDS role **/
			cb->ha_state = haState;
			mds_role = V_DEST_RL_ACTIVE;
			TRACE("ACTIVE STATE");

			/* If this is the active server, become implementer again. */
			/* If this is the active Director, become implementer */
			saErr = immutil_saImmOiImplementerSet(cb->immOiHandle, implementer_name);
			if (saErr != SA_AIS_OK){
				LOG_ER("cpd immOiImplmenterSet failed with err = %u",saErr);
				exit(EXIT_FAILURE);
			}
			/*   anchor   = cb->cpd_anc; */
		} else if (SA_AMF_HA_QUIESCED == haState) {
			mds_role = V_DEST_RL_QUIESCED;
			cb->amf_invocation = invocation;
			cb->is_quiesced_set = true;
			memset(&vda_info, 0, sizeof(vda_info));

			vda_info.req = NCSVDA_VDEST_CHG_ROLE;
			vda_info.info.vdest_chg_role.i_vdest = cb->cpd_dest_id;
			/* vda_info.info.vdest_chg_role.i_anc = anchor; */
			vda_info.info.vdest_chg_role.i_new_role = mds_role;
			rc = ncsvda_api(&vda_info);
			if (NCSCC_RC_SUCCESS != rc) {
				m_LEAP_DBG_SINK_VOID;
				LOG_ER("cpd vdest change role failed");
				ncshm_give_hdl(cb->cpd_hdl);
				TRACE_LEAVE();
				return;
			}
			ncshm_give_hdl(cb->cpd_hdl);
			TRACE_2("cpd csi set cb success");
			TRACE_LEAVE();
			return;
		} else {
      		        /** Change the MDS role **/
		        cb->ha_state = haState;
			mds_role = V_DEST_RL_STANDBY;
			TRACE("STANDBY STATE");
			/*   anchor   = cb->cpd_anc; */
		}
		memset(&vda_info, 0, sizeof(vda_info));

		vda_info.req = NCSVDA_VDEST_CHG_ROLE;
		vda_info.info.vdest_chg_role.i_vdest = cb->cpd_dest_id;
		/* vda_info.info.vdest_chg_role.i_anc = anchor; */
		vda_info.info.vdest_chg_role.i_new_role = mds_role;
		rc = ncsvda_api(&vda_info);
		if (NCSCC_RC_SUCCESS != rc) {
			m_LEAP_DBG_SINK_VOID;
			LOG_ER("cpd vdest change role failed");
			ncshm_give_hdl(cb->cpd_hdl);
			TRACE_LEAVE();
			return;
		}
		if (cpd_mbcsv_chgrole(cb) != NCSCC_RC_SUCCESS) {
			TRACE_4("cpd mbcsv chgrole failed");
		}

		/** Set the CB's anchor value */
		/*      cb->cpd_anc= anchor;  */
		saAmfResponse(cb->amf_hdl, invocation, saErr);
		ncshm_give_hdl(cb->cpd_hdl);

		if (SA_AMF_HA_ACTIVE == cb->ha_state) {
			cpd_cpnd_info_node_getnext(&cb->cpnd_tree, NULL, &node_info);
			while (node_info) {
				prev_dest = node_info->cpnd_dest;
				if (node_info->timer_state == 2) {
					TRACE	
						("THE TIMER STATE IS 2 MEANS TIMER EXPIRED BUT STILL DID NOT GET ACTIVE STATE");
					cpd_process_cpnd_down(cb, &node_info->cpnd_dest);
				}
				cpd_cpnd_info_node_getnext(&cb->cpnd_tree, &prev_dest, &node_info);

			}
			TRACE_2("cpd csi set cb success I AM ACTIVE ");
		}
		if (SA_AMF_HA_STANDBY == cb->ha_state)
			TRACE_2("cpd csi set cb success I AM STANDBY");

	} else {
		TRACE_4("cpd donot exist");
	}
	TRACE_LEAVE();
	return;
}	/* End of cpd_saf_csi_set_cb() */