Beispiel #1
0
/****************************************************************************
  Name          : cpd_ckpt_node_add
  Description   : This routine adds the new node to ckpt_tree.
  Arguments     : ckpt_tree - Checkpoint Tree.
                  ckpt_node -  checkpoint Node.
  Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
  Notes         : The caller takes the cb lock before calling this function
******************************************************************************/
uns32 cpd_ckpt_node_add(NCS_PATRICIA_TREE *ckpt_tree, CPD_CKPT_INFO_NODE *ckpt_node, SaAmfHAStateT ha_state,
                        SaImmOiHandleT immOiHandle)
{
    SaAisErrorT err = SA_AIS_OK;
    /* Store the client_info pointer as msghandle. */
    ckpt_node->patnode.key_info = (uns8 *)&ckpt_node->ckpt_id;

    /*create the imm runtime object */
    if (ha_state == SA_AMF_HA_ACTIVE) {
        err = create_runtime_ckpt_object(ckpt_node, immOiHandle);
        if (err != SA_AIS_OK) {
            cpd_log(NCSFL_SEV_ERROR, "create_runtime_ckpt_object failed %u\n", err);
            return NCSCC_RC_FAILURE;
        }
    }

    if (ncs_patricia_tree_add(ckpt_tree, &ckpt_node->patnode) != NCSCC_RC_SUCCESS) {
        m_LOG_CPD_FCL(CPD_CKPT_INFO_NODE_ADD_FAILED, CPD_FC_HDLN, NCSFL_SEV_ERROR, ckpt_node->ckpt_id, __FILE__,
                      __LINE__);
        /* delete imm ckpt runtime object */
        if (ha_state == SA_AMF_HA_ACTIVE) {
            if (immutil_saImmOiRtObjectDelete(immOiHandle, &ckpt_node->ckpt_name) != SA_AIS_OK) {
                cpd_log(NCSFL_SEV_ERROR, "Deleting run time object %s FAILED",
                        ckpt_node->ckpt_name.value);
                return NCSCC_RC_FAILURE;
            }
        }
        return NCSCC_RC_FAILURE;
    }

    return NCSCC_RC_SUCCESS;
}
Beispiel #2
0
/****************************************************************************
 * Name          : cpd_evt_proc_ckpt_unlink
 *
 * Description   : Function to process the Unlink request received from CPND.
 *
 * Arguments     : CPD_CB *cb - CPND CB pointer
 *                 CPSV_EVT *evt - Received Event structure
 *
 * Return Values : NCSCC_RC_SUCCESS/Error.
 *
 * Notes         : None.
 *****************************************************************************/
static uns32 cpd_evt_proc_ckpt_unlink(CPD_CB *cb, CPD_EVT *evt, CPSV_SEND_INFO *sinfo)
{
	CPD_CKPT_INFO_NODE *ckpt_node = NULL;
	CPD_CKPT_MAP_INFO *map_info = NULL;
	SaNameT *ckpt_name = &evt->info.ckpt_ulink.ckpt_name;
	SaAisErrorT rc = SA_AIS_OK;
	SaAisErrorT proc_rc = SA_AIS_OK;
	CPSV_EVT send_evt;

	rc = cpd_proc_unlink_set(cb, &ckpt_node, map_info, ckpt_name);
	if (rc != SA_AIS_OK)
		goto send_rsp;

	/* Redundancy  A2S */
	cpd_a2s_ckpt_unlink_set(cb, ckpt_node);

 send_rsp:
	memset(&send_evt, 0, sizeof(CPSV_EVT));
	send_evt.type = CPSV_EVT_TYPE_CPND;
	send_evt.info.cpnd.type = CPND_EVT_D2ND_CKPT_UNLINK_ACK;
	send_evt.info.cpnd.info.ulink_ack.error = rc;
	proc_rc = cpd_mds_send_rsp(cb, sinfo, &send_evt);

	if (rc == SA_AIS_OK) {
		/* Broadcast the Unlink info to all CPNDs */
		memset(&send_evt, 0, sizeof(CPSV_EVT));
		send_evt.type = CPSV_EVT_TYPE_CPND;
		send_evt.info.cpnd.type = CPND_EVT_D2ND_CKPT_UNLINK;
		send_evt.info.cpnd.info.ckpt_ulink.ckpt_id = ckpt_node->ckpt_id;

		proc_rc = cpd_mds_bcast_send(cb, &send_evt, NCSMDS_SVC_ID_CPND);
		m_LOG_CPD_CFCL(CPD_EVT_UNLINK_SUCCESS, CPD_FC_HDLN, NCSFL_SEV_INFO,
			       evt->info.ckpt_ulink.ckpt_name.value, sinfo->dest, __FILE__, __LINE__);

		/* delete imm ckpt runtime object */
		if (cb->ha_state == SA_AMF_HA_ACTIVE) {
			if (immutil_saImmOiRtObjectDelete(cb->immOiHandle, &ckpt_node->ckpt_name) != SA_AIS_OK) {
				cpd_log(NCSFL_SEV_ERROR, "Deleting run time object %s FAILED",
					ckpt_node->ckpt_name.value);
				/* Free the Client Node */
			}
		}
	}

	return proc_rc;
}
Beispiel #3
0
/****************************************************************************
  Name          : cpd_ckpt_node_delete
  Description   : This routine deletes the Checkpoint node from tree
  Arguments     : CPD_CB *cb - CPD Control Block.
                : CPD_CKPT_INFO_NODE *lc_node - Local Ckeckpoint Node.
  Return Values : None
  Notes         : None
******************************************************************************/
uns32 cpd_ckpt_node_delete(CPD_CB *cb, CPD_CKPT_INFO_NODE *ckpt_node)
{
    uns32 rc = NCSCC_RC_SUCCESS;
    CPD_NODE_REF_INFO *nref_info, *next_info;

    /* In case if the internal pointers present, delete them
       The while loop is executed in case of cleanup, at the time of destroy */
    if (ckpt_node == NULL) {
        rc = NCSCC_RC_FAILURE;
        return rc;
    }
    nref_info = ckpt_node->node_list;
    while (nref_info) {
        next_info = nref_info->next;
        m_MMGR_FREE_CPD_NODE_REF_INFO(nref_info);
        nref_info = next_info;
    }

    /* delete imm ckpt runtime object */
    if ((cb->ha_state == SA_AMF_HA_ACTIVE) && (ckpt_node->is_unlink_set != TRUE)) {
        if (immutil_saImmOiRtObjectDelete(cb->immOiHandle, &ckpt_node->ckpt_name) != SA_AIS_OK) {
            cpd_log(NCSFL_SEV_ERROR, "Deleting run time object %s FAILED", ckpt_node->ckpt_name.value);
            /* Free the Client Node */
            if (ckpt_node)
                m_MMGR_FREE_CPD_CKPT_INFO_NODE(ckpt_node);
            return NCSCC_RC_FAILURE;
        }
    }

    if (ncs_patricia_tree_del(&cb->ckpt_tree, &ckpt_node->patnode) != NCSCC_RC_SUCCESS) {
        rc = NCSCC_RC_FAILURE;
    }

    /* Free the Client Node */
    if (ckpt_node)
        m_MMGR_FREE_CPD_CKPT_INFO_NODE(ckpt_node);

    return rc;

}
Beispiel #4
0
/****************************************************************************
  Name          : cpd_ckpt_reploc_node_add
  Description   : This routine adds the new node to ckpt_tree.
  Arguments     : ckpt_tree - Checkpoint Tree.
                  ckpt_node -  checkpoint Node.
  Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
  Notes         : The caller takes the cb lock before calling this function
******************************************************************************/
uns32 cpd_ckpt_reploc_node_add(NCS_PATRICIA_TREE *ckpt_reploc_tree, CPD_CKPT_REPLOC_INFO *ckpt_reploc_node,
                               SaAmfHAStateT ha_state, SaImmOiHandleT immOiHandle)
{
    SaAisErrorT err = SA_AIS_OK;
    SaNameT replica_dn;
    memset(&replica_dn, 0, sizeof(SaNameT));

    /* Add the imm runtime object */
    if (ha_state == SA_AMF_HA_ACTIVE) {
        err = create_runtime_replica_object(ckpt_reploc_node, immOiHandle);
        if (err != SA_AIS_OK) {
            cpd_log(NCSFL_SEV_ERROR, "create_runtime_replica_object failed %u\n", err);
            return NCSCC_RC_FAILURE;
        }
    }
    ckpt_reploc_node->rep_key.ckpt_name.length = m_NCS_OS_HTONS(ckpt_reploc_node->rep_key.ckpt_name.length);
    /* node name is obtained from cluster info which always returns in network order, so no need of the conversion for the node_name length */
    ckpt_reploc_node->rep_key.node_name.length = m_NCS_OS_HTONS(ckpt_reploc_node->rep_key.node_name.length);

    ckpt_reploc_node->patnode.key_info = (uns8 *)&ckpt_reploc_node->rep_key;
    if (ncs_patricia_tree_add(ckpt_reploc_tree, &ckpt_reploc_node->patnode) != NCSCC_RC_SUCCESS) {
        /* m_LOG_CPD_HEADLINE(CPD_CKPT_REPLOC_INFO_ADD_FAILED, NCSFL_SEV_ERROR); */
        /* delete reploc imm runtime object */
        if (ha_state == SA_AMF_HA_ACTIVE) {
            cpd_create_association_class_dn(&ckpt_reploc_node->rep_key.node_name,
                                            &ckpt_reploc_node->rep_key.ckpt_name, "safReplica", &replica_dn);

            if (immutil_saImmOiRtObjectDelete(immOiHandle, &replica_dn) != SA_AIS_OK) {
                cpd_log(NCSFL_SEV_ERROR, "Deleting run time object %s FAILED", replica_dn.value);
                return NCSCC_RC_FAILURE;
            }
            return NCSCC_RC_FAILURE;
        }
    }

    return NCSCC_RC_SUCCESS;
}
Beispiel #5
0
/****************************************************************************\
 PROCEDURE NAME : mqd_timer_expiry_evt_process

 DESCRIPTION    : This routine process the comp specific message.

 ARGUMENTS      : pMqd - MQD Control block pointer
                  nodeid - NODE ID

 RETURNS        : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
\*****************************************************************************/
uint32_t mqd_timer_expiry_evt_process(MQD_CB *pMqd, NODE_ID *nodeid)
{
	MQD_ND_DB_NODE *pNdNode = 0;
	MQD_OBJ_NODE *pNode = 0;
	MQD_A2S_MSG msg;
	SaImmOiHandleT immOiHandle;
	SaImmOiImplementerNameT implementer_name;
	char i_name[256] = {0};
	SaVersionT imm_version = {'A',0x02,0x01};
	uint32_t rc = NCSCC_RC_SUCCESS;
	TRACE_ENTER2("The Timer expired with node id %u", *nodeid);

	pNdNode = (MQD_ND_DB_NODE *)ncs_patricia_tree_get(&pMqd->node_db, (uint8_t *)nodeid);

	/* We need to scan the entire database and remove the track inforamtion
	 * pertaining to the user
	 */

	if (pNdNode == NULL) {
		LOG_ER("MQD_ND_DB_NODE is NULL");
		rc = NCSCC_RC_FAILURE;
		return rc;
	}
	if (pMqd->ha_state == SA_AMF_HA_ACTIVE) {
		rc = immutil_saImmOiInitialize_2(&immOiHandle, NULL, &imm_version);
		if (rc != SA_AIS_OK)
			LOG_ER("saImmOiInitialize_2 failed with return value=%d",rc);

		snprintf(i_name, SA_MAX_NAME_LENGTH, "%s%u", "MsgQueueService", *nodeid);
		implementer_name = i_name;

		rc = immutil_saImmOiImplementerSet(immOiHandle, implementer_name);
		if (rc != SA_AIS_OK)
			LOG_ER("saImmOiImplementerSet failed with return value=%d",rc);

		if (pNdNode->info.timer.tmr_id != TMR_T_NULL) {
			m_NCS_TMR_DESTROY(pNdNode->info.timer.tmr_id);
			pNdNode->info.timer.tmr_id = TMR_T_NULL;
		}

		pNode = (MQD_OBJ_NODE *)ncs_patricia_tree_getnext(&pMqd->qdb, (uint8_t *)0);
		while (pNode) {
			ASAPi_DEREG_INFO dereg;
			SaNameT name;

			memset(&dereg, 0, sizeof(ASAPi_DEREG_INFO));

			name = pNode->oinfo.name;

			if (m_NCS_NODE_ID_FROM_MDS_DEST(pNode->oinfo.info.q.dest) == pNdNode->info.nodeid) {
				dereg.objtype = ASAPi_OBJ_QUEUE;
				dereg.queue = pNode->oinfo.name;
				rc = immutil_saImmOiRtObjectDelete(immOiHandle, &dereg.queue);
				if (rc != NCSCC_RC_SUCCESS)
					LOG_ER("Deleting MsgQGrp object %s FAILED with error %u", dereg.queue.value,rc);
				rc = mqd_asapi_dereg_hdlr(pMqd, &dereg, NULL);
			}

			pNode = (MQD_OBJ_NODE *)ncs_patricia_tree_getnext(&pMqd->qdb, (uint8_t *)&name);
		}
		rc = immutil_saImmOiFinalize(immOiHandle);
		if (rc != NCSCC_RC_SUCCESS)
			LOG_ER("saImmOiFinalize failed with return value=%d",rc);	
		/* Send an async Update to the standby */
		memset(&msg, 0, sizeof(MQD_A2S_MSG));
		msg.type = MQD_A2S_MSG_TYPE_MQND_TIMER_EXPEVT;
		msg.info.nd_tmr_exp_evt.nodeid = pNdNode->info.nodeid;
		/* Send async update to the standby for MQD redundancy */
		mqd_a2s_async_update(pMqd, MQD_A2S_MSG_TYPE_MQND_TIMER_EXPEVT, (void *)(&msg.info.nd_tmr_exp_evt));

		if (pNdNode)
			mqd_red_db_node_del(pMqd, pNdNode);
		TRACE_1("MQND TMR EXPIRY PROCESSED ON ACTIVE");
	} else if (pMqd->ha_state == SA_AMF_HA_STANDBY) {
		pNdNode->info.timer.is_expired = true;
		TRACE_1("MQND TMR EXPIRY PROCESSED ON STANDBY");
	}
	TRACE_LEAVE();
	return rc;
}	/* End of mqd_timer_expiry_evt_process() */