Exemplo n.º 1
0
/****************************************************************************\
 PROCEDURE NAME : mqd_nd_status_evt_process

 DESCRIPTION    : This routine process the MQND status event.

 ARGUMENTS      : pMqd - MQD Control block pointer
                  nd_info - ND information                  

 RETURNS        : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
\*****************************************************************************/
static uns32 mqd_nd_status_evt_process(MQD_CB *pMqd, MQD_ND_STATUS_INFO *nd_info)
{
	uns32 rc = NCSCC_RC_SUCCESS;
	void *ptr = 0;
	MQD_ND_DB_NODE *pNdNode = 0;
	SaTimeT timeout = m_NCS_CONVERT_SATIME_TO_TEN_MILLI_SEC(MQD_ND_EXPIRY_TIME_STANDBY);
	NODE_ID node_id = 0;
	MQD_A2S_MSG msg;

	TRACE("MQND status:MDS EVT :processing %d", m_NCS_NODE_ID_FROM_MDS_DEST(nd_info->dest));

	/* Process MQND Related events */
	if (nd_info->is_up == FALSE) {
		pNdNode = m_MMGR_ALLOC_MQD_ND_DB_NODE;
		if (pNdNode == NULL) {
			rc = NCSCC_RC_FAILURE;
			m_LOG_MQSV_D(MQD_MEMORY_ALLOC_FAIL, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, rc, __FILE__,
				     __LINE__);
			return rc;
		}
		memset(pNdNode, 0, sizeof(MQD_ND_DB_NODE));
		pNdNode->info.nodeid = m_NCS_NODE_ID_FROM_MDS_DEST(nd_info->dest);
		pNdNode->info.is_restarted = FALSE;
		pNdNode->info.timer.type = MQD_ND_TMR_TYPE_EXPIRY;
		pNdNode->info.timer.tmr_id = 0;
		pNdNode->info.timer.nodeid = pNdNode->info.nodeid;
		pNdNode->info.timer.uarg = pMqd->hdl;
		pNdNode->info.timer.is_active = FALSE;
		mqd_red_db_node_add(pMqd, pNdNode);

		mqd_tmr_start(&pNdNode->info.timer, timeout);

		if (pMqd->ha_state == SA_AMF_HA_ACTIVE)
			mqd_nd_down_update_info(pMqd, nd_info->dest);
		TRACE("MDS DOWN PROCESSED ON %d DONE", pMqd->ha_state);
	} else {
		node_id = m_NCS_NODE_ID_FROM_MDS_DEST(nd_info->dest);
		pNdNode = (MQD_ND_DB_NODE *)ncs_patricia_tree_get(&pMqd->node_db, (uns8 *)&node_id);
		if (pNdNode) {
			mqd_tmr_stop(&pNdNode->info.timer);
			pNdNode->info.is_restarted = TRUE;
			pNdNode->info.dest = nd_info->dest;
			if (pMqd->ha_state == SA_AMF_HA_ACTIVE) {
				mqd_red_db_node_del(pMqd, pNdNode);
				mqd_nd_restart_update_dest_info(pMqd, nd_info->dest);
				/* Send an async update event to standby MQD */
				memset(&msg, 0, sizeof(MQD_A2S_MSG));
				msg.type = MQD_A2S_MSG_TYPE_MQND_STATEVT;
				msg.info.nd_stat_evt.nodeid = m_NCS_NODE_ID_FROM_MDS_DEST(nd_info->dest);
				msg.info.nd_stat_evt.is_restarting = nd_info->is_up;
				msg.info.nd_stat_evt.downtime = nd_info->event_time;
				ptr = &(msg.info.nd_stat_evt);
				mqd_a2s_async_update(pMqd, MQD_A2S_MSG_TYPE_MQND_STATEVT,
						     (void *)(&msg.info.nd_stat_evt));
			}
		}
		TRACE("MDS UP PROCESSED ON %d DONE", pMqd->ha_state);
	}
	return rc;
}
Exemplo n.º 2
0
/****************************************************************************\
 PROCEDURE NAME : mqd_timer_expiry_evt_process

 DESCRIPTION    : This routine process the comp specific message.

 ARGUMENTS      : pMqd - MQD Control block pointer
                  nodeid - NODE ID

 RETURNS        : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
\*****************************************************************************/
uns32 mqd_timer_expiry_evt_process(MQD_CB *pMqd, NODE_ID *nodeid)
{
	MQD_ND_DB_NODE *pNdNode = 0;
	MQD_OBJ_NODE *pNode = 0;
	MQD_A2S_MSG msg;
	uns32 rc = NCSCC_RC_SUCCESS;

	m_LOG_MQSV_D(MQD_TMR_EXPIRED, NCSFL_LC_TIMER, NCSFL_SEV_NOTICE, NCS_PTR_TO_UNS32_CAST(nodeid), __FILE__,
		     __LINE__);
	pNdNode = (MQD_ND_DB_NODE *)ncs_patricia_tree_get(&pMqd->node_db, (uns8 *)nodeid);

	/* We need to scan the entire database and remove the track inforamtion
	 * pertaining to the user
	 */

	if (pNdNode == NULL) {
		rc = NCSCC_RC_FAILURE;
		return rc;
	}
	if (pMqd->ha_state == SA_AMF_HA_ACTIVE) {
		if (pNdNode->info.timer.tmr_id != TMR_T_NULL) {
			m_NCS_TMR_DESTROY(pNdNode->info.timer.tmr_id);
			pNdNode->info.timer.tmr_id = TMR_T_NULL;
		}

		pNode = (MQD_OBJ_NODE *)ncs_patricia_tree_getnext(&pMqd->qdb, (uns8 *)0);
		while (pNode) {
			ASAPi_DEREG_INFO dereg;
			SaNameT name;

			memset(&dereg, 0, sizeof(ASAPi_DEREG_INFO));

			name = pNode->oinfo.name;

			if (m_NCS_NODE_ID_FROM_MDS_DEST(pNode->oinfo.info.q.dest) == pNdNode->info.nodeid) {
				dereg.objtype = ASAPi_OBJ_QUEUE;
				dereg.queue = pNode->oinfo.name;
				rc = mqd_asapi_dereg_hdlr(pMqd, &dereg, NULL);
			}

			pNode = (MQD_OBJ_NODE *)ncs_patricia_tree_getnext(&pMqd->qdb, (uns8 *)&name);
		}
		/* Send an async Update to the standby */
		memset(&msg, 0, sizeof(MQD_A2S_MSG));
		msg.type = MQD_A2S_MSG_TYPE_MQND_TIMER_EXPEVT;
		msg.info.nd_tmr_exp_evt.nodeid = pNdNode->info.nodeid;
		/* Send async update to the standby for MQD redundancy */
		mqd_a2s_async_update(pMqd, MQD_A2S_MSG_TYPE_MQND_TIMER_EXPEVT, (void *)(&msg.info.nd_tmr_exp_evt));

		if (pNdNode)
			mqd_red_db_node_del(pMqd, pNdNode);
		TRACE("MQND TMR EXPIRY PROCESSED ON ACTIVE");
	} else if (pMqd->ha_state == SA_AMF_HA_STANDBY) {
		pNdNode->info.timer.is_expired = TRUE;
		TRACE("MQND TMR EXPIRY PROCESSED ON STANDBY");
	}
	return rc;
}	/* End of mqd_timer_expiry_evt_process() */
Exemplo n.º 3
0
/****************************************************************************\
 PROCEDURE NAME : mqd_nd_status_evt_process

 DESCRIPTION    : This routine process the MQND status event.

 ARGUMENTS      : pMqd - MQD Control block pointer
                  nd_info - ND information                  

 RETURNS        : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
\*****************************************************************************/
static uint32_t mqd_nd_status_evt_process(MQD_CB *pMqd, MQD_ND_STATUS_INFO *nd_info)
{
	uint32_t rc = NCSCC_RC_SUCCESS;
	MQD_ND_DB_NODE *pNdNode = 0;
	SaTimeT timeout = m_NCS_CONVERT_SATIME_TO_TEN_MILLI_SEC(MQD_ND_EXPIRY_TIME_STANDBY);
	NODE_ID node_id = 0;
	MQD_A2S_MSG msg;
	TRACE_ENTER2("MQND status:MDS EVT :processing %d", m_NCS_NODE_ID_FROM_MDS_DEST(nd_info->dest));

	/* Process MQND Related events */
	if (nd_info->is_up == false) {
		node_id = m_NCS_NODE_ID_FROM_MDS_DEST(nd_info->dest);
		pNdNode = (MQD_ND_DB_NODE *)ncs_patricia_tree_get(&pMqd->node_db, (uint8_t *)&node_id);
		if (!pNdNode) {
			pNdNode = m_MMGR_ALLOC_MQD_ND_DB_NODE;
			if (pNdNode == NULL) {
				LOG_CR("%s:%u: Failed To Allocate Memory", __FILE__, __LINE__);
				rc = NCSCC_RC_FAILURE;
				return rc;
			}
			memset(pNdNode, 0, sizeof(MQD_ND_DB_NODE));
			pNdNode->info.nodeid = m_NCS_NODE_ID_FROM_MDS_DEST(nd_info->dest);
			pNdNode->info.is_restarted = false;
			pNdNode->info.timer.type = MQD_ND_TMR_TYPE_EXPIRY;
			pNdNode->info.timer.tmr_id = 0;
			pNdNode->info.timer.nodeid = pNdNode->info.nodeid;
			pNdNode->info.timer.uarg = pMqd->hdl;
			pNdNode->info.timer.is_active = false;
			mqd_red_db_node_add(pMqd, pNdNode);

			mqd_tmr_start(&pNdNode->info.timer, timeout);
		} else {
			TRACE_2("Deleting the nd node from MQD");
			mqd_red_db_node_del(pMqd, pNdNode);
		}

		if (pMqd->ha_state == SA_AMF_HA_ACTIVE)
			mqd_nd_down_update_info(pMqd, nd_info->dest);
		TRACE_1("MDS DOWN PROCESSED ON %d DONE", pMqd->ha_state);
	} else {
		node_id = m_NCS_NODE_ID_FROM_MDS_DEST(nd_info->dest);
		pNdNode = (MQD_ND_DB_NODE *)ncs_patricia_tree_get(&pMqd->node_db, (uint8_t *)&node_id);
		if (pNdNode) {
			mqd_tmr_stop(&pNdNode->info.timer);
			pNdNode->info.is_restarted = true;
			pNdNode->info.dest = nd_info->dest;
			if (pMqd->ha_state == SA_AMF_HA_ACTIVE) {
				mqd_red_db_node_del(pMqd, pNdNode);
				mqd_nd_restart_update_dest_info(pMqd, nd_info->dest);
				/* Send an async update event to standby MQD */
				memset(&msg, 0, sizeof(MQD_A2S_MSG));
				msg.type = MQD_A2S_MSG_TYPE_MQND_STATEVT;
				msg.info.nd_stat_evt.nodeid = m_NCS_NODE_ID_FROM_MDS_DEST(nd_info->dest);
				msg.info.nd_stat_evt.is_restarting = nd_info->is_up;
				msg.info.nd_stat_evt.downtime = nd_info->event_time;
				mqd_a2s_async_update(pMqd, MQD_A2S_MSG_TYPE_MQND_STATEVT,
						     (void *)(&msg.info.nd_stat_evt));
			}
		}
		TRACE_1("MDS UP PROCESSED ON %d DONE", pMqd->ha_state);
	}
	TRACE_LEAVE();
	return rc;
}
Exemplo n.º 4
0
/****************************************************************************\
 PROCEDURE NAME : mqd_timer_expiry_evt_process

 DESCRIPTION    : This routine process the comp specific message.

 ARGUMENTS      : pMqd - MQD Control block pointer
                  nodeid - NODE ID

 RETURNS        : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
\*****************************************************************************/
uint32_t mqd_timer_expiry_evt_process(MQD_CB *pMqd, NODE_ID *nodeid)
{
	MQD_ND_DB_NODE *pNdNode = 0;
	MQD_OBJ_NODE *pNode = 0;
	MQD_A2S_MSG msg;
	SaImmOiHandleT immOiHandle;
	SaImmOiImplementerNameT implementer_name;
	char i_name[256] = {0};
	SaVersionT imm_version = {'A',0x02,0x01};
	uint32_t rc = NCSCC_RC_SUCCESS;
	TRACE_ENTER2("The Timer expired with node id %u", *nodeid);

	pNdNode = (MQD_ND_DB_NODE *)ncs_patricia_tree_get(&pMqd->node_db, (uint8_t *)nodeid);

	/* We need to scan the entire database and remove the track inforamtion
	 * pertaining to the user
	 */

	if (pNdNode == NULL) {
		LOG_ER("MQD_ND_DB_NODE is NULL");
		rc = NCSCC_RC_FAILURE;
		return rc;
	}
	if (pMqd->ha_state == SA_AMF_HA_ACTIVE) {
		rc = immutil_saImmOiInitialize_2(&immOiHandle, NULL, &imm_version);
		if (rc != SA_AIS_OK)
			LOG_ER("saImmOiInitialize_2 failed with return value=%d",rc);

		snprintf(i_name, SA_MAX_NAME_LENGTH, "%s%u", "MsgQueueService", *nodeid);
		implementer_name = i_name;

		rc = immutil_saImmOiImplementerSet(immOiHandle, implementer_name);
		if (rc != SA_AIS_OK)
			LOG_ER("saImmOiImplementerSet failed with return value=%d",rc);

		if (pNdNode->info.timer.tmr_id != TMR_T_NULL) {
			m_NCS_TMR_DESTROY(pNdNode->info.timer.tmr_id);
			pNdNode->info.timer.tmr_id = TMR_T_NULL;
		}

		pNode = (MQD_OBJ_NODE *)ncs_patricia_tree_getnext(&pMqd->qdb, (uint8_t *)0);
		while (pNode) {
			ASAPi_DEREG_INFO dereg;
			SaNameT name;

			memset(&dereg, 0, sizeof(ASAPi_DEREG_INFO));

			name = pNode->oinfo.name;

			if (m_NCS_NODE_ID_FROM_MDS_DEST(pNode->oinfo.info.q.dest) == pNdNode->info.nodeid) {
				dereg.objtype = ASAPi_OBJ_QUEUE;
				dereg.queue = pNode->oinfo.name;
				rc = immutil_saImmOiRtObjectDelete(immOiHandle, &dereg.queue);
				if (rc != NCSCC_RC_SUCCESS)
					LOG_ER("Deleting MsgQGrp object %s FAILED with error %u", dereg.queue.value,rc);
				rc = mqd_asapi_dereg_hdlr(pMqd, &dereg, NULL);
			}

			pNode = (MQD_OBJ_NODE *)ncs_patricia_tree_getnext(&pMqd->qdb, (uint8_t *)&name);
		}
		rc = immutil_saImmOiFinalize(immOiHandle);
		if (rc != NCSCC_RC_SUCCESS)
			LOG_ER("saImmOiFinalize failed with return value=%d",rc);	
		/* Send an async Update to the standby */
		memset(&msg, 0, sizeof(MQD_A2S_MSG));
		msg.type = MQD_A2S_MSG_TYPE_MQND_TIMER_EXPEVT;
		msg.info.nd_tmr_exp_evt.nodeid = pNdNode->info.nodeid;
		/* Send async update to the standby for MQD redundancy */
		mqd_a2s_async_update(pMqd, MQD_A2S_MSG_TYPE_MQND_TIMER_EXPEVT, (void *)(&msg.info.nd_tmr_exp_evt));

		if (pNdNode)
			mqd_red_db_node_del(pMqd, pNdNode);
		TRACE_1("MQND TMR EXPIRY PROCESSED ON ACTIVE");
	} else if (pMqd->ha_state == SA_AMF_HA_STANDBY) {
		pNdNode->info.timer.is_expired = true;
		TRACE_1("MQND TMR EXPIRY PROCESSED ON STANDBY");
	}
	TRACE_LEAVE();
	return rc;
}	/* End of mqd_timer_expiry_evt_process() */