/**************************************************************************** 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; }
/**************************************************************************** * 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; }
/**************************************************************************** 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; }
/**************************************************************************** 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; }
/****************************************************************************\ 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() */