/****************************************************************************\ 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; }
/****************************************************************************\ 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() */
/****************************************************************************\ PROCEDURE NAME : mqd_user_evt_process DESCRIPTION : This routine process the user specific message. ARGUMENTS : pMqd - MQD Control block pointer dest - MDS_DEST pointer RETURNS : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE \*****************************************************************************/ static uns32 mqd_user_evt_process(MQD_CB *pMqd, MDS_DEST *dest) { MQD_A2S_USER_EVENT_INFO user_evt; if ((pMqd->active) && (pMqd->ha_state == SA_AMF_HA_ACTIVE)) { /* We need to scan the entire database and remove the track inforamtion * pertaining to the user */ mqd_user_evt_track_delete(pMqd, dest); memcpy(&user_evt.dest, dest, sizeof(MDS_DEST)); /* Send async update to the stand by for MQD redundancy */ mqd_a2s_async_update(pMqd, MQD_A2S_MSG_TYPE_USEREVT, (void *)&user_evt); return NCSCC_RC_SUCCESS; } return NCSCC_RC_FAILURE; } /* End of mqd_user_evt_process() */
/****************************************************************************\ 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; }
/****************************************************************************\ 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() */