/***************************************************************************** PROCEDURE NAME : gld_process_tmr_node_restart_wait_timeout DESCRIPTION : ARGUMENTS :gld_cb - ptr to the GLD control block evt - ptr to the event. RETURNS :NCSCC_RC_FAILURE/NCSCC_RC_SUCCESS NOTES : None *****************************************************************************/ static uint32_t gld_process_tmr_node_restart_wait_timeout(GLSV_GLD_EVT *evt) { GLSV_GLD_CB *gld_cb = evt->gld_cb; GLSV_GLD_GLND_DETAILS *node_details; GLSV_GLD_GLND_RSC_REF *glnd_rsc; SaLckResourceIdT rsc_id; uint32_t node_id; node_id = m_NCS_NODE_ID_FROM_MDS_DEST(evt->info.tmr.mdest_id); TRACE_ENTER2("Node restart wait timer expired: node_id %u", node_id); if ((node_details = (GLSV_GLD_GLND_DETAILS *)ncs_patricia_tree_get(&gld_cb->glnd_details, (uint8_t *)&node_id)) == NULL) { LOG_ER("Evenr from unknown glnd: node_id %u", node_id); return NCSCC_RC_FAILURE; } if (gld_cb->ha_state == SA_AMF_HA_ACTIVE) { /* checkpoint node_details */ glsv_gld_a2s_ckpt_node_details(gld_cb, node_details->dest_id, GLSV_GLD_EVT_GLND_DOWN); /* If this node is non master for any resource, then send node status to the master */ gld_process_send_non_master_status(gld_cb, node_details, GLND_DOWN_STATE); /* Remove the reference to each of the resource referred by this node */ glnd_rsc = (GLSV_GLD_GLND_RSC_REF *)ncs_patricia_tree_getnext(&node_details->rsc_info_tree, (uint8_t *)0); if (glnd_rsc) { rsc_id = glnd_rsc->rsc_id; while (glnd_rsc) { gld_rsc_rmv_node_ref(gld_cb, glnd_rsc->rsc_info, glnd_rsc, node_details, glnd_rsc->rsc_info->can_orphan); glnd_rsc = (GLSV_GLD_GLND_RSC_REF *)ncs_patricia_tree_getnext(&node_details->rsc_info_tree, (uint8_t *)&rsc_id); if (glnd_rsc) rsc_id = glnd_rsc->rsc_id; } } /* Now delete this node details node */ if (ncs_patricia_tree_del(&gld_cb->glnd_details, (NCS_PATRICIA_NODE *)node_details) != NCSCC_RC_SUCCESS) { LOG_ER("Patricia tree del failed: node_id %u", node_details->node_id); } else { m_MMGR_FREE_GLSV_GLD_GLND_DETAILS(node_details); TRACE("Node getting removed on active: node_id %u", node_id); } } else { node_details->status = GLND_DOWN_STATE; } return NCSCC_RC_SUCCESS; }
/***************************************************************************** PROCEDURE NAME : gld_process_tmr_node_restart_wait_timeout DESCRIPTION : ARGUMENTS :gld_cb - ptr to the GLD control block evt - ptr to the event. RETURNS :NCSCC_RC_FAILURE/NCSCC_RC_SUCCESS NOTES : None *****************************************************************************/ static uns32 gld_process_tmr_node_restart_wait_timeout(GLSV_GLD_EVT *evt) { GLSV_GLD_CB *gld_cb = evt->gld_cb; GLSV_GLD_GLND_DETAILS *node_details; GLSV_GLD_GLND_RSC_REF *glnd_rsc; SaLckResourceIdT rsc_id; uns32 node_id; node_id = m_NCS_NODE_ID_FROM_MDS_DEST(evt->info.tmr.mdest_id); m_LOG_GLD_HEADLINE(GLD_ND_RESTART_WAIT_TMR_EXP, NCSFL_SEV_NOTICE, __FILE__, __LINE__, node_id); if ((node_details = (GLSV_GLD_GLND_DETAILS *)ncs_patricia_tree_get(&gld_cb->glnd_details, (uns8 *)&node_id)) == NULL) { m_LOG_GLD_HEADLINE(GLD_UNKNOWN_GLND_EVT, NCSFL_SEV_NOTICE, __FILE__, __LINE__, node_id); return NCSCC_RC_FAILURE; } if (gld_cb->ha_state == SA_AMF_HA_ACTIVE) { /* checkpoint node_details */ glsv_gld_a2s_ckpt_node_details(gld_cb, node_details->dest_id, GLSV_GLD_EVT_GLND_DOWN); /* If this node is non master for any resource, then send node status to the master */ gld_process_send_non_master_status(gld_cb, node_details, GLND_DOWN_STATE); /* Remove the reference to each of the resource referred by this node */ glnd_rsc = (GLSV_GLD_GLND_RSC_REF *)ncs_patricia_tree_getnext(&node_details->rsc_info_tree, (uns8 *)0); if (glnd_rsc) { rsc_id = glnd_rsc->rsc_id; while (glnd_rsc) { gld_rsc_rmv_node_ref(gld_cb, glnd_rsc->rsc_info, glnd_rsc, node_details, glnd_rsc->rsc_info->can_orphan); glnd_rsc = (GLSV_GLD_GLND_RSC_REF *)ncs_patricia_tree_getnext(&node_details->rsc_info_tree, (uns8 *)&rsc_id); if (glnd_rsc) rsc_id = glnd_rsc->rsc_id; } } /* Now delete this node details node */ if (ncs_patricia_tree_del(&gld_cb->glnd_details, (NCS_PATRICIA_NODE *)node_details) != NCSCC_RC_SUCCESS) { m_LOG_GLD_HEADLINE(GLD_PATRICIA_TREE_DEL_FAILED, NCSFL_SEV_ERROR, __FILE__, __LINE__, node_details->node_id); } else { m_MMGR_FREE_GLSV_GLD_GLND_DETAILS(node_details); m_LOG_GLD_HEADLINE(GLD_ACTIVE_RMV_NODE, NCSFL_SEV_NOTICE, __FILE__, __LINE__, node_id); } } else { node_details->status = GLND_DOWN_STATE; } return NCSCC_RC_SUCCESS; }
/**************************************************************************** * Name : gld_glnd_operational * * Description : * * Arguments : evt - Event structure * * Return Values : NCSCC_RC_SUCCESS/ NCSCC_RC_FAILURE * * Notes : None. *****************************************************************************/ static uint32_t gld_glnd_operational(GLSV_GLD_EVT *evt) { GLSV_GLD_CB *gld_cb = evt->gld_cb; GLSV_GLD_GLND_DETAILS *node_details = NULL; GLSV_GLD_RSC_INFO *rsc_info = NULL; uint32_t node_id; GLSV_NODE_LIST *node_list = NULL; TRACE_ENTER(); node_id = m_NCS_NODE_ID_FROM_MDS_DEST(evt->fr_dest_id); /* Find if the node details are already available */ if ((node_details = (GLSV_GLD_GLND_DETAILS *)ncs_patricia_tree_get(&gld_cb->glnd_details, (uint8_t *)&node_id)) != NULL) { memcpy(&node_details->dest_id, &evt->fr_dest_id, sizeof(MDS_DEST)); /* Cancel the restart timer if started */ gld_stop_tmr(&node_details->restart_timer); node_details->status = GLND_OPERATIONAL_STATE; rsc_info = gld_cb->rsc_info; while (rsc_info != NULL) { node_list = rsc_info->node_list; while (node_list != NULL) { if (node_list->node_id == node_id) { memcpy(&node_list->dest_id, &evt->fr_dest_id, sizeof(MDS_DEST)); } node_list = node_list->next; } rsc_info = rsc_info->next; } glsv_gld_a2s_ckpt_node_details(gld_cb, node_details->dest_id, GLSV_GLD_EVT_GLND_OPERATIONAL); rsc_info = gld_cb->rsc_info; while (rsc_info != NULL) { if (rsc_info->node_list->node_id == node_details->node_id) gld_snd_master_status(gld_cb, rsc_info, GLND_RESOURCE_MASTER_OPERATIONAL); rsc_info = rsc_info->next; } /* If this node is non master for any resource, then send node status to the master */ gld_process_send_non_master_status(gld_cb, node_details, GLND_OPERATIONAL_STATE); } /*Send resource-master information to GLND */ gld_send_res_master_info(gld_cb, node_details, evt->fr_dest_id); TRACE_LEAVE(); return NCSCC_RC_SUCCESS; }