/**************************************************************************** Name : cpa_mds_enc Description : This function encodes an events sent from CPA to remote CPND. Arguments : cb : CPA control Block. info : Info for encoding Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ static uns32 cpa_mds_enc(CPA_CB *cb, MDS_CALLBACK_ENC_INFO *enc_info) { CPSV_EVT *pevt = NULL; EDU_ERR ederror = 0; NCS_UBAID *io_uba = enc_info->io_uba; uns32 rc = NCSCC_RC_SUCCESS; uns8 *pstream = NULL; /* Get the Msg Format version from the SERVICE_ID & RMT_SVC_PVT_SUBPART_VERSION */ if (enc_info->i_to_svc_id == NCSMDS_SVC_ID_CPND) { enc_info->o_msg_fmt_ver = m_NCS_ENC_MSG_FMT_GET(enc_info->i_rem_svc_pvt_ver, CPA_WRT_CPND_SUBPART_VER_MIN, CPA_WRT_CPND_SUBPART_VER_MAX, cpa_cpnd_msg_fmt_table); } if (enc_info->o_msg_fmt_ver) { pevt = (CPSV_EVT *)enc_info->i_msg; if (pevt->type == CPSV_EVT_TYPE_CPND) { if (pevt->info.cpnd.type == CPND_EVT_A2ND_CKPT_WRITE) { pstream = ncs_enc_reserve_space(io_uba, 12); if (!pstream) return m_CPSV_DBG_SINK(NCSCC_RC_FAILURE, "Memory alloc failed in cpa_mds_enc \n"); ncs_encode_32bit(&pstream, pevt->type); /* CPSV_EVT Type */ ncs_encode_32bit(&pstream, pevt->info.cpnd.error); /* cpnd_evt error This is for backword compatible purpose with EDU enc/dec with 3.0.2 */ ncs_encode_32bit(&pstream, pevt->info.cpnd.type); /* cpnd_evt SubType */ ncs_enc_claim_space(io_uba, 12); rc = cpsv_ckpt_access_encode(&pevt->info.cpnd.info.ckpt_write, io_uba); return rc; } else if (pevt->info.cpnd.type == CPND_EVT_A2ND_CKPT_READ) { pstream = ncs_enc_reserve_space(io_uba, 12); if (!pstream) return m_CPSV_DBG_SINK(NCSCC_RC_FAILURE, "Memory alloc failed in cpa_mds_enc \n"); ncs_encode_32bit(&pstream, pevt->type); /* CPSV_EVT Type */ ncs_encode_32bit(&pstream, pevt->info.cpnd.error); /* cpnd_evt error This is for backword compatible purpose with EDU enc/dec with 3.0.2 */ ncs_encode_32bit(&pstream, pevt->info.cpnd.type); /* cpnd_evt SubType */ ncs_enc_claim_space(io_uba, 12); rc = cpsv_ckpt_access_encode(&pevt->info.cpnd.info.ckpt_read, io_uba); return rc; } else if(pevt->info.cpnd.type == CPND_EVT_A2ND_CKPT_REFCNTSET) { if(enc_info->o_msg_fmt_ver < 2) return NCSCC_RC_FAILURE; else { pstream = ncs_enc_reserve_space(io_uba, 12); if(!pstream) return m_CPSV_DBG_SINK(NCSCC_RC_FAILURE,"Memory alloc failed in cpa_mds_enc \n"); ncs_encode_32bit(&pstream , pevt->type); ncs_encode_32bit(&pstream , pevt->info.cpnd.error); ncs_encode_32bit(&pstream , pevt->info.cpnd.type); ncs_enc_claim_space(io_uba, 12); rc = cpsv_ref_cnt_encode(io_uba,&pevt->info.cpnd.info.refCntsetReq); return rc; } } } /* For all other cases call EDU othen than Write/Read API's */ rc = m_NCS_EDU_EXEC(&cb->edu_hdl, FUNC_NAME(CPSV_EVT), enc_info->io_uba, EDP_OP_TYPE_ENC, pevt, &ederror); return rc; } else { /* Drop The Message As Msg Fmt Version Not understandable */ m_LOG_CPA_CCL(CPA_PROC_FAILED, NCSFL_LC_CKPT_MGMT, NCSFL_SEV_ERROR, "mds_enc", __FILE__, __LINE__); return NCSCC_RC_FAILURE; } }
/**************************************************************************** Name : cpa_mds_enc Description : This function encodes an events sent from CPA to remote CPND. Arguments : cb : CPA control Block. info : Info for encoding Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ static uint32_t cpa_mds_enc(CPA_CB *cb, MDS_CALLBACK_ENC_INFO *enc_info) { CPSV_EVT *pevt = NULL; EDU_ERR ederror = 0; NCS_UBAID *io_uba = enc_info->io_uba; uint32_t rc = NCSCC_RC_SUCCESS; uint8_t *pstream = NULL; TRACE_ENTER(); /* Get the Msg Format version from the SERVICE_ID & RMT_SVC_PVT_SUBPART_VERSION */ if (enc_info->i_to_svc_id == NCSMDS_SVC_ID_CPND) { /* This is special case to handle the 4.2 deployed node upgrade , the 4.2 has inconsistency between `enc_info->i_rem_svc_pvt_ver` ( CPND_MDS_PVT_SUBPART_VERSION /CPA_MDS_PVT_SUBPART_VERSION ) and `cpa_cpnd_msg_fmt_table` ( CPND_WRT_CPND_SUBPART_VER_RANGE / CPND_WRT_CPA_SUBPART_VER_RANGE) For all other up coming version `m_NCS_ENC_MSG_FMT_GET` logic works fine */ if (enc_info->i_rem_svc_pvt_ver <= 3) /* opensaf 4.2 CPND_MDS_PVT_SUBPART_VERSION was 3 but CPND_WRT_CPND_SUBPART_VER_RANGE was 2 */ enc_info->o_msg_fmt_ver = cpa_cpnd_msg_fmt_table[enc_info->i_rem_svc_pvt_ver - 2]; else /* m_NCS_ENC_MSG_FMT_GET call is equal to cpa_cpnd_msg_fmt_table[enc_info->i_rem_svc_pvt_ver - 1] */ enc_info->o_msg_fmt_ver = m_NCS_ENC_MSG_FMT_GET(enc_info->i_rem_svc_pvt_ver, CPA_WRT_CPND_SUBPART_VER_MIN, CPA_WRT_CPND_SUBPART_VER_MAX, cpa_cpnd_msg_fmt_table); } if (enc_info->o_msg_fmt_ver) { pevt = (CPSV_EVT *)enc_info->i_msg; if (pevt->type == CPSV_EVT_TYPE_CPND) { if (pevt->info.cpnd.type == CPND_EVT_A2ND_CKPT_WRITE) { pstream = ncs_enc_reserve_space(io_uba, 12); if (!pstream) return m_CPSV_DBG_SINK(NCSCC_RC_FAILURE, "Memory alloc failed in cpa_mds_enc \n"); ncs_encode_32bit(&pstream, pevt->type); /* CPSV_EVT Type */ ncs_encode_32bit(&pstream, pevt->info.cpnd.error); /* cpnd_evt error This is for backword compatible purpose with EDU enc/dec with 3.0.2 */ ncs_encode_32bit(&pstream, pevt->info.cpnd.type); /* cpnd_evt SubType */ ncs_enc_claim_space(io_uba, 12); rc = cpsv_ckpt_access_encode(&pevt->info.cpnd.info.ckpt_write, io_uba); TRACE_LEAVE(); return rc; } else if (pevt->info.cpnd.type == CPND_EVT_A2ND_CKPT_READ) { pstream = ncs_enc_reserve_space(io_uba, 12); if (!pstream) return m_CPSV_DBG_SINK(NCSCC_RC_FAILURE, "Memory alloc failed in cpa_mds_enc \n"); ncs_encode_32bit(&pstream, pevt->type); /* CPSV_EVT Type */ ncs_encode_32bit(&pstream, pevt->info.cpnd.error); /* cpnd_evt error This is for backword compatible purpose with EDU enc/dec with 3.0.2 */ ncs_encode_32bit(&pstream, pevt->info.cpnd.type); /* cpnd_evt SubType */ ncs_enc_claim_space(io_uba, 12); rc = cpsv_ckpt_access_encode(&pevt->info.cpnd.info.ckpt_read, io_uba); TRACE_LEAVE(); return rc; } else if(pevt->info.cpnd.type == CPND_EVT_A2ND_CKPT_REFCNTSET) { if(enc_info->o_msg_fmt_ver < 2) { TRACE_LEAVE(); return NCSCC_RC_FAILURE; } else { pstream = ncs_enc_reserve_space(io_uba, 12); if(!pstream) return m_CPSV_DBG_SINK(NCSCC_RC_FAILURE,"Memory alloc failed in cpa_mds_enc \n"); ncs_encode_32bit(&pstream , pevt->type); ncs_encode_32bit(&pstream , pevt->info.cpnd.error); ncs_encode_32bit(&pstream , pevt->info.cpnd.type); ncs_enc_claim_space(io_uba, 12); rc = cpsv_ref_cnt_encode(io_uba,&pevt->info.cpnd.info.refCntsetReq); TRACE_LEAVE(); return rc; } } } /* For all other cases call EDU othen than Write/Read API's */ rc = m_NCS_EDU_EXEC(&cb->edu_hdl, FUNC_NAME(CPSV_EVT), enc_info->io_uba, EDP_OP_TYPE_ENC, pevt, &ederror); TRACE_LEAVE(); return rc; } else { /* Drop The Message As Msg Fmt Version Not understandable */ TRACE_4("cpa api processing failed in mds_enc "); return NCSCC_RC_FAILURE; } }
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() */