/**************************************************************************** * Name : gld_mds_glnd_down * * Description : MDS indicated that a glnd has gone down * * Arguments : evt - Event structure * * Return Values : NCSCC_RC_SUCCESS/ NCSCC_RC_FAILURE * * Notes : None. *****************************************************************************/ static uint32_t gld_mds_glnd_down(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; uint32_t node_id; uint32_t rc = NCSCC_RC_FAILURE; TRACE_ENTER2("mds identification %u",gld_cb->my_dest_id ); node_id = m_NCS_NODE_ID_FROM_MDS_DEST(evt->info.glnd_mds_info.mds_dest_id); if ((evt == GLSV_GLD_EVT_NULL) || (gld_cb == NULL)) goto end; memcpy(&evt->fr_dest_id, &evt->info.glnd_mds_info.mds_dest_id, sizeof(MDS_DEST) ); if ((node_details = (GLSV_GLD_GLND_DETAILS *)ncs_patricia_tree_get(&gld_cb->glnd_details, (uint8_t *)&node_id)) == NULL) { TRACE_1("Resource details is empty for glnd on node_id %u ", node_id); rc = NCSCC_RC_SUCCESS; goto end; } node_details->status = GLND_RESTART_STATE; TRACE("EVT Processing MDS GLND DOWN: node_id %u", node_details->node_id); memcpy(&node_details->restart_timer.mdest_id, &node_details->dest_id, sizeof(MDS_DEST)); /* Start GLSV_GLD_GLND_RESTART_TIMEOUT timer */ gld_start_tmr(gld_cb, &node_details->restart_timer, GLD_TMR_NODE_RESTART_TIMEOUT, GLD_NODE_RESTART_TIMEOUT, 0); /* Check whether this node is master for any resource, if yes send the status to all the non master nodes */ if (gld_cb->ha_state == SA_AMF_HA_ACTIVE) { /* Check whether this node is master for any resource, if yes send the status to all the non master nodes */ rsc_info = gld_cb->rsc_info; while (rsc_info != NULL) { if (rsc_info->node_list) { if (rsc_info->node_list->node_id == node_details->node_id) gld_snd_master_status(gld_cb, rsc_info, GLND_RESOURCE_MASTER_RESTARTED); } 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_RESTART_STATE); } end: TRACE_LEAVE2("Return value: %u", rc); return rc; }
/**************************************************************************** * Name : gld_mds_glnd_down * * Description : MDS indicated that a glnd has gone down * * Arguments : evt - Event structure * * Return Values : NCSCC_RC_SUCCESS/ NCSCC_RC_FAILURE * * Notes : None. *****************************************************************************/ static uns32 gld_mds_glnd_down(GLSV_GLD_EVT *evt) { GLSV_GLD_CB *gld_cb = evt->gld_cb; GLSV_GLD_GLND_DETAILS *node_details = NULL; NCS_BOOL orphan_flag; GLSV_GLD_RSC_INFO *rsc_info; uns32 node_id; node_id = m_NCS_NODE_ID_FROM_MDS_DEST(evt->info.glnd_mds_info.mds_dest_id); if ((evt == GLSV_GLD_EVT_NULL) || (gld_cb == NULL)) return NCSCC_RC_FAILURE; orphan_flag = evt->info.rsc_details.orphan; memcpy(&evt->fr_dest_id, &evt->info.glnd_mds_info.mds_dest_id, sizeof(MDS_DEST) ); 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_SUCCESS; } node_details->status = GLND_RESTART_STATE; m_LOG_GLD_EVT(GLD_EVT_MDS_GLND_DOWN, NCSFL_SEV_NOTICE, __FILE__, __LINE__, 0, node_details->node_id); memcpy(&node_details->restart_timer.mdest_id, &node_details->dest_id, sizeof(MDS_DEST)); /* Start GLSV_GLD_GLND_RESTART_TIMEOUT timer */ gld_start_tmr(gld_cb, &node_details->restart_timer, GLD_TMR_NODE_RESTART_TIMEOUT, GLD_NODE_RESTART_TIMEOUT, 0); /* Check whether this node is master for any resource, if yes send the status to all the non master nodes */ if (gld_cb->ha_state == SA_AMF_HA_ACTIVE) { /* Check whether this node is master for any resource, if yes send the status to all the non master nodes */ rsc_info = gld_cb->rsc_info; while (rsc_info != NULL) { if (rsc_info->node_list) { if (rsc_info->node_list->node_id == node_details->node_id) gld_snd_master_status(gld_cb, rsc_info, GLND_RESOURCE_MASTER_RESTARTED); } 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_RESTART_STATE); } return NCSCC_RC_SUCCESS; }
/**************************************************************************** * Name : gld_sb_proc_data_rsp(GLSV_GLD_CB *gld_cb,) * * Description : * * Arguments : * * Return Values : NCSCC_RC_SUCCESS/ NCSCC_RC_FAILURE * * Notes : None. *****************************************************************************/ uint32_t gld_sb_proc_data_rsp(GLSV_GLD_CB *gld_cb, GLSV_GLD_A2S_RSC_DETAILS *rsc_details) { GLSV_A2S_NODE_LIST *node_list = NULL; GLSV_NODE_LIST *tmp1_node_list = NULL; GLSV_NODE_LIST **tmp2_node_list = NULL; GLSV_GLD_GLND_DETAILS *node_details = NULL; GLSV_GLD_RSC_INFO *rsc_info = NULL; SaAisErrorT ret_error; uint32_t node_id; uint32_t rc = NCSCC_RC_SUCCESS; TRACE_ENTER(); if (rsc_details) { rsc_info = (GLSV_GLD_RSC_INFO *)ncs_patricia_tree_get(&gld_cb->rsc_info_id, (uint8_t *)&rsc_details->rsc_id); if (rsc_info == NULL) rsc_info = gld_add_rsc_info(gld_cb, &rsc_details->resource_name, rsc_details->rsc_id, &ret_error); if (rsc_info == NULL) { rc = NCSCC_RC_FAILURE; goto end; } else rsc_info->can_orphan = rsc_details->can_orphan; } else { rc = NCSCC_RC_FAILURE; goto end; } if (rsc_details->node_list) node_list = rsc_details->node_list; else { rc = NCSCC_RC_FAILURE; goto end; } while (node_list != NULL) { node_id = m_NCS_NODE_ID_FROM_MDS_DEST(node_list->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) { if ((node_details = gld_add_glnd_node(gld_cb, node_list->dest_id)) == NULL) { rc = NCSCC_RC_FAILURE; goto end; } else node_details->status = node_list->status; if (node_details->status == GLND_RESTART_STATE) { memcpy(&node_details->restart_timer.mdest_id, &node_details->dest_id, sizeof(MDS_DEST)); /* Start GLSV_GLD_GLND_RESTART_TIMEOUT timer */ gld_start_tmr(gld_cb, &node_details->restart_timer, GLD_TMR_NODE_RESTART_TIMEOUT, GLD_NODE_RESTART_TIMEOUT, 0); } } gld_rsc_add_node_ref(gld_cb, node_details, rsc_info); /* Now add this node to the list of nodes referring this resource */ tmp1_node_list = rsc_info->node_list; tmp2_node_list = &rsc_info->node_list; while (tmp1_node_list != NULL) { if (tmp1_node_list->node_id == node_list->node_id) break; tmp2_node_list = &tmp1_node_list->next; tmp1_node_list = tmp1_node_list->next; } if (tmp1_node_list == NULL) { tmp1_node_list = m_MMGR_ALLOC_GLSV_NODE_LIST; memset(tmp1_node_list, 0, sizeof(GLSV_NODE_LIST)); tmp1_node_list->dest_id = node_details->dest_id; /*In cold_sync,while decoding node_id value will be derived from dest_id,here updating the correct node_id in the node_list */ tmp1_node_list->node_id = node_details->node_id; *tmp2_node_list = tmp1_node_list; } node_list = node_list->next; } end: TRACE_LEAVE(); return rc; }