Hi Praveen

Ack (review) + legacy tests run

Thanks
Gary

On 19/6/17, 7:23 pm, "Praveen" <praveen.malv...@oracle.com> wrote:

    In reported problem, active AMFD checkpointed admin state of node to
    standby AMFD, but it could not update it to IMM before leaving cluster.
    Since standby AMFD does not maintain Node attributes in IMM job queue, it 
also
    does not update it to IMM. Hence user does not see updated admin state of 
node.
    Currently standby AMFD maintains attributes of only SU, SI, CSI and comp in
    imm job queue.
    
    With this patch, standby AMFD will now maintain node attributes in imm job
    queue at standby. Now in failover situations, standby will update latest 
states
    of node in imm.
    ---
     src/amf/amfd/ckpt_dec.cc  |  6 ++++++
     src/amf/amfd/ckpt_updt.cc |  5 +++++
     src/amf/amfd/imm.cc       | 31 ++++++++++++++++++++++++++++++-
     src/amf/amfd/imm.h        |  1 +
     4 files changed, 42 insertions(+), 1 deletion(-)
    
    diff --git a/src/amf/amfd/ckpt_dec.cc b/src/amf/amfd/ckpt_dec.cc
    index 52150dd..9f3949a 100644
    --- a/src/amf/amfd/ckpt_dec.cc
    +++ b/src/amf/amfd/ckpt_dec.cc
    @@ -843,6 +843,9 @@ static uint32_t dec_node_admin_state(AVD_CL_CB *cb, 
NCS_MBCSV_CB_DEC *dec) {
     
       cb->async_updt_cnt.node_updt++;
     
    +  avd_saImmOiRtObjectUpdate(avnd_struct->name, "saAmfNodeAdminState",
    +                              SA_IMM_ATTR_SAUINT32T,
    +                              &avnd_struct->saAmfNodeAdminState);
       TRACE_LEAVE();
       return NCSCC_RC_SUCCESS;
     }
    @@ -886,6 +889,9 @@ static uint32_t dec_node_oper_state(AVD_CL_CB *cb, 
NCS_MBCSV_CB_DEC *dec) {
       avnd_struct->saAmfNodeOperState = avnd.saAmfNodeOperState;
     
       cb->async_updt_cnt.node_updt++;
    +  avd_saImmOiRtObjectUpdate(avnd_struct->name, "saAmfNodeOperState",
    +                            SA_IMM_ATTR_SAUINT32T,
    +                            &avnd_struct->saAmfNodeOperState);
     
       TRACE_LEAVE();
       return NCSCC_RC_SUCCESS;
    diff --git a/src/amf/amfd/ckpt_updt.cc b/src/amf/amfd/ckpt_updt.cc
    index 7a4a34b..471c687 100644
    --- a/src/amf/amfd/ckpt_updt.cc
    +++ b/src/amf/amfd/ckpt_updt.cc
    @@ -69,6 +69,11 @@ uint32_t avd_ckpt_node(AVD_CL_CB *cb, AVD_AVND 
*ckpt_node,
       if (nullptr == avd_node_find_nodeid(ckpt_node->node_info.nodeId))
         avd_node_add_nodeid(node);
     
    +  avd_saImmOiRtObjectUpdate(node->name, "saAmfNodeOperState",
    +                            SA_IMM_ATTR_SAUINT32T, 
&node->saAmfNodeOperState);
    +  avd_saImmOiRtObjectUpdate(node->name, "saAmfNodeAdminState",
    +                              SA_IMM_ATTR_SAUINT32T,
    +                              &node->saAmfNodeAdminState);
     done:
       TRACE_LEAVE2("%u", rc);
       return rc;
    diff --git a/src/amf/amfd/imm.cc b/src/amf/amfd/imm.cc
    index 7b1aa33..f524bfb 100644
    --- a/src/amf/amfd/imm.cc
    +++ b/src/amf/amfd/imm.cc
    @@ -1823,7 +1823,8 @@ bool check_to_create_immjob_at_standby_amfd(const 
std::string &dn) {
       if ((class_type == AVSV_SA_AMF_SU) || (class_type == AVSV_SA_AMF_COMP) ||
           (class_type == AVSV_SA_AMF_SI_ASSIGNMENT) ||
           (class_type == AVSV_SA_AMF_CSI_ASSIGNMENT) ||
    -      (class_type == AVSV_SA_AMF_SI) || (class_type == AVSV_SA_AMF_CSI)) {
    +      (class_type == AVSV_SA_AMF_SI) || (class_type == AVSV_SA_AMF_CSI) ||
    +      (class_type == AVSV_SA_AMF_NODE)) {
         TRACE("Class Type:%s", avd_class_names[class_type]);
         return true;
       }
    @@ -2537,6 +2538,32 @@ bool ImmObjUpdate::si_get_attr_value() {
       }
       return true;
     }
    +
    +bool ImmObjUpdate::node_get_attr_value() {
    +  bool ret = true;
    +  AVD_AVND *node = node_name_db->find(dn);
    +  if (node == nullptr) {
    +    TRACE_1("node not found");
    +    ret = false;
    +    goto done;
    +  }
    +  if (!strcmp(attributeName_, "saAmfNodeOperState")) {
    +    TRACE_1("saAmfNodeOperState old value:%u, new value:%u",
    +            *static_cast<SaAmfOperationalStateT *>(value_),
    +            node->saAmfNodeOperState);
    +    memcpy(value_, &node->saAmfNodeOperState, value_size(attrValueType_));
    +  } else if (!strcmp(attributeName_, "saAmfNodeAdminState")) {
    +    TRACE_1("saAmfNodeAdminState old value:%u, new value:%u",
    +            *static_cast<SaAmfAdminStateT *>(value_), 
node->saAmfNodeAdminState);
    +    memcpy(value_, &node->saAmfNodeAdminState, value_size(attrValueType_));
    +  } else {
    +    // Other attributes not considered.
    +    ret = false;
    +  }
    +done:
    +  return ret;
    +}
    +
     /**
      * @brief  Fetches latest value of attribute from AMF db before updating 
it in
      * IMM. Currently, only for SU, Comp, SI, SISU and CSICOMP.
    @@ -2558,6 +2585,8 @@ bool ImmObjUpdate::immobj_update_required() {
         ret = siass_get_attr_value();
       } else if (class_type == AVSV_SA_AMF_CSI_ASSIGNMENT) {
         ret = csiass_get_attr_value();
    +  } else if (class_type == AVSV_SA_AMF_NODE) {
    +    ret = node_get_attr_value();
       } else {
         TRACE_1("Class not considered");
         ret = false;
    diff --git a/src/amf/amfd/imm.h b/src/amf/amfd/imm.h
    index 535ee72..f0152ac 100644
    --- a/src/amf/amfd/imm.h
    +++ b/src/amf/amfd/imm.h
    @@ -107,6 +107,7 @@ class ImmObjUpdate : public ImmJob {
       bool csiass_get_attr_value();
       bool comp_get_attr_value();
       bool su_get_attr_value();
    +  bool node_get_attr_value();
     
       ~ImmObjUpdate();
     };
    -- 
    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