Beispiel #1
0
/****************************************************************************
 * 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;
}
Beispiel #2
0
/****************************************************************************
 * 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;
}