/**************************************************************************** * Name : cpd_evt_proc_mds_evt * * Description : Function to process the Events received from MDS * * Arguments : CPD_CB *cb - CPD CB pointer * CPSV_EVT *evt - Received Event structure * * Return Values : NCSCC_RC_SUCCESS/Error. * * Notes : None. *****************************************************************************/ static uns32 cpd_evt_proc_mds_evt(CPD_CB *cb, CPD_EVT *evt) { CPSV_MDS_INFO *mds_info; CPD_CPND_INFO_NODE *node_info = NULL; CPD_CKPT_INFO_NODE *ckpt_node = NULL; CPD_NODE_REF_INFO *nref_info; CPD_CKPT_REF_INFO *cref_info = NULL; CPD_CKPT_MAP_INFO *map_info = NULL; SaCkptCheckpointHandleT prev_ckpt_hdl; NCS_BOOL flag = FALSE; SaNameT ckpt_name; uns32 phy_slot_sub_slot; NCS_BOOL add_flag = TRUE; memset(&ckpt_name, 0, sizeof(SaNameT)); mds_info = &evt->info.mds_info; memset(&phy_slot_sub_slot, 0, sizeof(uns32)); switch (mds_info->change) { case NCSMDS_RED_UP: /* get the peer mds_red_up */ /* get the mds_dest of remote CPND */ if (cb->node_id != mds_info->node_id) { MDS_DEST tmpDest = 0LL; phy_slot_sub_slot = cpd_get_slot_sub_slot_id_from_node_id(mds_info->node_id); cb->cpd_remote_id = phy_slot_sub_slot; if (cb->is_rem_cpnd_up == FALSE) { cpd_cpnd_info_node_getnext(&cb->cpnd_tree, &tmpDest, &node_info); while (node_info) { /* while-1 */ if (mds_info->node_id == node_info->cpnd_key) { cb->is_rem_cpnd_up = TRUE; cb->rem_cpnd_dest = node_info->cpnd_dest; /* Break out of while-1. We found */ if (cb->ha_state == SA_AMF_HA_ACTIVE) { cpd_ckpt_node_getnext(&cb->ckpt_tree, NULL, &ckpt_node); while (ckpt_node) { prev_ckpt_hdl = ckpt_node->ckpt_id; if (!m_IS_SA_CKPT_CHECKPOINT_COLLOCATED(&ckpt_node->attributes)) { nref_info = ckpt_node->node_list; while (nref_info) { if (m_CPD_IS_LOCAL_NODE (cb->cpd_remote_id, cpd_get_slot_sub_id_from_mds_dest (nref_info->dest))) { flag = TRUE; } nref_info = nref_info->next; } if (flag == FALSE) { cpd_ckpt_map_node_get(&cb->ckpt_map_tree, &ckpt_node->ckpt_name, &map_info); if (map_info) { cpd_noncolloc_ckpt_rep_create(cb, &cb-> rem_cpnd_dest, ckpt_node, map_info); } } } cpd_ckpt_node_getnext(&cb->ckpt_tree, &prev_ckpt_hdl, &ckpt_node); } } break; } tmpDest = node_info->cpnd_dest; cpd_cpnd_info_node_getnext(&cb->cpnd_tree, &tmpDest, &node_info); } } } else { /* Don't handle RED_UP from our own node */ break; } break; case NCSMDS_UP: if (mds_info->svc_id == NCSMDS_SVC_ID_CPD) { if (mds_info->change == NCSMDS_UP) return NCSCC_RC_SUCCESS; } if (mds_info->svc_id == NCSMDS_SVC_ID_CPND) { /* Save MDS address for this CPND */ phy_slot_sub_slot = cpd_get_slot_sub_id_from_mds_dest(mds_info->dest); if (cb->cpd_remote_id == phy_slot_sub_slot) { cb->rem_cpnd_dest = mds_info->dest; } if (m_CPND_IS_ON_SCXB(cb->cpd_self_id, cpd_get_slot_sub_id_from_mds_dest(mds_info->dest))) { cb->is_loc_cpnd_up = TRUE; cb->loc_cpnd_dest = mds_info->dest; if (cb->ha_state == SA_AMF_HA_ACTIVE) { cpd_ckpt_node_getnext(&cb->ckpt_tree, NULL, &ckpt_node); while (ckpt_node) { prev_ckpt_hdl = ckpt_node->ckpt_id; if (!m_IS_SA_CKPT_CHECKPOINT_COLLOCATED(&ckpt_node->attributes)) { nref_info = ckpt_node->node_list; while (nref_info) { if (m_CPD_IS_LOCAL_NODE (cb->cpd_self_id, cpd_get_slot_sub_id_from_mds_dest (nref_info->dest))) { flag = TRUE; } nref_info = nref_info->next; } if (flag == FALSE) { cpd_ckpt_map_node_get(&cb->ckpt_map_tree, &ckpt_node->ckpt_name, &map_info); if (map_info) { cpd_noncolloc_ckpt_rep_create(cb, &cb-> loc_cpnd_dest, ckpt_node, map_info); } } } cpd_ckpt_node_getnext(&cb->ckpt_tree, &prev_ckpt_hdl, &ckpt_node); } } } /* When CPND ON STANDBY COMES UP */ if (m_CPND_IS_ON_SCXB(cb->cpd_remote_id, cpd_get_slot_sub_id_from_mds_dest(mds_info->dest))) { cb->is_rem_cpnd_up = TRUE; cb->rem_cpnd_dest = mds_info->dest; if (cb->ha_state == SA_AMF_HA_ACTIVE) { cpd_ckpt_node_getnext(&cb->ckpt_tree, NULL, &ckpt_node); while (ckpt_node) { prev_ckpt_hdl = ckpt_node->ckpt_id; if (!m_IS_SA_CKPT_CHECKPOINT_COLLOCATED(&ckpt_node->attributes)) { nref_info = ckpt_node->node_list; while (nref_info) { if (m_CPD_IS_LOCAL_NODE (cb->cpd_remote_id, cpd_get_slot_sub_id_from_mds_dest (nref_info->dest))) { flag = TRUE; } nref_info = nref_info->next; } if (flag == FALSE) { cpd_ckpt_map_node_get(&cb->ckpt_map_tree, &ckpt_node->ckpt_name, &map_info); if (map_info) { cpd_noncolloc_ckpt_rep_create(cb, &cb-> rem_cpnd_dest, ckpt_node, map_info); } } } cpd_ckpt_node_getnext(&cb->ckpt_tree, &prev_ckpt_hdl, &ckpt_node); } } } if (cb->ha_state == SA_AMF_HA_ACTIVE) { cpd_cpnd_info_node_get(&cb->cpnd_tree, &mds_info->dest, &node_info); if (!node_info) { cpd_cpnd_info_node_find_add(&cb->cpnd_tree, &mds_info->dest, &node_info, &add_flag); /* No Checkpoints on this node, */ return NCSCC_RC_SUCCESS; } else { cpnd_up_process(cb, mds_info, node_info); } } if (cb->ha_state == SA_AMF_HA_STANDBY) { cpd_cpnd_info_node_get(&cb->cpnd_tree, &mds_info->dest, &node_info); if (!node_info) { cpd_cpnd_info_node_find_add(&cb->cpnd_tree, &mds_info->dest, &node_info, &add_flag); /* No Checkpoints on this node, */ return NCSCC_RC_SUCCESS; } else { node_info->cpnd_ret_timer.type = CPD_TMR_TYPE_CPND_RETENTION; node_info->cpnd_ret_timer.info.cpnd_dest = mds_info->dest; cpd_tmr_stop(&node_info->cpnd_ret_timer); node_info->timer_state = 1; cref_info = node_info->ckpt_ref_list; if (cref_info) cpd_cpnd_dest_replace(cb, cref_info, mds_info); } } } break; case NCSMDS_DOWN: if (mds_info->svc_id == NCSMDS_SVC_ID_CPD) { if (mds_info->change == NCSMDS_DOWN) return NCSCC_RC_SUCCESS; } if (mds_info->svc_id == NCSMDS_SVC_ID_CPND) { if (m_CPND_IS_ON_SCXB(cb->cpd_self_id, cpd_get_slot_sub_id_from_mds_dest(mds_info->dest))) { cb->is_loc_cpnd_up = FALSE; } if (m_CPND_IS_ON_SCXB(cb->cpd_remote_id, cpd_get_slot_sub_id_from_mds_dest(mds_info->dest))) { cb->is_rem_cpnd_up = FALSE; } /* MDS address for this CPND is no longer valid */ phy_slot_sub_slot = cpd_get_slot_sub_id_from_mds_dest(mds_info->dest); if (cb->ha_state == SA_AMF_HA_ACTIVE) { cpd_cpnd_info_node_get(&cb->cpnd_tree, &mds_info->dest, &node_info); if (!node_info) { /* No Checkpoints on this node, */ return NCSCC_RC_SUCCESS; } else if (node_info && (node_info->ckpt_ref_list == NULL)) { cpd_cpnd_info_node_delete(cb, node_info); return NCSCC_RC_SUCCESS; } else cpnd_down_process(cb, mds_info, node_info); } if (cb->ha_state == SA_AMF_HA_STANDBY) { cpd_cpnd_info_node_get(&cb->cpnd_tree, &mds_info->dest, &node_info); if (!node_info) { /* No Checkpoints on this node, */ return NCSCC_RC_SUCCESS; } else if (node_info && (node_info->ckpt_ref_list == NULL)) { cpd_cpnd_info_node_delete(cb, node_info); return NCSCC_RC_SUCCESS; } else { node_info->timer_state = 1; node_info->cpnd_ret_timer.type = CPD_TMR_TYPE_CPND_RETENTION; node_info->cpnd_ret_timer.info.cpnd_dest = mds_info->dest; cpd_tmr_start(&node_info->cpnd_ret_timer, CPD_CPND_DOWN_RETENTION_TIME); } } } break; default: /* RSR:TBD Log */ break; } return NCSCC_RC_SUCCESS; }
void cpd_saf_csi_set_cb(SaInvocationT invocation, const SaNameT *compName, SaAmfHAStateT haState, SaAmfCSIDescriptorT csiDescriptor) { CPD_CB *cb = 0; SaAisErrorT saErr = SA_AIS_OK; V_DEST_RL mds_role; /* V_CARD_QA anchor; */ NCSVDA_INFO vda_info; uint32_t rc = NCSCC_RC_SUCCESS; CPD_CPND_INFO_NODE *node_info = NULL; MDS_DEST prev_dest; TRACE_ENTER(); cb = ncshm_take_hdl(NCS_SERVICE_ID_CPD, gl_cpd_cb_hdl); if (cb) { if ((cb->ha_state == SA_AMF_HA_STANDBY) && (haState == SA_AMF_HA_ACTIVE)) { if (cb->cold_or_warm_sync_on == true) { TRACE("STANDBY cpd_saf_csi_set_cb -cb->cold_or_warm_sync_on == true "); saErr = SA_AIS_ERR_TRY_AGAIN; saAmfResponse(cb->amf_hdl, invocation, saErr); ncshm_give_hdl(cb->cpd_hdl); TRACE_4("cpd vdest change role failed"); m_CPSV_DBG_SINK(NCSCC_RC_FAILURE, "cpd_role_change: Failed to send Error report to AMF for Active role assignment during Cold-Sync"); return; } } if ((cb->ha_state == SA_AMF_HA_ACTIVE) && (haState == SA_AMF_HA_QUIESCED)) { if (cb->cold_or_warm_sync_on == true) { TRACE("ACTIVE cpd_saf_csi_set_cb -cb->cold_or_warm_sync_on == true "); } } /* cb->ha_state = haState; */ /* saAmfResponse(cb->amf_hdl, invocation, saErr); */ if (SA_AMF_HA_ACTIVE == haState) { /** Change the MDS role **/ cb->ha_state = haState; mds_role = V_DEST_RL_ACTIVE; TRACE("ACTIVE STATE"); /* If this is the active server, become implementer again. */ /* If this is the active Director, become implementer */ saErr = immutil_saImmOiImplementerSet(cb->immOiHandle, implementer_name); if (saErr != SA_AIS_OK){ LOG_ER("cpd immOiImplmenterSet failed with err = %u",saErr); exit(EXIT_FAILURE); } /* anchor = cb->cpd_anc; */ } else if (SA_AMF_HA_QUIESCED == haState) { mds_role = V_DEST_RL_QUIESCED; cb->amf_invocation = invocation; cb->is_quiesced_set = true; memset(&vda_info, 0, sizeof(vda_info)); vda_info.req = NCSVDA_VDEST_CHG_ROLE; vda_info.info.vdest_chg_role.i_vdest = cb->cpd_dest_id; /* vda_info.info.vdest_chg_role.i_anc = anchor; */ vda_info.info.vdest_chg_role.i_new_role = mds_role; rc = ncsvda_api(&vda_info); if (NCSCC_RC_SUCCESS != rc) { m_LEAP_DBG_SINK_VOID; LOG_ER("cpd vdest change role failed"); ncshm_give_hdl(cb->cpd_hdl); TRACE_LEAVE(); return; } ncshm_give_hdl(cb->cpd_hdl); TRACE_2("cpd csi set cb success"); TRACE_LEAVE(); return; } else { /** Change the MDS role **/ cb->ha_state = haState; mds_role = V_DEST_RL_STANDBY; TRACE("STANDBY STATE"); /* anchor = cb->cpd_anc; */ } memset(&vda_info, 0, sizeof(vda_info)); vda_info.req = NCSVDA_VDEST_CHG_ROLE; vda_info.info.vdest_chg_role.i_vdest = cb->cpd_dest_id; /* vda_info.info.vdest_chg_role.i_anc = anchor; */ vda_info.info.vdest_chg_role.i_new_role = mds_role; rc = ncsvda_api(&vda_info); if (NCSCC_RC_SUCCESS != rc) { m_LEAP_DBG_SINK_VOID; LOG_ER("cpd vdest change role failed"); ncshm_give_hdl(cb->cpd_hdl); TRACE_LEAVE(); return; } if (cpd_mbcsv_chgrole(cb) != NCSCC_RC_SUCCESS) { TRACE_4("cpd mbcsv chgrole failed"); } /** Set the CB's anchor value */ /* cb->cpd_anc= anchor; */ saAmfResponse(cb->amf_hdl, invocation, saErr); ncshm_give_hdl(cb->cpd_hdl); if (SA_AMF_HA_ACTIVE == cb->ha_state) { cpd_cpnd_info_node_getnext(&cb->cpnd_tree, NULL, &node_info); while (node_info) { prev_dest = node_info->cpnd_dest; if (node_info->timer_state == 2) { TRACE ("THE TIMER STATE IS 2 MEANS TIMER EXPIRED BUT STILL DID NOT GET ACTIVE STATE"); cpd_process_cpnd_down(cb, &node_info->cpnd_dest); } cpd_cpnd_info_node_getnext(&cb->cpnd_tree, &prev_dest, &node_info); } TRACE_2("cpd csi set cb success I AM ACTIVE "); } if (SA_AMF_HA_STANDBY == cb->ha_state) TRACE_2("cpd csi set cb success I AM STANDBY"); } else { TRACE_4("cpd donot exist"); } TRACE_LEAVE(); return; } /* End of cpd_saf_csi_set_cb() */