I think currently the callback is called in the context of the agent MDS thread? This could introduce threading issues to an application as they normally expect callbacks to be executed in the thread calling Dispatch().
On 28/6/17, 5:16 pm, "Gary Lee" <[email protected]> wrote: Hi Praveen Is it possible to make the callback to be triggered from saAmfDispatch()? Thanks Gary On 28/6/17, 5:06 pm, "Gary Lee" <[email protected]> wrote: 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" <[email protected]> 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 [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel ------------------------------------------------------------------------------ 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 [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel
