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

Reply via email to