/**************************************************************************** * Name : gld_send_res_master_info * * Description : This function sends resource-master details to the GLND after it restarts * * Arguments : GLSV_GLD_CB, GLSV_GLD_GLND_DETAILS * * Return Values : NCSCC_RC_SUCCESS/ NCSCC_RC_FAILURE * * Notes : None. *****************************************************************************/ static uns32 gld_send_res_master_info(GLSV_GLD_CB *gld_cb, GLSV_GLD_GLND_DETAILS *node_details, MDS_DEST dest_id) { GLSV_GLD_GLND_RSC_REF *glnd_rsc = NULL; GLSV_GLD_GLND_DETAILS *master_node_details = NULL; GLSV_GLND_EVT glnd_evt; NCSMDS_INFO snd_mds; uns32 index = 0; uns32 no_of_glnd_res = 0; GLSV_NODE_LIST *temp_node_list = NULL; GLSV_GLD_GLND_DETAILS *non_master_node_details = NULL; if (gld_cb == NULL) return NCSCC_RC_FAILURE; memset(&snd_mds, '\0', sizeof(NCSMDS_INFO)); memset(&glnd_evt, '\0', sizeof(GLSV_GLND_EVT)); glnd_evt.type = GLSV_GLND_EVT_RSC_MASTER_INFO; if (node_details) { glnd_rsc = (GLSV_GLD_GLND_RSC_REF *)ncs_patricia_tree_getnext(&node_details->rsc_info_tree, (uns8 *)0); while (glnd_rsc) { no_of_glnd_res++; glnd_rsc = (GLSV_GLD_GLND_RSC_REF *)ncs_patricia_tree_getnext(&node_details->rsc_info_tree, (uns8 *)&glnd_rsc->rsc_id); } glnd_evt.info.rsc_master_info.no_of_res = no_of_glnd_res; if (glnd_evt.info.rsc_master_info.no_of_res > 0) { glnd_evt.info.rsc_master_info.rsc_master_list = m_MMGR_ALLOC_GLND_RES_MASTER_LIST_INFO(no_of_glnd_res); if (glnd_evt.info.rsc_master_info.rsc_master_list == NULL) { /* Log the error */ return NCSCC_RC_FAILURE; } memset(glnd_evt.info.rsc_master_info.rsc_master_list, 0, (sizeof(GLSV_GLND_RSC_MASTER_INFO_LIST) * no_of_glnd_res)); glnd_rsc = (GLSV_GLD_GLND_RSC_REF *)ncs_patricia_tree_getnext(&node_details->rsc_info_tree, (uns8 *)0); while (glnd_rsc) { /* Get the master node for this resource */ master_node_details = (GLSV_GLD_GLND_DETAILS *)ncs_patricia_tree_get(&gld_cb->glnd_details, (uns8 *)&glnd_rsc-> rsc_info->node_list->node_id); if (master_node_details) { glnd_evt.info.rsc_master_info.rsc_master_list[index].rsc_id = glnd_rsc->rsc_id; glnd_evt.info.rsc_master_info.rsc_master_list[index].master_dest_id = glnd_rsc->rsc_info->node_list->dest_id; glnd_evt.info.rsc_master_info.rsc_master_list[index].master_status = master_node_details->status; index++; /*If this node is master for this resource, send all the non masters info of this resource to the master */ if (master_node_details->node_id == node_details->node_id) { temp_node_list = glnd_rsc->rsc_info->node_list->next; while (temp_node_list) { non_master_node_details = (GLSV_GLD_GLND_DETAILS *) ncs_patricia_tree_get(&gld_cb->glnd_details, (uns8 *) &temp_node_list->node_id); if (non_master_node_details) { gld_process_send_non_master_info(gld_cb, glnd_rsc, non_master_node_details, non_master_node_details->status); } else { m_LOG_GLD_HEADLINE(GLD_PATRICIA_TREE_GET_FAILED, NCSFL_SEV_ERROR, __FILE__, __LINE__, temp_node_list->node_id); } temp_node_list = temp_node_list->next; } } } else { m_LOG_GLD_HEADLINE(GLD_PATRICIA_TREE_GET_FAILED, NCSFL_SEV_ERROR, __FILE__, __LINE__, glnd_rsc->rsc_info->node_list->node_id); } glnd_rsc = (GLSV_GLD_GLND_RSC_REF *)ncs_patricia_tree_getnext(&node_details->rsc_info_tree, (uns8 *)&glnd_rsc->rsc_id); } } } snd_mds.i_mds_hdl = gld_cb->mds_handle; snd_mds.i_svc_id = NCSMDS_SVC_ID_GLD; snd_mds.i_op = MDS_SEND; snd_mds.info.svc_send.i_msg = (NCSCONTEXT)&glnd_evt; snd_mds.info.svc_send.i_to_svc = NCSMDS_SVC_ID_GLND; snd_mds.info.svc_send.i_priority = MDS_SEND_PRIORITY_HIGH; snd_mds.info.svc_send.i_sendtype = MDS_SENDTYPE_SND; snd_mds.info.svc_send.info.snd.i_to_dest = dest_id; if (ncsmds_api(&snd_mds) != NCSCC_RC_SUCCESS) { m_LOG_GLD_SVC_PRVDR(GLD_MDS_SEND_ERROR, NCSFL_SEV_ERROR, __FILE__, __LINE__); return NCSCC_RC_FAILURE; } if (no_of_glnd_res > 0) m_MMGR_FREE_GLND_RES_MASTER_LIST_INFO(glnd_evt.info.rsc_master_info.rsc_master_list); return NCSCC_RC_SUCCESS; }
/**************************************************************************** * Name : gld_send_res_master_info * * Description : This function sends resource-master details to the GLND after it restarts * * Arguments : GLSV_GLD_CB, GLSV_GLD_GLND_DETAILS * * Return Values : NCSCC_RC_SUCCESS/ NCSCC_RC_FAILURE * * Notes : None. *****************************************************************************/ static uint32_t gld_send_res_master_info(GLSV_GLD_CB *gld_cb, GLSV_GLD_GLND_DETAILS *node_details, MDS_DEST dest_id) { GLSV_GLD_GLND_RSC_REF *glnd_rsc = NULL; GLSV_GLD_GLND_DETAILS *master_node_details = NULL; GLSV_GLND_EVT glnd_evt; NCSMDS_INFO snd_mds; uint32_t index = 0; uint32_t no_of_glnd_res = 0; GLSV_NODE_LIST *temp_node_list = NULL; GLSV_GLD_GLND_DETAILS *non_master_node_details = NULL; uint32_t rc = NCSCC_RC_SUCCESS; TRACE_ENTER(); if (gld_cb == NULL) goto end; memset(&snd_mds, '\0', sizeof(NCSMDS_INFO)); memset(&glnd_evt, '\0', sizeof(GLSV_GLND_EVT)); glnd_evt.type = GLSV_GLND_EVT_RSC_MASTER_INFO; if (node_details) { glnd_rsc = (GLSV_GLD_GLND_RSC_REF *)ncs_patricia_tree_getnext(&node_details->rsc_info_tree, (uint8_t *)0); while (glnd_rsc) { no_of_glnd_res++; glnd_rsc = (GLSV_GLD_GLND_RSC_REF *)ncs_patricia_tree_getnext(&node_details->rsc_info_tree, (uint8_t *)&glnd_rsc->rsc_id); } glnd_evt.info.rsc_master_info.no_of_res = no_of_glnd_res; if (glnd_evt.info.rsc_master_info.no_of_res > 0) { glnd_evt.info.rsc_master_info.rsc_master_list = m_MMGR_ALLOC_GLND_RES_MASTER_LIST_INFO(no_of_glnd_res); if (glnd_evt.info.rsc_master_info.rsc_master_list == NULL) { LOG_CR("Memory Alloc Failure: Error %s", strerror(errno)); /* Log the error */ assert(0); } memset(glnd_evt.info.rsc_master_info.rsc_master_list, 0, (sizeof(GLSV_GLND_RSC_MASTER_INFO_LIST) * no_of_glnd_res)); glnd_rsc = (GLSV_GLD_GLND_RSC_REF *)ncs_patricia_tree_getnext(&node_details->rsc_info_tree, (uint8_t *)0); while (glnd_rsc) { /* Get the master node for this resource */ master_node_details = (GLSV_GLD_GLND_DETAILS *)ncs_patricia_tree_get(&gld_cb->glnd_details, (uint8_t *)&glnd_rsc-> rsc_info->node_list->node_id); if (master_node_details) { glnd_evt.info.rsc_master_info.rsc_master_list[index].rsc_id = glnd_rsc->rsc_id; glnd_evt.info.rsc_master_info.rsc_master_list[index].master_dest_id = glnd_rsc->rsc_info->node_list->dest_id; glnd_evt.info.rsc_master_info.rsc_master_list[index].master_status = master_node_details->status; index++; /*If this node is master for this resource, send all the non masters info of this resource to the master */ if (master_node_details->node_id == node_details->node_id) { temp_node_list = glnd_rsc->rsc_info->node_list->next; while (temp_node_list) { non_master_node_details = (GLSV_GLD_GLND_DETAILS *) ncs_patricia_tree_get(&gld_cb->glnd_details, (uint8_t *) &temp_node_list->node_id); if (non_master_node_details) { gld_process_send_non_master_info(gld_cb, glnd_rsc, non_master_node_details, non_master_node_details->status); } else { LOG_ER("Patricia tree get failed: node_id %u", temp_node_list->node_id); } temp_node_list = temp_node_list->next; } } } else { LOG_ER("Patricia tree get failed: node_id %u ", glnd_rsc->rsc_info->node_list->node_id); } glnd_rsc = (GLSV_GLD_GLND_RSC_REF *)ncs_patricia_tree_getnext(&node_details->rsc_info_tree, (uint8_t *)&glnd_rsc->rsc_id); } } } snd_mds.i_mds_hdl = gld_cb->mds_handle; snd_mds.i_svc_id = NCSMDS_SVC_ID_GLD; snd_mds.i_op = MDS_SEND; snd_mds.info.svc_send.i_msg = (NCSCONTEXT)&glnd_evt; snd_mds.info.svc_send.i_to_svc = NCSMDS_SVC_ID_GLND; snd_mds.info.svc_send.i_priority = MDS_SEND_PRIORITY_HIGH; snd_mds.info.svc_send.i_sendtype = MDS_SENDTYPE_SND; snd_mds.info.svc_send.info.snd.i_to_dest = dest_id; if (ncsmds_api(&snd_mds) != NCSCC_RC_SUCCESS) { LOG_ER("MDS Send failed"); rc = NCSCC_RC_FAILURE; goto end; } if (no_of_glnd_res > 0) m_MMGR_FREE_GLND_RES_MASTER_LIST_INFO(glnd_evt.info.rsc_master_info.rsc_master_list); end: TRACE_LEAVE(); return rc; }