Esempio n. 1
0
/****************************************************************************
 * 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;

}
Esempio n. 2
0
/****************************************************************************
 * 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;

}