On 12-Sep-16 5:51 PM, minh chau wrote:
> Hi Praveen,
>
> You think this V1 patch (being floated for review) is the way AMFD
> should do for 5.2 (after GA), and for now 5.1 (this release) I should
> make a function to read osafAmfSGFsmState?
> I would like to confirm if I understand correctly.
>
I mean changes in V1 related to implementer set and config get can be 
done later (may be in 5,2)after considering not only nodegroup 
operations but other AMF features.

I have acked V2.

Thanks,
Praveen
> Thanks,
> Minh
>
> On 12/09/16 21:34, praveen malviya wrote:
>> Hi Minh,
>>
>> I did not go through the readme.
>> But I still think we should change it that way after GA release for
>> 5.2 and for 5.1 it should be read by writing a small function
>> (suggested by you in this mail) that would be called in the end on
>> existing avd initialization sequence.
>> If you agree, please send quickly updated patch.
>>
>> Thanks,
>> Praveen
>>
>> On 12-Sep-16 2:57 PM, minh chau wrote:
>>> Hi Praveen,
>>>
>>> This is whole text documented in IMM README
>>> "
>>> Cached RTAs show latest cached value when OI is transiently detached
>>> (4.6)
>>> ==========================================================================
>>>
>>> http://sourceforge.net/p/opensaf/tickets/1156
>>>
>>> OM clients performing a read (iteration or accessor-get) that fetches a
>>> cached
>>> runtime attribute, will not immediately see the attribute as empty
>>> when/if the
>>> OI detaches. Instead for a period of grace for 6 seconds, the latest set
>>> value is shown.
>>> This allows for failover or switchover or process restart of OI to occur
>>> without OM
>>> clients seeing the "glitch" in the value of the cached runtime
>>> attribute.
>>> "
>>>
>>> Cached RTA only can be shown to OM within 6 secs after OI detachs.
>>> In this case, AMFD has not attached OI so AMFD's OM can not read it.
>>>
>>> I have checked with Hung, it's not a bug.
>>>
>>> Thanks,
>>> Minh
>>>
>>> On 12/09/16 17:20, praveen malviya wrote:
>>>> Hi Minh,
>>>>
>>>> Please see response inline.
>>>>
>>>> Thanks,
>>>> Praveen
>>>>
>>>> On 12-Sep-16 6:10 AM, minh chau wrote:
>>>>> Hi Praveen,
>>>>>
>>>>> Please find my comments with [Minh]
>>>>>
>>>>> Thanks,
>>>>> Minh
>>>>>
>>>>> On 09/09/16 21:57, praveen malviya wrote:
>>>>>> Hi Minh,
>>>>>>
>>>>>> Please find inline.
>>>>>>
>>>>>> Thanks,
>>>>>> Praveen
>>>>>>
>>>>>> On 09-Sep-16 4:30 PM, minh chau wrote:
>>>>>>> Hi Praveen,
>>>>>>>
>>>>>>> Please see comment in line with [Minh]
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Minh
>>>>>>>
>>>>>>> On 09/09/16 17:06, praveen malviya wrote:
>>>>>>>> Hi Minh,
>>>>>>>>
>>>>>>>> I could not understand why AMF should become implementer/applier
>>>>>>>> earlier.
>>>>>>> [Minh]: We need to read osaAmfSGFsmState for differentiation of
>>>>>>> nodegroup operation while exploring SUSI assignment.
>>>>>>> osafAmfSGFsmState
>>>>>>> needs to be available before avd_susi_read_headless_cached_rta().
>>>>>>> avd_susi_read_headless_cached_rta() needs to be available before
>>>>>>> avd_sg_read_headless_cached_rta() for purpose of checking
>>>>>>> SUOperationList. So I think it's the best if we can retrieve
>>>>>>> osafAmfSGFsmState in avd_sg_config_get(). To read
>>>>>>> osafAmfSGFsmState as
>>>>>>> RTA, AMF needs to be implementer before reading RTA, otherwise the
>>>>>>> returned value from IMM is dummy (most of the time I got it as
>>>>>>> 0). If
>>>>>>> there's not simpler way to do, I would go for reading
>>>>>>> osafAmfSGFsmState
>>>>>>> in avd_sg_config_get(), but we also need to set applier for standby
>>>>>>> AMFD
>>>>>>> before avd_sg_config_get() to avoid issue in #1720.
>>>>>> [Praveen] For runtime non-cached attributes, IMM gives callback to
>>>>>> implementer to fetch the latest value. So if implementer is not set,
>>>>>> then a client like immlist may face a problem to get the latest
>>>>>> value.
>>>>>>
>>>>>> But osafAmfSGFsmState is a runtime cached attribute, IMM should
>>>>>> return
>>>>>> the value from its database.
>>>>>> Is it a bug or an IMM restriction that if implementer is not
>>>>>> registered then it will return dummy value?
>>>>> [Minh]: As far as I know, it's not a bug, IMM needs OI attached to
>>>>> fetch
>>>>>
>>>> cached rta
>>>> [Praveen] I just checked IMM PR doc and it supports it from 4.6.
>>>> 2.2.6.7 OpenSAF 4.6 Features:
>>>> b) Cached RTAs show latest cached value when OI is transiently detached
>>>>
>>>> Could you please check if there is some bug in IMM if it is not
>>>> providing the latest value of osafAmfSGFsmState.
>>>>>>
>>>>>>>> Anyways, please find one query below with [Praveen].
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Praveen
>>>>>>>>
>>>>>>>> On 05-Sep-16 7:13 AM, Minh Hon Chau wrote:
>>>>>>>>>  osaf/services/saf/amf/amfd/include/node.h |   3 +
>>>>>>>>>  osaf/services/saf/amf/amfd/include/sg.h   |   1 +
>>>>>>>>>  osaf/services/saf/amf/amfd/nodegroup.cc   |  83
>>>>>>>>> +++++++++++++++++++++++++++++++
>>>>>>>>>  osaf/services/saf/amf/amfd/role.cc        |  20 +++---
>>>>>>>>>  osaf/services/saf/amf/amfd/sg.cc          |  15 ++--
>>>>>>>>>  osaf/services/saf/amf/amfd/sgproc.cc      |   2 +-
>>>>>>>>>  osaf/services/saf/amf/amfd/siass.cc       |   4 +-
>>>>>>>>>  7 files changed, 109 insertions(+), 19 deletions(-)
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> The SG becomes unstable because some variables used in nodegroup
>>>>>>>>> operation are not
>>>>>>>>> restored after headless if this admin operation on nodegroup was
>>>>>>>>> interrupted just
>>>>>>>>> before cluster goes into headless stage.
>>>>>>>>>
>>>>>>>>> In order to restore nodegroup operation, AMF needs to know exactly
>>>>>>>>> whether nodegroup
>>>>>>>>> operation was running during headless up on @susi assignment. If
>>>>>>>>> susi
>>>>>>>>> is in QUIESCED,
>>>>>>>>> QUIESCING or being removed while its related entities su, si,
>>>>>>>>> sg are
>>>>>>>>> not in LOCKED
>>>>>>>>> and SHUTTING_DOWN, that means either node or nodegroup MUST be in
>>>>>>>>> LOCKED or SHUTTING
>>>>>>>>> DOWN. In case of SHUTTING_DOWN saAmfNGAdminState, that's enough to
>>>>>>>>> know a nodegroup
>>>>>>>>> operation was running. However, if saAmfNGAdminState is in LOCKED,
>>>>>>>>> this case is an
>>>>>>>>> ambiguity of locking a node. The reason of differentiation of
>>>>>>>>> locking
>>>>>>>>> a node or node
>>>>>>>>> group is because 2N SG uses both AVD_SG_FSM_SG_ADMIN and
>>>>>>>>> AVD_SG_FSM_SU_OPER for node
>>>>>>>>> group operation while AVD_SG_FSM_SU_OPER is only used for node
>>>>>>>>> operation. When 2N SG
>>>>>>>>> uses AVD_SG_FSM_SG_ADMIN for nodegroup, the saAmfSGAdminState is
>>>>>>>>> borrowed (but not
>>>>>>>>> updated to IMM) to run the admin operation sequence. Therefore,
>>>>>>>>> after
>>>>>>>>> headless if
>>>>>>>>> AVD_SG_FSM_SG_ADMIN was being used for nodegroup then
>>>>>>>>> saAmfSGAdminState also needs to
>>>>>>>>> be set.
>>>>>>>>>
>>>>>>>>> Because SG FSM state is used to restore nodegroup during restoring
>>>>>>>>> susi assignment,
>>>>>>>>> the osaAmfSGFsmState (RTA) needs to be read earlier than reading
>>>>>>>>> susi
>>>>>>>>> assignment. This
>>>>>>>>> needs active AMFD become implementer earlier than reading sg
>>>>>>>>> object.
>>>>>>>>> There was a known
>>>>>>>>> ticket reported in 1720, if only make active AMFD as early
>>>>>>>>> implementer than it will
>>>>>>>>> cause the standby AMFD missing ccb apply callback.This patch also
>>>>>>>>> needs to set both
>>>>>>>>> active and standby AMFD become implementer and applier earlier so
>>>>>>>>> that AMFD can read
>>>>>>>>> osaAmfSGFsmState and do not cause regression of 1720.
>>>>>>>>>
>>>>>>>>
>>>>>>>>> diff --git a/osaf/services/saf/amf/amfd/include/node.h
>>>>>>>>> b/osaf/services/saf/amf/amfd/include/node.h
>>>>>>>>> --- a/osaf/services/saf/amf/amfd/include/node.h
>>>>>>>>> +++ b/osaf/services/saf/amf/amfd/include/node.h
>>>>>>>>> @@ -45,6 +45,7 @@
>>>>>>>>>  #include <set>
>>>>>>>>>  #include <vector>
>>>>>>>>>  #include <string>
>>>>>>>>> +#include <susi.h>
>>>>>>>>>
>>>>>>>>>  class AVD_SU;
>>>>>>>>>  struct avd_cluster_tag;
>>>>>>>>> @@ -232,4 +233,6 @@ extern void ng_complete_admin_op(AVD_AMF
>>>>>>>>>  extern void avd_ng_admin_state_set(AVD_AMF_NG* ng,
>>>>>>>>> SaAmfAdminStateT
>>>>>>>>> state);
>>>>>>>>>  extern bool are_all_ngs_in_unlocked_state(const AVD_AVND *node);
>>>>>>>>>  extern bool any_ng_in_locked_in_state(const AVD_AVND *node);
>>>>>>>>> +void avd_ng_restore_headless_states(AVD_CL_CB *cb, struct
>>>>>>>>> avd_su_si_rel_tag* susi);
>>>>>>>>> +
>>>>>>>>>  #endif
>>>>>>>>> diff --git a/osaf/services/saf/amf/amfd/include/sg.h
>>>>>>>>> b/osaf/services/saf/amf/amfd/include/sg.h
>>>>>>>>> --- a/osaf/services/saf/amf/amfd/include/sg.h
>>>>>>>>> +++ b/osaf/services/saf/amf/amfd/include/sg.h
>>>>>>>>> @@ -46,6 +46,7 @@
>>>>>>>>>  class AVD_SU;
>>>>>>>>>  class AVD_SI;
>>>>>>>>>  class AVD_APP;
>>>>>>>>> +class AVD_AMF_NG;
>>>>>>>>>
>>>>>>>>>  /* The valid SG FSM states. */
>>>>>>>>>  typedef enum {
>>>>>>>>> diff --git a/osaf/services/saf/amf/amfd/nodegroup.cc
>>>>>>>>> b/osaf/services/saf/amf/amfd/nodegroup.cc
>>>>>>>>> --- a/osaf/services/saf/amf/amfd/nodegroup.cc
>>>>>>>>> +++ b/osaf/services/saf/amf/amfd/nodegroup.cc
>>>>>>>>> @@ -1356,3 +1356,86 @@ void avd_ng_constructor(void)
>>>>>>>>>              ng_ccb_apply_cb);
>>>>>>>>>  }
>>>>>>>>>
>>>>>>>>> +/*
>>>>>>>>> + * @brief: Restore nodegroup related variables which are used in
>>>>>>>>> nodegroup
>>>>>>>>> + *         operations before headless. The main variables are
>>>>>>>>> @admin_ng,
>>>>>>>>> + *         @ng_using_saAmfSGAdminState, and the saAmfSGAdminState
>>>>>>>>> which
>>>>>>>>> + *         is borrowed by nodegroup operation on 2N SG
>>>>>>>>> + * @param: control block, and susi is being read after headless
>>>>>>>>> + * @return: void
>>>>>>>>> + */
>>>>>>>>> +
>>>>>>>>> +void avd_ng_restore_headless_states(AVD_CL_CB *cb, struct
>>>>>>>>> avd_su_si_rel_tag* susi) {
>>>>>>>>> +
>>>>>>>>> +    TRACE_ENTER();
>>>>>>>>> +    osafassert(cb->scs_absence_max_duration > 0);
>>>>>>>>> +    // In order to restore nodegroup operation, AMF needs to know
>>>>>>>>> exactly
>>>>>>>>> +    // whether nodegroup operation was running during headless
>>>>>>>>> up on
>>>>>>>>> @susi
>>>>>>>>> +    // If susi is in QUIESCED/QUIESCING or being removed while
>>>>>>>>> its
>>>>>>>>> related
>>>>>>>>> +    // entities su, si, sg are not in LOCKED and SHUTTING_DOWN,
>>>>>>>>> that
>>>>>>>>> means
>>>>>>>>> +    // either node or nodegroup MUST be in LOCKED or
>>>>>>>>> SHUTTING_DOWN.
>>>>>>>>> +    // In case of SHUTTING_DOWN saAmfNGAdminState, that's
>>>>>>>>> enough to
>>>>>>>>> know
>>>>>>>>> +    // a nodegroup operation was running. However, if
>>>>>>>>> saAmfNGAdminState is
>>>>>>>>> +    // in LOCKED, this case is an ambiguity of locking a node.
>>>>>>>>> +    // The reason of differentiation of locking a node or
>>>>>>>>> nodegroup
>>>>>>>>> is because
>>>>>>>>> +    // 2N SG uses both AVD_SG_FSM_SG_ADMIN and AVD_SG_FSM_SU_OPER
>>>>>>>>> for nodegroup
>>>>>>>>> +    // operation while AVD_SG_FSM_SU_OPER is only used for node
>>>>>>>>> operation.
>>>>>>>>> +    // When 2N SG uses AVD_SG_FSM_SG_ADMIN for nodegroup, the
>>>>>>>>> saAmfSGAdminState
>>>>>>>>> +    // is borrowed (but not updated to IMM) to run the admin
>>>>>>>>> operation sequence.
>>>>>>>>> +    // Therefore, after headless if AVD_SG_FSM_SG_ADMIN was being
>>>>>>>>> used for nodegroup
>>>>>>>>> +    // then saAmfSGAdminState also needs to be set.
>>>>>>>>> +
>>>>>>>>> +    // Make sure su, si, sg are not in LOCKED, SHUTTING_DOWN
>>>>>>>>> +    if (susi->su->saAmfSUAdminState != SA_AMF_ADMIN_LOCKED &&
>>>>>>>>> +            susi->su->saAmfSUAdminState !=
>>>>>>>>> SA_AMF_ADMIN_SHUTTING_DOWN &&
>>>>>>>>> +            susi->si->saAmfSIAdminState != SA_AMF_ADMIN_LOCKED &&
>>>>>>>>> +            susi->si->saAmfSIAdminState !=
>>>>>>>>> SA_AMF_ADMIN_SHUTTING_DOWN &&
>>>>>>>>> + susi->su->sg_of_su->saAmfSGAdminState !=
>>>>>>>>> SA_AMF_ADMIN_LOCKED &&
>>>>>>>>> + susi->su->sg_of_su->saAmfSGAdminState !=
>>>>>>>>> SA_AMF_ADMIN_SHUTTING_DOWN) {
>>>>>>>>> +
>>>>>>>>> +        // susi are in state transition
>>>>>>>>> +        if (susi->state == SA_AMF_HA_QUIESCED || susi->state ==
>>>>>>>>> SA_AMF_HA_QUIESCING ||
>>>>>>>>> +                susi->fsm == AVD_SU_SI_STATE_UNASGN) {
>>>>>>>>> +
>>>>>>>>> +            for (std::map<std::string,
>>>>>>>>> AVD_AMF_NG*>::const_iterator
>>>>>>>>> it = nodegroup_db->begin();
>>>>>>>>> +                it != nodegroup_db->end(); it++) {
>>>>>>>>> +                AVD_AMF_NG *ng = it->second;
>>>>>>>>> +                for (std::set<std::string>::const_iterator iter =
>>>>>>>>> ng->saAmfNGNodeList.begin();
>>>>>>>>> +                        iter != ng->saAmfNGNodeList.end();
>>>>>>>>> ++iter) {
>>>>>>>>> +                    AVD_AVND *node = avd_node_get(*iter);
>>>>>>>>> +
>>>>>>>>> +                    if (susi->su->su_on_node == node) {
>>>>>>>>> +                        // Nodegroup was shutting down, also
>>>>>>>>> needs
>>>>>>>>> to check whether nodegroup
>>>>>>>>> +                        // operation was borrowing SG ADMIN FSM
>>>>>>>>> code
>>>>>>>>> (for 2N only)
>>>>>>>>> +                        if (ng->saAmfNGAdminState ==
>>>>>>>>> SA_AMF_ADMIN_SHUTTING_DOWN) {
>>>>>>>>> +                            node->admin_ng = ng;
>>>>>>>>> +                            if
>>>>>>>>> (susi->su->sg_of_su->sg_fsm_state ==
>>>>>>>>> AVD_SG_FSM_SG_ADMIN) {
>>>>>>>>> + osafassert(susi->su->sg_of_su->sg_redundancy_model ==
>>>>>>>>> SA_AMF_2N_REDUNDANCY_MODEL);
>>>>>>>>> + susi->su->sg_of_su->ng_using_saAmfSGAdminState = true;
>>>>>>>>> + susi->su->sg_of_su->saAmfSGAdminState = ng->saAmfNGAdminState;
>>>>>>>>> + m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(cb, susi->su->sg_of_su,
>>>>>>>>> AVSV_CKPT_SG_ADMIN_STATE);
>>>>>>>>> +                            }
>>>>>>>>> +                        }
>>>>>>>>> +                        // Node group was LOCKED, AMFD treat
>>>>>>>>> nodegroup and node operation in the same view,
>>>>>>>>> +                        // except nodegroup was borrowing SG
>>>>>>>>> ADMIN
>>>>>>>>> FSM. This is because the other case that
>>>>>>>>> +                        // nodegroup operation was only SG
>>>>>>>>> SU_OPER
>>>>>>>>> FSM, which is the same as of node operation
>>>>>>>>> +                        if (ng->saAmfNGAdminState ==
>>>>>>>>> SA_AMF_ADMIN_LOCKED) {
>>>>>>>>> + if(susi->su->sg_of_su->sg_fsm_state == AVD_SG_FSM_SG_ADMIN) {
>>>>>>>>> + osafassert(susi->su->sg_of_su->sg_redundancy_model ==
>>>>>>>>> SA_AMF_2N_REDUNDANCY_MODEL);
>>>>>>>>> +                                node->admin_ng = ng;
>>>>>>>>> + susi->su->sg_of_su->ng_using_saAmfSGAdminState = true;
>>>>>>>>> + susi->su->sg_of_su->saAmfSGAdminState = ng->saAmfNGAdminState;
>>>>>>>>> + m_AVSV_SEND_CKPT_UPDT_ASYNC_UPDT(cb, susi->su->sg_of_su,
>>>>>>>>> AVSV_CKPT_SG_ADMIN_STATE);
>>>>>>>>> +                            }
>>>>>>>>> +                        }
>>>>>>>>> +                        TRACE("Restore nodegroup operation,
>>>>>>>>> SG(%s),
>>>>>>>>> ng_using_saAmfSGAdminState: %u, saAmfSGAdminState:%u",
>>>>>>>>> + susi->su->sg_of_su->name.c_str(),
>>>>>>>>> susi->su->sg_of_su->ng_using_saAmfSGAdminState,
>>>>>>>>> + susi->su->sg_of_su->saAmfSGAdminState);
>>>>>>>>> +
>>>>>>>>> +                    }
>>>>>>>>> +                }
>>>>>>>>> +            }
>>>>>>>>> +        }
>>>>>>>>> +    }
>>>>>>>>> +    TRACE_LEAVE();
>>>>>>>>> +}
>>>>>>>>> diff --git a/osaf/services/saf/amf/amfd/role.cc
>>>>>>>>> b/osaf/services/saf/amf/amfd/role.cc
>>>>>>>>> --- a/osaf/services/saf/amf/amfd/role.cc
>>>>>>>>> +++ b/osaf/services/saf/amf/amfd/role.cc
>>>>>>>>> @@ -260,6 +260,11 @@ uint32_t avd_active_role_initialization(
>>>>>>>>>
>>>>>>>>>      TRACE_ENTER();
>>>>>>>>>
>>>>>>>>> +    if (avd_imm_impl_set() != SA_AIS_OK) {
>>>>>>>>> +        LOG_ER("avd_imm_impl_set FAILED");
>>>>>>>>> +        goto done;
>>>>>>>>> +    }
>>>>>>>>> +
>>>>>>>> [Praveen] I do not know whether IMM waits for full cluster start
>>>>>>>> up,
>>>>>>>> but both IMMD and IMMND comes before AMF.If AMF becomes implementer
>>>>>>>> before reading the objects, Will the CCB operations allowed by IMM?
>>>>>>> [Minh]: Before fixing #1720, active AMFD did set itself as
>>>>>>> implementer
>>>>>>> before reading config object, and active AMFD did get ccb
>>>>>>> callback (so
>>>>>>> ccb operations would be allowed by IMM?). The only problem at that
>>>>>>> time
>>>>>>> was at standby AMFD.
>>>>>>>> If IMM does not wait for full cluster startup (AMF bcoming ready)
>>>>>>>> then
>>>>>>>> it can lead to accumulation of CCB callbacks in AMF mailbox waiting
>>>>>>>> for Dispatch() being called from AMF.
>>>>>>>> Also what is the possibility that IMM will not reject CCBs when
>>>>>>>> implementer is slow to respond.
>>>>>>> [Minh]: I think setting implementer earlier turning out an advantage
>>>>>>> then. The reason is if reading config objects before setting
>>>>>>> implementer, and there are a large amount of objects to be read,
>>>>>>> it's
>>>>>>> not guarantee the objects AMFD is reading are always the latest. Ex:
>>>>>>> AMFD to read obj1, obj2, obj3. And at the time AMFD's reading
>>>>>>> obj3 and
>>>>>>> there's ccb that changes obj1.
>>>>>> [Praveen] But for any changing the value of objects or there
>>>>>> creation,
>>>>>> validation from implementer is required. Since AMFD has not become
>>>>>> implementer, IMM will reject such changes of obj1.
>>>>>> However, there is one case when IMM changes can be done without
>>>>>> implementer verification when A_IMM_CCB_REGISTERED_OI is not set. But
>>>>>> most of the time all changes goes through validation by implementer.
>>>>> [Minh]: Last week I tested this by adding some sleeps before amfd
>>>>> reads
>>>>> saAmfSGSuRestartMax. During the sleeps, issue imm command to change
>>>>> saAmfSGSuRestartMax, the command succeeded but the saAmfSGSuRestartMax
>>>>> read by amfd was not the latest (immlist then showed
>>>>> saAmfSGSuRestartMax
>>>>> as the latest).
>>>>> At this moment I don't see any issue if moving amfd becomes
>>>>> implementer/applier earlier, since initializing handle, set
>>>>> implementer,
>>>>> reading objects - all are done in one step in main thread. Anyways if
>>>>> you don't like this change I can abandon it and will make another
>>>>> function just to read osafAmfSGFsmState.
>>>>>>> But in the other way around, setting implementer before reading
>>>>>>> object,
>>>>>>> and the CCB should be rejected by timeout(?) if implementer (active
>>>>>>> AMFD) is too busy. Then user can try again after AMFD is free to
>>>>>>> respond
>>>>>>> ccb cbk. I think it should be working this way.
>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>>      if (avd_imm_config_get() != NCSCC_RC_SUCCESS) {
>>>>>>>>>          LOG_ER("avd_imm_config_get FAILED");
>>>>>>>>>          goto done;
>>>>>>>>> @@ -267,11 +272,6 @@ uint32_t avd_active_role_initialization(
>>>>>>>>>
>>>>>>>>>      cb->init_state = AVD_CFG_DONE;
>>>>>>>>>
>>>>>>>>> -    if (avd_imm_impl_set() != SA_AIS_OK) {
>>>>>>>>> -        LOG_ER("avd_imm_impl_set FAILED");
>>>>>>>>> -        goto done;
>>>>>>>>> -    }
>>>>>>>>> -
>>>>>>>>>      avd_imm_update_runtime_attrs();
>>>>>>>>>
>>>>>>>>>      status = NCSCC_RC_SUCCESS;
>>>>>>>>> @@ -294,6 +294,11 @@ uint32_t avd_standby_role_initialization
>>>>>>>>>
>>>>>>>>>      TRACE_ENTER();
>>>>>>>>>
>>>>>>>>> +    if (avd_imm_applier_set() != SA_AIS_OK) {
>>>>>>>>> +        LOG_ER("avd_imm_applier_set FAILED");
>>>>>>>>> +        goto done;
>>>>>>>>> +    }
>>>>>>>>> +
>>>>>>>>>      if (avd_imm_config_get() != NCSCC_RC_SUCCESS) {
>>>>>>>>>          LOG_ER("avd_imm_config_get FAILED");
>>>>>>>>>          goto done;
>>>>>>>>> @@ -301,11 +306,6 @@ uint32_t avd_standby_role_initialization
>>>>>>>>>
>>>>>>>>>      cb->init_state = AVD_CFG_DONE;
>>>>>>>>>
>>>>>>>>> -    if (avd_imm_applier_set() != SA_AIS_OK) {
>>>>>>>>> -        LOG_ER("avd_imm_applier_set FAILED");
>>>>>>>>> -        goto done;
>>>>>>>>> -    }
>>>>>>>>> -
>>>>>>>>>      status = NCSCC_RC_SUCCESS;
>>>>>>>>>  done:
>>>>>>>>>      TRACE_LEAVE();
>>>>>>>>> diff --git a/osaf/services/saf/amf/amfd/sg.cc
>>>>>>>>> b/osaf/services/saf/amf/amfd/sg.cc
>>>>>>>>> --- a/osaf/services/saf/amf/amfd/sg.cc
>>>>>>>>> +++ b/osaf/services/saf/amf/amfd/sg.cc
>>>>>>>>> @@ -374,6 +374,13 @@ static AVD_SG *sg_create(const std::stri
>>>>>>>>>      if
>>>>>>>>> (immutil_getAttr(const_cast<SaImmAttrNameT>("saAmfSGAdminState"),
>>>>>>>>> attributes, 0, &sg->saAmfSGAdminState) != SA_AIS_OK) {
>>>>>>>>>          sg->saAmfSGAdminState = SA_AMF_ADMIN_UNLOCKED;
>>>>>>>>>      }
>>>>>>>>> +    // only read SG FSM State for non-ncs SG
>>>>>>>>> +    if (sg_name.find("safApp=OpenSAF") == std::string::npos) {
>>>>>>>>> +        if
>>>>>>>>> (immutil_getAttr(const_cast<SaImmAttrNameT>("osafAmfSGFsmState"),
>>>>>>>>> attributes, 0, &sg->sg_fsm_state) != SA_AIS_OK) {
>>>>>>>>> +            sg->sg_fsm_state = AVD_SG_FSM_STABLE;
>>>>>>>>> +        }
>>>>>>>>> +        TRACE("sg_fsm_state(%u) read from osafAmfSGFsmState",
>>>>>>>>> sg->sg_fsm_state);
>>>>>>>>> +    }
>>>>>>>>>
>>>>>>>>>      /*  TODO use value in type instead? */
>>>>>>>>>      sg->sg_redundancy_model = sgt->saAmfSgtRedundancyModel;
>>>>>>>>> @@ -422,6 +429,7 @@ SaAisErrorT avd_sg_config_get(const std:
>>>>>>>>> const_cast<SaImmAttrNameT>("saAmfSGSuRestartProb"),
>>>>>>>>> const_cast<SaImmAttrNameT>("saAmfSGSuRestartMax"),
>>>>>>>>> const_cast<SaImmAttrNameT>("saAmfSGAdminState"),
>>>>>>>>> + const_cast<SaImmAttrNameT>("osafAmfSGFsmState"),
>>>>>>>>>          nullptr
>>>>>>>>>      };
>>>>>>>>>
>>>>>>>>> @@ -2094,10 +2102,8 @@ void avd_sg_read_headless_cached_rta(AVD
>>>>>>>>>      AVD_SG *sg;
>>>>>>>>>      unsigned int num_of_values = 0;
>>>>>>>>>      const SaImmAttrValuesT_2 **attributes;
>>>>>>>>> -    AVD_SG_FSM_STATE imm_sg_fsm_state;
>>>>>>>>>      const char *className = "SaAmfSG";
>>>>>>>>>      const SaImmAttrNameT searchAttributes[] = {
>>>>>>>>> - const_cast<SaImmAttrNameT>("osafAmfSGFsmState"),
>>>>>>>>> const_cast<SaImmAttrNameT>("osafAmfSGSuOperationList"),
>>>>>>>>>          NULL
>>>>>>>>>      };
>>>>>>>>> @@ -2122,11 +2128,6 @@ void avd_sg_read_headless_cached_rta(AVD
>>>>>>>>>                      (SaImmAttrValuesT_2 ***)&attributes)) ==
>>>>>>>>> SA_AIS_OK) {
>>>>>>>>>          sg = sg_db->find(Amf::to_string(&sg_dn));
>>>>>>>>>          if (sg && sg->sg_ncs_spec == false) {
>>>>>>>>> -            // Read sg fsm state
>>>>>>>>> -            rc =
>>>>>>>>> immutil_getAttr(const_cast<SaImmAttrNameT>("osafAmfSGFsmState"),
>>>>>>>>> -                    attributes, 0, &imm_sg_fsm_state);
>>>>>>>>> -            osafassert(rc == SA_AIS_OK);
>>>>>>>>> -            sg->set_fsm_state(imm_sg_fsm_state, false);
>>>>>>>>>              // Read sg operation list
>>>>>>>>>              if
>>>>>>>>> (immutil_getAttrValuesNumber(const_cast<SaImmAttrNameT>("osafAmfSGSuOperationList"),
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> attributes, &num_of_values) == SA_AIS_OK) {
>>>>>>>>>                  unsigned int i;
>>>>>>>>> diff --git a/osaf/services/saf/amf/amfd/sgproc.cc
>>>>>>>>> b/osaf/services/saf/amf/amfd/sgproc.cc
>>>>>>>>> --- a/osaf/services/saf/amf/amfd/sgproc.cc
>>>>>>>>> +++ b/osaf/services/saf/amf/amfd/sgproc.cc
>>>>>>>>> @@ -1112,7 +1112,7 @@ void avd_su_si_assign_evh(AVD_CL_CB *cb,
>>>>>>>>>          }
>>>>>>>>>
>>>>>>>>>          if (su->list_of_susi == AVD_SU_SI_REL_NULL) {
>>>>>>>>> -            LOG_ER("%s: no susis", __FUNCTION__);
>>>>>>>>> +            LOG_WA("%s: no susis", __FUNCTION__);
>>>>>>>>>              goto done;
>>>>>>>>>          }
>>>>>>>>>
>>>>>>>>> diff --git a/osaf/services/saf/amf/amfd/siass.cc
>>>>>>>>> b/osaf/services/saf/amf/amfd/siass.cc
>>>>>>>>> --- a/osaf/services/saf/amf/amfd/siass.cc
>>>>>>>>> +++ b/osaf/services/saf/amf/amfd/siass.cc
>>>>>>>>> @@ -261,7 +261,9 @@ void avd_susi_read_headless_cached_rta(A
>>>>>>>>>                          m_AVD_SET_SG_ADMIN_SI(cb, si);
>>>>>>>>>                  }
>>>>>>>>>              }
>>>>>>>>> -
>>>>>>>>> +            // only restore if not done
>>>>>>>>> +            if (susi->su->su_on_node->admin_ng == nullptr)
>>>>>>>>> +                avd_ng_restore_headless_states(cb, susi);
>>>>>>>>>          } else {
>>>>>>>>>              // This susi does not exist after headless, but it's
>>>>>>>>> still in IMM
>>>>>>>>>              // delete it for now
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>

------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to