Example #1
0
/****************************************************************************
 * Name          : gld_rsc_open
 *
 * Description   : This is the function is invoked when a rsc_open event is
 *                 is sent from a GLND. This function will assign a resource id
 *                 and send the information to the GLND
 *
 * Arguments     : evt  - Event structure
 *
 * Return Values : NCSCC_RC_SUCCESS/ NCSCC_RC_FAILURE
 *
 * Notes         : None.
 *****************************************************************************/
static uns32 gld_rsc_open(GLSV_GLD_EVT *evt)
{
    GLSV_GLD_CB *gld_cb = evt->gld_cb;
    GLSV_GLD_RSC_INFO *rsc_info;
    GLSV_GLD_GLND_DETAILS *node_details;
    GLSV_NODE_LIST *node_list, **tmp_node_list;
    GLSV_GLND_EVT glnd_evt;
    NCSMDS_INFO snd_mds;
    uns32 res;
    SaAisErrorT error;
    uns32 node_id;
    NCS_BOOL node_first_rsc_open = FALSE;
    GLSV_GLD_GLND_RSC_REF *glnd_rsc = NULL;
    NCS_BOOL orphan_flag = FALSE;

    node_id = m_NCS_NODE_ID_FROM_MDS_DEST(evt->fr_dest_id);
    memset(&snd_mds, '\0', sizeof(NCSMDS_INFO));
    memset(&glnd_evt, '\0', sizeof(GLSV_GLND_EVT));

    if ((evt == GLSV_GLD_EVT_NULL) || (gld_cb == NULL))
        return NCSCC_RC_FAILURE;

    /* Find if the node details are available */
    if ((node_details = (GLSV_GLD_GLND_DETAILS *)ncs_patricia_tree_get(&gld_cb->glnd_details,
                        (uns8 *)&node_id)) == NULL) {
        node_first_rsc_open = TRUE;
        if ((node_details = gld_add_glnd_node(gld_cb, evt->fr_dest_id)) == NULL)
            return NCSCC_RC_FAILURE;
    }

    rsc_info = gld_find_add_rsc_name(gld_cb, &evt->info.rsc_open_info.rsc_name,
                                     evt->info.rsc_open_info.rsc_id, evt->info.rsc_open_info.flag, &error);

    if (rsc_info == NULL) {
        /* based on the error - pass on the info to the glnd */
        glnd_evt.type = GLSV_GLND_EVT_RSC_GLD_DETAILS;
        glnd_evt.info.rsc_gld_info.rsc_name = evt->info.rsc_open_info.rsc_name;
        glnd_evt.info.rsc_gld_info.error = error;

        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 = node_details->dest_id;

        res = ncsmds_api(&snd_mds);
        if (res != NCSCC_RC_SUCCESS) {
            m_LOG_GLD_SVC_PRVDR(GLD_MDS_SEND_ERROR, NCSFL_SEV_ERROR, __FILE__, __LINE__);
        }
        goto err1;
    }
    m_LOG_GLD_EVT(GLD_EVT_RSC_OPEN, NCSFL_SEV_INFO, __FILE__, __LINE__, rsc_info->rsc_id, node_details->node_id);

    gld_rsc_add_node_ref(gld_cb, node_details, rsc_info);

    /* Now add this node to the list of nodes referring this resource */
    node_list = rsc_info->node_list;
    tmp_node_list = &rsc_info->node_list;
    while (node_list != NULL) {
        if (node_list->node_id == node_id)
            break;
        tmp_node_list = &node_list->next;
        node_list = node_list->next;
    }

    if (node_list == NULL) {
        node_list = m_MMGR_ALLOC_GLSV_NODE_LIST;
        memset(node_list, 0, sizeof(GLSV_NODE_LIST));
        node_list->dest_id = node_details->dest_id;
        node_list->node_id = m_NCS_NODE_ID_FROM_MDS_DEST(evt->fr_dest_id);
        *tmp_node_list = node_list;

        /* Send the details to the glnd */
        glnd_evt.type = GLSV_GLND_EVT_RSC_GLD_DETAILS;
        glnd_evt.info.rsc_gld_info.master_dest_id = rsc_info->node_list->dest_id;
        glnd_evt.info.rsc_gld_info.rsc_id = rsc_info->rsc_id;
        glnd_evt.info.rsc_gld_info.rsc_name = rsc_info->lck_name;
        glnd_evt.info.rsc_gld_info.can_orphan = rsc_info->can_orphan;
        glnd_evt.info.rsc_gld_info.orphan_mode = rsc_info->orphan_lck_mode;
        glnd_evt.info.rsc_gld_info.error = SA_AIS_OK;

        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 = node_details->dest_id;

        res = ncsmds_api(&snd_mds);
        if (res != NCSCC_RC_SUCCESS) {
            m_LOG_GLD_SVC_PRVDR(GLD_MDS_SEND_ERROR, NCSFL_SEV_ERROR, __FILE__, __LINE__);
            goto err2;
        }
    }

    /* checkpoint resource */
    glsv_gld_a2s_ckpt_resource(gld_cb, &rsc_info->lck_name, rsc_info->rsc_id, evt->fr_dest_id,
                               rsc_info->saf_rsc_creation_time);

    return NCSCC_RC_SUCCESS;
err2:

    glnd_rsc = (GLSV_GLD_GLND_RSC_REF *)ncs_patricia_tree_get(&node_details->rsc_info_tree,
               (uns8 *)&rsc_info->rsc_id);
    if ((glnd_rsc == NULL) || (glnd_rsc->rsc_info == NULL)) {
        m_LOG_GLD_LCK_OPER(GLD_OPER_RSC_OPER_ERROR, NCSFL_SEV_ERROR, __FILE__, __LINE__, "",
                           rsc_info->rsc_id, node_details->node_id);
        return NCSCC_RC_FAILURE;
    }

    if (glnd_rsc->rsc_info->saf_rsc_no_of_users > 0)
        glnd_rsc->rsc_info->saf_rsc_no_of_users = glnd_rsc->rsc_info->saf_rsc_no_of_users - 1;

    gld_rsc_rmv_node_ref(gld_cb, glnd_rsc->rsc_info, glnd_rsc, node_details, orphan_flag);
err1:
    if (node_first_rsc_open) {
        /* 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);
        }
    }
    return NCSCC_RC_FAILURE;

}
Example #2
0
/****************************************************************************
 * Name          : gld_rsc_open
 *
 * Description   : This is the function is invoked when a rsc_open event is
 *                 is sent from a GLND. This function will assign a resource id
 *                 and send the information to the GLND
 *
 * Arguments     : evt  - Event structure
 *
 * Return Values : NCSCC_RC_SUCCESS/ NCSCC_RC_FAILURE
 *
 * Notes         : None.
 *****************************************************************************/
static uint32_t gld_rsc_open(GLSV_GLD_EVT *evt)
{
	GLSV_GLD_CB *gld_cb = evt->gld_cb;
	GLSV_GLD_RSC_INFO *rsc_info;
	GLSV_GLD_GLND_DETAILS *node_details;
	GLSV_NODE_LIST *node_list, **tmp_node_list;
	GLSV_GLND_EVT glnd_evt;
	NCSMDS_INFO snd_mds;
	uint32_t res = NCSCC_RC_FAILURE;;
	SaAisErrorT error;
	uint32_t node_id;
	bool node_first_rsc_open = false;
	GLSV_GLD_GLND_RSC_REF *glnd_rsc = NULL;
	bool orphan_flag = false;
	TRACE_ENTER2("component name %s", gld_cb->comp_name.value);

	node_id = m_NCS_NODE_ID_FROM_MDS_DEST(evt->fr_dest_id);
	memset(&snd_mds, '\0', sizeof(NCSMDS_INFO));
	memset(&glnd_evt, '\0', sizeof(GLSV_GLND_EVT));

	if ((evt == GLSV_GLD_EVT_NULL) || (gld_cb == NULL))
		goto end;

	/* Find if the node details are available */
	if ((node_details = (GLSV_GLD_GLND_DETAILS *)ncs_patricia_tree_get(&gld_cb->glnd_details,
									   (uint8_t *)&node_id)) == NULL) {
		node_first_rsc_open = true;
		if ((node_details = gld_add_glnd_node(gld_cb, evt->fr_dest_id)) == NULL)
			goto end;
	}

	rsc_info = gld_find_add_rsc_name(gld_cb, &evt->info.rsc_open_info.rsc_name,
					 evt->info.rsc_open_info.rsc_id, evt->info.rsc_open_info.flag, &error);

	if (rsc_info == NULL) {
		/* based on the error - pass on the info to the glnd */
		glnd_evt.type = GLSV_GLND_EVT_RSC_GLD_DETAILS;
		glnd_evt.info.rsc_gld_info.rsc_name = evt->info.rsc_open_info.rsc_name;
		glnd_evt.info.rsc_gld_info.error = error;

		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 = node_details->dest_id;

		res = ncsmds_api(&snd_mds);
		if (res != NCSCC_RC_SUCCESS) {
			LOG_ER("MDS Send failed");
		}
		goto err1;
	}
	TRACE_1("EVT Processing rsc open: rsc_id %u node_id %u", rsc_info->rsc_id, node_details->node_id);

	gld_rsc_add_node_ref(gld_cb, node_details, rsc_info);

	/* Now add this node to the list of nodes referring this resource */
	node_list = rsc_info->node_list;
	tmp_node_list = &rsc_info->node_list;
	while (node_list != NULL) {
		if (node_list->node_id == node_id)
			break;
		tmp_node_list = &node_list->next;
		node_list = node_list->next;
	}

	if (node_list == NULL) {
		node_list = m_MMGR_ALLOC_GLSV_NODE_LIST;
		memset(node_list, 0, sizeof(GLSV_NODE_LIST));
		node_list->dest_id = node_details->dest_id;
		node_list->node_id = m_NCS_NODE_ID_FROM_MDS_DEST(evt->fr_dest_id);
		*tmp_node_list = node_list;

		/* Send the details to the glnd */
		glnd_evt.type = GLSV_GLND_EVT_RSC_GLD_DETAILS;
		glnd_evt.info.rsc_gld_info.master_dest_id = rsc_info->node_list->dest_id;
		glnd_evt.info.rsc_gld_info.rsc_id = rsc_info->rsc_id;
		glnd_evt.info.rsc_gld_info.rsc_name = rsc_info->lck_name;
		glnd_evt.info.rsc_gld_info.can_orphan = rsc_info->can_orphan;
		glnd_evt.info.rsc_gld_info.orphan_mode = rsc_info->orphan_lck_mode;
		glnd_evt.info.rsc_gld_info.error = SA_AIS_OK;

		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 = node_details->dest_id;

		res = ncsmds_api(&snd_mds);
		if (res != NCSCC_RC_SUCCESS) {
			LOG_ER("MDS Send failed");
			goto err2;
		}
	}

	/* checkpoint resource */
	glsv_gld_a2s_ckpt_resource(gld_cb, &rsc_info->lck_name, rsc_info->rsc_id, evt->fr_dest_id,
				   rsc_info->saf_rsc_creation_time);

	res = NCSCC_RC_SUCCESS;
	goto end;
 err2:

	glnd_rsc = (GLSV_GLD_GLND_RSC_REF *)ncs_patricia_tree_get(&node_details->rsc_info_tree,
								  (uint8_t *)&rsc_info->rsc_id);
	if ((glnd_rsc == NULL) || (glnd_rsc->rsc_info == NULL)) {
		LOG_ER("Rsc operation for unopened rsc: rsc_id %u node_id %u",
				   rsc_info->rsc_id, node_details->node_id);
		goto end;
	}

	if (glnd_rsc->rsc_info->saf_rsc_no_of_users > 0)
		glnd_rsc->rsc_info->saf_rsc_no_of_users = glnd_rsc->rsc_info->saf_rsc_no_of_users - 1;

	gld_rsc_rmv_node_ref(gld_cb, glnd_rsc->rsc_info, glnd_rsc, node_details, orphan_flag);
 err1:
	if (node_first_rsc_open) {
		/* 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);
		}
	}
	res = NCSCC_RC_FAILURE;
 end:
	TRACE_LEAVE2("return value %u", res);
	return res;

}