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

Reply via email to