Hi Praveen Ack for the series (with 2 comments). One very minor comment below, the other is in Patch 3.
Thanks Gary On 1/6/17, 9:46 pm, "Praveen" <praveen.malv...@oracle.com> wrote: * A callback that will be invoked by AMFA whenever a SC joins cluster and both SCs leaves cluster if SC Absence feature is enabled. Callback and its argument: void (*OsafAmfSCStatusChangeCallbackT)(OsafAmfSCStatusT state) where OsafAmfSCStatusT is defined as: typedef enum { OSAF_AMF_SC_PRESENT = 1, OSAF_AMF_SC_ABSENT = 2, } OsafAmfSCStatusT; This callback can be integrated with standard AMF component (even with legacy one also). * An API to register/install above callback function: void osafAmfInstallSCStatusChangeCallback( void (*OsafAmfSCStatusChangeCallbackT)(OsafAmfSCStatusT status)); --- src/amf/agent/ava_mds.cc | 35 ++++++++++++++++++++++++++++++++++- src/amf/agent/ava_mds.h | 6 ++++-- src/amf/agent/ava_op.cc | 5 +++++ src/amf/amfnd/avnd_mds.h | 2 +- src/amf/amfnd/di.cc | 39 ++++++++++++++++++++++++++++++++++++++- src/amf/amfnd/mds.cc | 5 ++++- src/amf/common/amf_amfparam.h | 7 +++++++ src/amf/common/amf_n2avamsg.h | 1 + src/amf/saf/libSaAmf.map | 1 + src/amf/saf/saAmf_B_04_02.h | 8 ++++++++ 10 files changed, 103 insertions(+), 6 deletions(-) diff --git a/src/amf/agent/ava_mds.cc b/src/amf/agent/ava_mds.cc index 54a0cfa..42bc139 100644 --- a/src/amf/agent/ava_mds.cc +++ b/src/amf/agent/ava_mds.cc @@ -60,7 +60,8 @@ static uint32_t dec_csi_attr_change_msg(NCS_UBAID *uba, AVSV_NDA_AVA_MSG *msg); static const MDS_CLIENT_MSG_FORMAT_VER ava_avnd_msg_fmt_map_table[AVA_AVND_SUBPART_VER_MAX] = { - AVSV_AVND_AVA_MSG_FMT_VER_1, AVSV_AVND_AVA_MSG_FMT_VER_2}; + AVSV_AVND_AVA_MSG_FMT_VER_1, AVSV_AVND_AVA_MSG_FMT_VER_2, + AVSV_AVND_AVA_MSG_FMT_VER_3}; /** * function called when MDS down for avnd (AMF) is received @@ -68,6 +69,26 @@ static const MDS_CLIENT_MSG_FORMAT_VER */ static void (*amf_down_cb)(void); +/** + * @brief SC status change callback. It is called when cluster becomes + * without SCs and with SCs. It can be used by a client to know + * when cluster runs without SCs and with SCs. + * @param state. + */ +static void (*OsafAmfSCStatusChangeCallbackT)(OsafAmfSCStatusT state); + +//Wrapper function that AMFA uses to invoke SC status change callback. +void osafAmfSCStatusChangeCallback_invoke(OsafAmfSCStatusT state) { + TRACE_ENTER(); + if (OsafAmfSCStatusChangeCallbackT == nullptr) { + TRACE("Callback not registered"); + } else { + TRACE("Invoking SC status change callback"); + /* A client has installed a callback pointer, call it */ + OsafAmfSCStatusChangeCallbackT(state); + } + TRACE_LEAVE(); +} /**************************************************************************** Name : ava_mds_reg @@ -893,6 +914,8 @@ uint32_t ava_mds_flat_dec(AVA_CB *cb, MDS_CALLBACK_DEC_FLAT_INFO *dec_info) { osaf_decode_sanamet(dec_info->io_uba, &pxied_comp_clean->comp_name); } } break; + case AVSV_AMF_SC_STATUS_CHANGE: { + } break; default: osafassert(0); @@ -1168,6 +1191,16 @@ extern "C" void ava_install_amf_down_cb(void (*cb)(void)) { TRACE_LEAVE(); } +/** + * @brief API for client to install SC status change callback. + */ +void osafAmfInstallSCStatusChangeCallback(void (*cb)(OsafAmfSCStatusT status)) { + TRACE_ENTER(); + OsafAmfSCStatusChangeCallbackT = cb; + TRACE_LEAVE(); +} + + void ava_fill_finalize_msg(AVSV_NDA_AVA_MSG *msg, MDS_DEST dst, SaAmfHandleT hdl, SaNameT comp_name) { msg->type = AVSV_AVA_API_MSG; diff --git a/src/amf/agent/ava_mds.h b/src/amf/agent/ava_mds.h index e0f61dd..882f6a5 100644 --- a/src/amf/agent/ava_mds.h +++ b/src/amf/agent/ava_mds.h @@ -35,10 +35,10 @@ extern "C" { #endif /* In Service upgrade support */ -#define AVA_MDS_SUB_PART_VERSION 2 +#define AVA_MDS_SUB_PART_VERSION 3 #define AVA_AVND_SUBPART_VER_MIN 1 -#define AVA_AVND_SUBPART_VER_MAX 2 +#define AVA_AVND_SUBPART_VER_MAX 3 /***************************************************************************** Function to fill the MDS message structure @@ -101,6 +101,8 @@ uint32_t ava_mds_cbk(NCSMDS_CALLBACK_INFO*); uint32_t ava_mds_send(struct ava_cb_tag*, AVSV_NDA_AVA_MSG*, AVSV_NDA_AVA_MSG**); +void osafAmfSCStatusChangeCallback_invoke(OsafAmfSCStatusT state); + #ifdef __cplusplus } #endif diff --git a/src/amf/agent/ava_op.cc b/src/amf/agent/ava_op.cc index c150b9f..e493955 100644 --- a/src/amf/agent/ava_op.cc +++ b/src/amf/agent/ava_op.cc @@ -83,6 +83,11 @@ uint32_t ava_avnd_msg_prc(AVA_CB *cb, AVSV_NDA_AVA_MSG *msg) { } } + if (cbk_info->type == AVSV_AMF_SC_STATUS_CHANGE) { + TRACE("SCs Status:%u",cbk_info->param.sc_status_change.sc_status); + osafAmfSCStatusChangeCallback_invoke(cbk_info->param.sc_status_change.sc_status); + goto done; + } /* retrieve the handle record */ hdl = cbk_info->hdl; hdl_rec = (AVA_HDL_REC *)ncshm_take_hdl(NCS_SERVICE_ID_AVA, hdl); diff --git a/src/amf/amfnd/avnd_mds.h b/src/amf/amfnd/avnd_mds.h index 70173ac..1f9753c 100644 --- a/src/amf/amfnd/avnd_mds.h +++ b/src/amf/amfnd/avnd_mds.h @@ -41,7 +41,7 @@ #define AVND_AVND_SUBPART_VER_MAX 1 #define AVND_AVA_SUBPART_VER_MIN 1 -#define AVND_AVA_SUBPART_VER_MAX 2 +#define AVND_AVA_SUBPART_VER_MAX 3 #define AVND_CLA_SUBPART_VER_MIN 1 #define AVND_CLA_SUBPART_VER_MAX 1 diff --git a/src/amf/amfnd/di.cc b/src/amf/amfnd/di.cc index 6f0a76c..07b9b2e 100644 --- a/src/amf/amfnd/di.cc +++ b/src/amf/amfnd/di.cc @@ -516,6 +516,37 @@ done: TRACE_LEAVE(); } +/* + * @brief Sends message to AMFA about SCs Absence and Presence. + * @param [in] status + */ +void avnd_send_sc_status_message(OsafAmfSCStatusT status) { + TRACE_ENTER(); + uint32_t rc = NCSCC_RC_SUCCESS; + AVND_MSG msg; + MDS_DEST mds_dest = 0; + memset(&msg, 0, sizeof(AVND_MSG)); + + for (auto& it: agent_mds_ver_db) { + if (it.second < AVSV_AVND_AVA_MSG_FMT_VER_3) { + TRACE("AMFA does not support the callback"); + continue; + } + msg.info.ava = + static_cast<AVSV_NDA_AVA_MSG *>(calloc(1, sizeof(AVSV_NDA_AVA_MSG))); + msg.type = AVND_MSG_AVA; + msg.info.ava->type = AVSV_AVND_AMF_CBK_MSG; + msg.info.ava->info.cbk_info = static_cast<AVSV_AMF_CBK_INFO*>(calloc(1, sizeof(AVSV_AMF_CBK_INFO))); + msg.info.ava->info.cbk_info->param.sc_status_change.sc_status = status; + msg.info.ava->info.cbk_info->type = AVSV_AMF_SC_STATUS_CHANGE; + mds_dest = it.first; + rc = avnd_mds_send(avnd_cb, &msg, &mds_dest, 0); + if (rc != NCSCC_RC_SUCCESS) + LOG_WA("Message failed to dest"); [GL] typo above? + avnd_msg_content_free(avnd_cb, &msg); + } + TRACE_LEAVE(); +} /**************************************************************************** Name : avnd_evt_mds_avd_up @@ -600,11 +631,13 @@ uint32_t avnd_evt_mds_avd_up_evh(AVND_CB *cb, AVND_EVT *evt) { avnd_send_node_up_msg(); } cb->is_avd_down = false; + + //Inform AMFA about SCs presence now. + avnd_send_sc_status_message(OSAF_AMF_SC_PRESENT); } if (m_AVND_TMR_IS_ACTIVE(cb->sc_absence_tmr)) avnd_stop_tmr(cb, &cb->sc_absence_tmr); - done: TRACE_LEAVE(); return NCSCC_RC_SUCCESS; @@ -739,6 +772,10 @@ uint32_t avnd_evt_mds_avd_dn_evh(AVND_CB *cb, AVND_EVT *evt) { // reset msg_id counter cb->rcv_msg_id = 0; cb->snd_msg_id = 0; + + //Inform AMFA about SCs absence now. + avnd_send_sc_status_message(OSAF_AMF_SC_ABSENT); + TRACE_LEAVE(); return rc; } diff --git a/src/amf/amfnd/mds.cc b/src/amf/amfnd/mds.cc index 6ef1239..1ee24cf 100644 --- a/src/amf/amfnd/mds.cc +++ b/src/amf/amfnd/mds.cc @@ -58,7 +58,8 @@ const MDS_CLIENT_MSG_FORMAT_VER avnd_avnd_msg_fmt_map_table[] = { AVSV_AVND_AVND_MSG_FMT_VER_1}; const MDS_CLIENT_MSG_FORMAT_VER avnd_ava_msg_fmt_map_table[] = { - AVSV_AVND_AVA_MSG_FMT_VER_1, AVSV_AVND_AVA_MSG_FMT_VER_2}; + AVSV_AVND_AVA_MSG_FMT_VER_1, AVSV_AVND_AVA_MSG_FMT_VER_2, + AVSV_AVND_AVA_MSG_FMT_VER_3}; /* static function declarations */ @@ -1034,6 +1035,8 @@ uint32_t avnd_mds_flat_ava_enc(AVND_CB *cb, MDS_CALLBACK_ENC_INFO *enc_info) { &cbk_info->param.pxied_comp_clean.comp_name); } break; + case AVSV_AMF_SC_STATUS_CHANGE: + break; default: osafassert(0); diff --git a/src/amf/common/amf_amfparam.h b/src/amf/common/amf_amfparam.h index e18d3fe..a46b297 100644 --- a/src/amf/common/amf_amfparam.h +++ b/src/amf/common/amf_amfparam.h @@ -65,6 +65,7 @@ typedef enum avsv_amf_cbk_type { AVSV_AMF_PXIED_COMP_INST, AVSV_AMF_PXIED_COMP_CLEAN, AVSV_AMF_CSI_ATTR_CHANGE, + AVSV_AMF_SC_STATUS_CHANGE, AVSV_AMF_CBK_MAX } AVSV_AMF_CBK_TYPE; @@ -252,6 +253,11 @@ typedef struct avsv_amf_csi_attr_change_param_tag { SaAmfCSIAttributeListT csiAttr; /* contains the csi-attr list SAF compliant*/ } AVSV_AMF_CSI_ATTR_CHANGE_PARAM; +//SC status change callback msg structure from AMFND to AMF agent. +typedef struct avsv_amf_sc_status_param_tag { + OsafAmfSCStatusT sc_status; +} AVSV_AMF_SC_STATUS_CHANGE_PARAM; + /* csi remove */ typedef struct avsv_amf_csi_rem_param_tag { SaNameT comp_name; /* comp name */ @@ -291,6 +297,7 @@ typedef struct avsv_amf_cbk_info_tag { AVSV_AMF_PXIED_COMP_INST_PARAM pxied_comp_inst; AVSV_AMF_PXIED_COMP_CLEAN_PARAM pxied_comp_clean; AVSV_AMF_CSI_ATTR_CHANGE_PARAM csi_attr_change; + AVSV_AMF_SC_STATUS_CHANGE_PARAM sc_status_change; } param; } AVSV_AMF_CBK_INFO; diff --git a/src/amf/common/amf_n2avamsg.h b/src/amf/common/amf_n2avamsg.h index 80ebc84..738966b 100644 --- a/src/amf/common/amf_n2avamsg.h +++ b/src/amf/common/amf_n2avamsg.h @@ -41,6 +41,7 @@ extern "C" { /* Message format versions */ #define AVSV_AVND_AVA_MSG_FMT_VER_1 1 #define AVSV_AVND_AVA_MSG_FMT_VER_2 2 +#define AVSV_AVND_AVA_MSG_FMT_VER_3 3 /* AMF API enums */ typedef enum avsv_nda_ava_msg_type { diff --git a/src/amf/saf/libSaAmf.map b/src/amf/saf/libSaAmf.map index cac34ce..dfb6a16 100644 --- a/src/amf/saf/libSaAmf.map +++ b/src/amf/saf/libSaAmf.map @@ -5,6 +5,7 @@ saAis*; saAmf*; ava_install_amf_down_cb; # FIXME ava* should be local-only + osafAmfInstallSCStatusChangeCallback; local: *; diff --git a/src/amf/saf/saAmf_B_04_02.h b/src/amf/saf/saAmf_B_04_02.h index b083031..28ec3fc 100644 --- a/src/amf/saf/saAmf_B_04_02.h +++ b/src/amf/saf/saAmf_B_04_02.h @@ -59,6 +59,14 @@ saAmfInitialize_o4( const SaAmfCallbacksT_o4 *amfCallbacks, SaVersionT *version); +typedef enum { + OSAF_AMF_SC_PRESENT = 1, + OSAF_AMF_SC_ABSENT = 2, +} OsafAmfSCStatusT; + +extern void osafAmfInstallSCStatusChangeCallback( + void (*OsafAmfSCStatusChangeCallbackT)(OsafAmfSCStatusT status)); + #ifdef __cplusplus } #endif -- 1.9.1 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel