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.

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