Hi Minh,

Please find one query below.

Thanks,
Praveen

On 05-Sep-16 5:07 AM, minh chau wrote:
> Hi Praveen,
>
> I think in all cases we need to restore @admin_ng, that can tell whether
> an admin operation on ng was executing. Also, we need to restore
> ng_using_saAmfSGAdminState in case 2N borrows SaAmfSGAdminState for
> nodegroup. If we can restore exactly what was happening before headless,
> then the operation continuation should work. However, there's still the
> cases like:
> case 1: Create nodegroup (PL4 + PL5) with LOCKED, lock PL5, lock PL4,
> delay quiesced csi cbk, stop SC, restart SC.
[Praveen] I think this case is already discussed.
> case 2: Create nodegroup (PL4 + PL5) with LOCKED, lock nodegroup, delay
> quiesced csi cbk, stop SC, restart SC.
[Praveen] Here NG is created in locked state already then lock of 
nodegroup can performed.
> case 3: Create nodegroup (PL4 + PL5) with LOCKED, lock PL5, lock
> nodegroup, delay quiesced csi cbk, stop SC, restart SC.
[Praveen] Here also NG is being created in locked state then lock of NG 
cannot be performed.
>
> Case 1 and 2 has been cleared out previously, case 1 and 3 leave all
> states the same: SG_SU_OPER, node: LOCKED, ng: LOCKED. But if AMF views
> case 3 in the shape of case 1, then nodegroup operation continuation
> also works fine. I have sent out the patch for reivew, please check.
>
> Thanks,
> Minh
>
> On 01/09/16 18:11, praveen malviya wrote:
>> Hi Minh,
>> Please see response inline with [Praveen]
>>
>> Thanks,
>> Praveen
>>
>>
>> On 31-Aug-16 11:19 AM, minh chau wrote:
>>> Hi Praveen
>>>
>>> I think @admin_ng needs to be restore as well as
>>> @ng_using_saAmfSGAdminState, since just found that @admin_ng check is
>>> required in avd_node_down_appl_susi_failover(), which happens if node
>>> having pending csi callback reboot.
>> [Praveen] Inside avd_node_down_appl_susi_failover(), reason of calling
>> process_su_si_response_for_ng() in non-headless case is :
>> -If this happens to be the last node in the nodegroup where node group
>> operation was going on, then migrate node/NG from SHUTTING_DOWN to
>> locked,clear ng_using_saAmfSGAdminState and respond to IMM because we
>> will not get any su_si_assign() event to trigger it agian.
>> -Even if this is not the last node, then also this nodes should move
>> from SHUTTING_DOWN to locked state again because there will not be any
>> further trigger (when whole SG is mapped in NG).
>>
>> Can we think of a possibility of making it OR with
>> @ng_using_saAmfSGAdminState here also in
>> avd_node_down_appl_susi_failover() ?
>>
>> A)With this small fix in headless case: After headless if again some
>> node faults then AMFD will still be calling
>> process_su_si_response_for_ng() for whole SG mapped case.
>>
>> But what about other case when whole SG is not mapped.In this case
>> node_fail_su_oper() would have marked atleast node from SHUTTING_DOWN
>> to LOCKED state. Then how to mark NG from SHUTTING_DOWN to LOCKED
>> because admin_ng is NULL and ng_using_saAMFSGAdminState is not set for
>> this case. I think this can be done deductively using headless state
>> vairable and other facts like node->admin_node_pend_cbk.invocation and
>> ng->admin_ng_pend_cbk.admin_oper after headless to cross verify
>> whether this is really the context of admin operation before headless
>> or after headless. Based on this deduction, we need to mark node from
>> SHUTING_DON to LOCKED.
>>
>> b)With this small fix in non-headless case: There should not be any
>> impact because admin_ng is not NULL and AMFD was already making a call.
>>
>>
>> Thanks,
>> Praveen
>>> I will use SG_FSM_ADMIN to differentiate cases 1 and 2.
>>>
>>> Thanks,
>>> Minh
>>> On 29/08/16 16:25, praveen malviya wrote:
>>>> Hi Minh,
>>>>
>>>> Please see inline with [Praveen]
>>>>
>>>> Thanks,
>>>> Praveen
>>>>
>>>> On 29-Aug-16 5:57 AM, minh chau wrote:
>>>>> Hi Praveen,
>>>>>
>>>>> Thanks for looking through the patch.
>>>>> The potential problem of restoring nodegroup because nodegroup
>>>>> allows to
>>>>> be created in LOCKED while the SUs are having assignment, this could
>>>>> cause an ambiguity for AMFD after headless. For example:
>>>>> Suppose having SU4 hosted on PL4, SU5 hosted on PL5, SU4 has active
>>>>> assignment, SU5 has standby assignment.
>>>>> case 1: Create nodegroup (PL4 + PL5) with LOCKED, lock PL5, lock PL4,
>>>>> delay quiesced csi cbk, stop SC, restart SC.
>>>> [Praveen] In this case, after headless state SG fsm will not be in
>>>> SG_ADMIN state because payload are being locked one by one. So in this
>>>> case it is distinguishable that it is a not a NG operation case
>>>> as SG is not in SG_ADMIN state even though SG is fully assigned in NG.
>>>>> case 2: Create nodegroup (PL4 + PL5) with LOCKED, lock nodegroup,
>>>>> delay
>>>>> quiesced csi cbk, stop SC, restart SC.
>>>> [Praveen] In this case we have following information after headless
>>>> state:
>>>>     -SG is in SG_ADMIN state.
>>>>     -NG is in SHUTTING_DOWN or LOCKED state.
>>>>     -Nodes in SHUTTING_DOWN or LOCKED state.
>>>>     -SG FSM remains in SG_ADMIN state only in case of admin operation
>>>> on SG. But after headless SG is not found in UNLOCKED state and one NG
>>>> is found in LOCKED/SHUTTING down state and its nodes.
>>>> I think with above information, AMFD can set
>>>> @ng_using_saAmfSGAdminState and set SG admin state to SHUTTING_DOWN or
>>>> LOCKED. Restoring admin_ng is not required as in su_si_assign(), there
>>>> is an OR condition between @ng_using_saAmfSGAdminState and @admin_ng
>>>> for calling process_su_si_response_for_ng(). Also checks on admin_ng
>>>> is used only for updating counters related to completion of admin
>>>> opeations which is not required after headless.
>>>>
>>>>>
>>>>> if case 2 actually happened before headless, then @admin_ng and
>>>>> @ng_using_saAmfSGAdminState needs to be restored, otherwise
>>>>> process_su_si_response_for_ng() won't be called and saAmfSGAdminState
>>>>> remains LOCKED and SG is still not STABLE state.
>>>>>
>>>>> But in both cases, after headless, AMFD sees all PLs are LOCKED,
>>>>> nodegroup is LOCKED, SU4 has pending quiesced csi cbk, thus they are
>>>>> running into the same code flow. In case 1, @admin_ng and
>>>>> @ng_using_saAmfSGAdminState should not bet set since case1 was not
>>>>> nodegroup operation before headless.
>>>>> I have run a test of both cases, they are working with the patch
>>>>> attached in ticket, but it still looks a potential problem since all
>>>>> cases are not transparent to AMFD after headless, the @admin_ng and
>>>>> @ng_using_asAmfSGAdminState maybe get hit in some points in case 1
>>>> [Praveen] Besides above cases, there remains only one case: when
>>>> operation was initiated on NG and SG is partially mapped in NG. In
>>>> this case, after headless state we can get only two states of SG
>>>> either SU_OPER or SG_REALIGN. In both the cases I think we do not
>>>> require to restore  @ng_using_saAmfSGAdminState and @admin_ng because
>>>> we do not require to enter in process_su_si_response_for_ng().In
>>>> sg_2n_fsm, it marks Node from SHUTTING_DOWN to locked in
>>>> susi_success_su_oper().
>>>>
>>>> Have I missed any other case?
>>>>
>>>>>
>>>>> If case 1 looks ok to you from nodegroup point of view, then I will
>>>>> float the patch for review.
>>>>>
>>>>> Thanks,
>>>>> Minh
>>>>>
>>>>>
>>>>> On 26/08/16 16:08, praveen malviya wrote:
>>>>>> Hi,
>>>>>>
>>>>>> I have gone through amfd traces. Also patch for NG seems to be ok but
>>>>>> some minor can be done.
>>>>>>
>>>>>> As pointed by Minh, when whole SG is mapped in NG (say case a), AMFD
>>>>>> uses SG_ADMIN flow and SG admin state without exposing it to the user
>>>>>> through IMM for 2N model. In the other case when only one SU is
>>>>>> assigned in NG (say case b) there should not be any problem because
>>>>>> operation fully depends on NG admin state. Since other case b) does
>>>>>> not use SG admin state and ng_using_saAMfSGAdminState, it should work
>>>>>> fine.
>>>>>>
>>>>>> I think we can take the help of following facts and functions to
>>>>>> improve the patch and with that restoring ng_using_saAmfSGAdminState
>>>>>> from IMM may not be required:
>>>>>> 1)In normal cluster, if controller switchover/failover happens
>>>>>> when NG
>>>>>> operation is going on then standby controller continues admin
>>>>>> operation with information that it gets through CKPT updates in
>>>>>> dec_sg_admin_state() and dec_ng_admin_state(). Active controller
>>>>>> never
>>>>>> checkpoints ng_using_saAmfSGAdminState and deduce it in these
>>>>>> functions.The situation after headless is almost like that.
>>>>>>     I think, in case a when shutdown operation is going on, admin
>>>>>> state of NG is still SHUTTING_DOWN and system becomes headless,
>>>>>> requires more params and not the lock operation. In shutdown
>>>>>> operation, AMFD has to ensure transition of NG and Nodes to LOCKED
>>>>>> state.
>>>>>>
>>>>>> 2)Like controller fail-over/switch-over after headless also, we are
>>>>>> not bound to reply to IMM for admin operation completion. So we need
>>>>>> to analyse if we require to restore node->admin_ng. Half of the code
>>>>>> in process_su_si_response_for_ng() is for tracking the state of admin
>>>>>> operation so that AMFD replies to IMM for admin operation and this is
>>>>>> not required after headless state.
>>>>>>
>>>>>> I think problem is not that much complex as it is valid for only 2N
>>>>>> models and only in case a).
>>>>>>
>>>>>> Thanks,
>>>>>> Praveen
>>>>>>
>>>>>> On 25-Aug-16 6:38 PM, minh chau wrote:
>>>>>>> Hi,
>>>>>>>
>>>>>>> The test failed because two reasons:
>>>>>>> 1. There are two places that nodegroup operation borrows 2N SG FSM,
>>>>>>> but
>>>>>>> the AdminState of SG is not stored to IMM
>>>>>>>     saAmfSGAdminState = ng->saAmfNGAdminState;
>>>>>>>     ...
>>>>>>>     su->sg_of_su->saAmfSGAdminState = SA_AMF_ADMIN_UNLOCKED;
>>>>>>>
>>>>>>> This setting needs to be called by AVD_SG::set_admin_state()
>>>>>>>
>>>>>>> 2. After receives su_si assignment response after headless,
>>>>>>> @admin_ng,
>>>>>>> @ng_using_saAmfSGAdminState have not been restored.
>>>>>>> They need to be restored by somehow. Since nodegroup allows to be
>>>>>>> created at any adminState. So there should be the case nodegroup's
>>>>>>> AdminState is created with LOCKED but the belonging SUs are still
>>>>>>> having
>>>>>>> assignment, so adminState of nodegroup can't be used.
>>>>>>> The admin_ng, ng_using_saAmfSGAdminState seem need to be stored to
>>>>>>> IMM?
>>>>>>> @Praveen: any suggestions?
>>>>>>>
>>>>>>>         } else if ((su->sg_of_su->sg_ncs_spec == false) &&
>>>>>>> ((su->su_on_node->admin_ng != nullptr) ||
>>>>>>> (su->sg_of_su->ng_using_saAmfSGAdminState == true))) {
>>>>>>>             AVD_AMF_NG *ng = su->su_on_node->admin_ng;
>>>>>>>             //Got response from AMFND for assignments decrement
>>>>>>> su_cnt_admin_oper.
>>>>>>>             if ((ng != nullptr) &&
>>>>>>>                 (((((ng->admin_ng_pend_cbk.admin_oper ==
>>>>>>> SA_AMF_ADMIN_SHUTDOWN) ||
>>>>>>>                 (ng->admin_ng_pend_cbk.admin_oper ==
>>>>>>> SA_AMF_ADMIN_LOCK)) &&
>>>>>>>                 (su->saAmfSUNumCurrActiveSIs == 0) &&
>>>>>>> (su->saAmfSUNumCurrStandbySIs == 0) &&
>>>>>>>                 (AVSV_SUSI_ACT_DEL ==
>>>>>>> n2d_msg->msg_info.n2d_su_si_assign.msg_act))) ||
>>>>>>>                     (ng->admin_ng_pend_cbk.admin_oper ==
>>>>>>> SA_AMF_ADMIN_UNLOCK))) {
>>>>>>> su->su_on_node->su_cnt_admin_oper--;
>>>>>>>                 TRACE("node:'%s', su_cnt_admin_oper:%u",
>>>>>>> su->su_on_node->name.c_str(),su->su_on_node->su_cnt_admin_oper);
>>>>>>>             }
>>>>>>>             process_su_si_response_for_ng(su, SA_AIS_OK);
>>>>>>>
>>>>>>> On 25/08/16 21:36, Nagendra Kumar wrote:
>>>>>>>> Further testing results:
>>>>>>>> Node group lock has resulted in SG unstable. Logs and configuration
>>>>>>>> file attached.
>>>>>>>>
>>>>>>>> Configuration : SC-1, PL-3 and PL-4.
>>>>>>>>
>>>>>>>> Steps:
>>>>>>>>
>>>>>>>> 1. Unlock SU1(on PL-3), SU2 and SU3 (Both on PL-4).
>>>>>>>> 2. Create node group of PL-3 and PL-4:
>>>>>>>> 3. Lock the node group.
>>>>>>>> amf-adm lock safAmfNodeGroup=nagu,safAmfCluster=myAmfCluster
>>>>>>>> 4. Keep gdb in csi set callback, stop SC-1 and start respond OK
>>>>>>>> from
>>>>>>>> csi set callback and start SC-1.
>>>>>>>>
>>>>>>>> SG becomes unstable if you try to unlock the Node group:
>>>>>>>> Aug 25 16:57:06 PM_SC-1 osafamfd[2166]: NO
>>>>>>>> 'safSg=AmfDemo_2N,safApp=AmfDemo1' is in unstable/transition state
>>>>>>>>
>>>>>>>>
>>>>>>>> Thanks
>>>>>>>> -Nagu
>>>>>>>>
>>>>>>>>> -----Original Message-----
>>>>>>>>> From: Nagendra Kumar
>>>>>>>>> Sent: 24 August 2016 16:58
>>>>>>>>> To: Minh Hon Chau; [email protected]; Praveen Malviya;
>>>>>>>>> [email protected]; [email protected]
>>>>>>>>> Cc: [email protected]
>>>>>>>>> Subject: Re: [devel] [PATCH 2 of 2] AMFND: Admin operation
>>>>>>>>> continuation if
>>>>>>>>> csi callback completes during headless [#1725 part 1] V1
>>>>>>>>>
>>>>>>>>> The below is the assignments after the test case (SU2 has standby
>>>>>>>>> assignment):
>>>>>>>>>
>>>>>>>>> PM_SC-1:/home/nagu/views/staging-1725 # /etc/init.d/opensafd
>>>>>>>>> status
>>>>>>>>> safSISU=safSu=SU2\,safSg=AmfDemo_2N\,safApp=AmfDemo1,safSi=AmfDe
>>>>>>>>> mo1,safApp=AmfDemo1
>>>>>>>>>          saAmfSISUHAState=STANDBY(2)
>>>>>>>>> safSISU=safSu=PL-
>>>>>>>>> 3\,safSg=NoRed\,safApp=OpenSAF,safSi=NoRed3,safApp=OpenSAF
>>>>>>>>>          saAmfSISUHAState=ACTIVE(1)
>>>>>>>>> safSISU=safSu=PL-
>>>>>>>>> 4\,safSg=NoRed\,safApp=OpenSAF,safSi=NoRed2,safApp=OpenSAF
>>>>>>>>>          saAmfSISUHAState=ACTIVE(1)
>>>>>>>>> safSISU=safSu=SC-
>>>>>>>>> 2\,safSg=NoRed\,safApp=OpenSAF,safSi=NoRed4,safApp=OpenSAF
>>>>>>>>>          saAmfSISUHAState=ACTIVE(1)
>>>>>>>>> safSISU=safSu=SC-
>>>>>>>>> 1\,safSg=NoRed\,safApp=OpenSAF,safSi=NoRed1,safApp=OpenSAF
>>>>>>>>>          saAmfSISUHAState=ACTIVE(1)
>>>>>>>>> safSISU=safSu=SC-2\,safSg=2N\,safApp=OpenSAF,safSi=SC-
>>>>>>>>> 2N,safApp=OpenSAF
>>>>>>>>>          saAmfSISUHAState=STANDBY(2)
>>>>>>>>> safSISU=safSu=SC-1\,safSg=2N\,safApp=OpenSAF,safSi=SC-
>>>>>>>>> 2N,safApp=OpenSAF
>>>>>>>>>          saAmfSISUHAState=ACTIVE(1)
>>>>>>>>>
>>>>>>>>> Thanks
>>>>>>>>> -Nagu
>>>>>>>>>
>>>>>>>>>> -----Original Message-----
>>>>>>>>>> From: Nagendra Kumar
>>>>>>>>>> Sent: 24 August 2016 16:55
>>>>>>>>>> To: Minh Hon Chau; [email protected]; Praveen Malviya;
>>>>>>>>>> [email protected]; [email protected]
>>>>>>>>>> Cc: [email protected]
>>>>>>>>>> Subject: Re: [devel] [PATCH 2 of 2] AMFND: Admin operation
>>>>>>>>>> continuation if csi callback completes during headless [#1725
>>>>>>>>>> part 1]
>>>>>>>>>> V1
>>>>>>>>>>
>>>>>>>>>> Hi Minh,
>>>>>>>>>>     With 1725_phase_1_V2.tgz, the below email TC has failed.
>>>>>>>>>> Please
>>>>>>>>> find
>>>>>>>>>> the traces attached along with the configuration in the ticket.
>>>>>>>>>>
>>>>>>>>>> Thanks
>>>>>>>>>> -Nagu
>>>>>>>>>>
>>>>>>>>>>> -----Original Message-----
>>>>>>>>>>> From: Nagendra Kumar
>>>>>>>>>>> Sent: 23 August 2016 15:15
>>>>>>>>>>> To: Minh Hon Chau; [email protected]; Praveen Malviya;
>>>>>>>>>>> [email protected]; [email protected]
>>>>>>>>>>> Cc: [email protected]
>>>>>>>>>>> Subject: Re: [devel] [PATCH 2 of 2] AMFND: Admin operation
>>>>>>>>>>> continuation if csi callback completes during headless [#1725
>>>>>>>>>>> part
>>>>>>>>>>> 1]
>>>>>>>>>>> V1
>>>>>>>>>>>
>>>>>>>>>>> Hi Minh,
>>>>>>>>>>>     The following SU lock case is not working. This issue will
>>>>>>>>>>> exist
>>>>>>>>>>> for all the flows, so please check.
>>>>>>>>>>>
>>>>>>>>>>> Configuration and traces attached in the ticket.
>>>>>>>>>>>
>>>>>>>>>>> Steps:
>>>>>>>>>>> 1. Start SC-1, SC-2, PL-3 and PL-4. Run the following command:
>>>>>>>>>>> immcfg -f  /tmp/AppConfig-2N-1725.xml amf-adm unlock-in
>>>>>>>>>>> safSu=SU1,safSg=AmfDemo_2N,safApp=AmfDemo1
>>>>>>>>>>> amf-adm unlock-in safSu=SU2,safSg=AmfDemo_2N,safApp=AmfDemo1
>>>>>>>>>>> amf-adm unlock-in safSu=SU3,safSg=AmfDemo_2N,safApp=AmfDemo1
>>>>>>>>>>> amf-adm unlock safSu=SU1,safSg=AmfDemo_2N,safApp=AmfDemo1
>>>>>>>>>>> amf-adm unlock safSu=SU2,safSg=AmfDemo_2N,safApp=AmfDemo1
>>>>>>>>>>> amf-adm unlock safSu=SU3,safSg=AmfDemo_2N,safApp=AmfDemo1
>>>>>>>>>>>
>>>>>>>>>>> Assignments are:
>>>>>>>>>>> PM_SC-1:/home/nagu/views/staging-1725 # /etc/init.d/opensafd
>>>>>>>>>>> status
>>>>>>>>>>> safSISU=safSu=SC-
>>>>>>>>>>> 1\,safSg=NoRed\,safApp=OpenSAF,safSi=NoRed1,safApp=OpenSAF
>>>>>>>>>>>          saAmfSISUHAState=ACTIVE(1)
>>>>>>>>>>> safSISU=safSu=SC-1\,safSg=2N\,safApp=OpenSAF,safSi=SC-
>>>>>>>>>>> 2N,safApp=OpenSAF
>>>>>>>>>>>          saAmfSISUHAState=ACTIVE(1)
>>>>>>>>>>> safSISU=safSu=SC-
>>>>>>>>>>> 2\,safSg=NoRed\,safApp=OpenSAF,safSi=NoRed2,safApp=OpenSAF
>>>>>>>>>>>          saAmfSISUHAState=ACTIVE(1)
>>>>>>>>>>> safSISU=safSu=SC-2\,safSg=2N\,safApp=OpenSAF,safSi=SC-
>>>>>>>>>>> 2N,safApp=OpenSAF
>>>>>>>>>>>          saAmfSISUHAState=STANDBY(2)
>>>>>>>>>>> safSISU=safSu=PL-
>>>>>>>>>>> 4\,safSg=NoRed\,safApp=OpenSAF,safSi=NoRed3,safApp=OpenSAF
>>>>>>>>>>>          saAmfSISUHAState=ACTIVE(1)
>>>>>>>>>>> safSISU=safSu=PL-
>>>>>>>>>>> 3\,safSg=NoRed\,safApp=OpenSAF,safSi=NoRed4,safApp=OpenSAF
>>>>>>>>>>>          saAmfSISUHAState=ACTIVE(1)
>>>>>>>>>>>
>>>>>>>>> safSISU=safSu=SU2\,safSg=AmfDemo_2N\,safApp=AmfDemo1,safSi=AmfDe
>>>>>>>>>>> mo1,safApp=AmfDemo1
>>>>>>>>>>>          saAmfSISUHAState=STANDBY(2)
>>>>>>>>>>>
>>>>>>>>> safSISU=safSu=SU1\,safSg=AmfDemo_2N\,safApp=AmfDemo1,safSi=AmfDe
>>>>>>>>>>> mo1,safApp=AmfDemo1
>>>>>>>>>>>          saAmfSISUHAState=ACTIVE(1)
>>>>>>>>>>>
>>>>>>>>>>> 2. Issue lock on SU1.
>>>>>>>>>>> amf-adm lock safSu=SU1,safSg=AmfDemo_2N,safApp=AmfDemo1
>>>>>>>>>>> And keep gdb in csi_set callback. Stop SC-1 and SC-2.
>>>>>>>>>>> Send Ok from csi_set callback.
>>>>>>>>>>>
>>>>>>>>>>> 3. Start SC-1 and SC-2.
>>>>>>>>>>>
>>>>>>>>>>> 4. Assignment to components of SU2 is not given and
>>>>>>>>>>> assignments of
>>>>>>>>>>> SU2 still shows Standby.
>>>>>>>>>>> PM_SC-1:/home/nagu/views/staging-1725 # /etc/init.d/opensafd
>>>>>>>>>>> status
>>>>>>>>>>>
>>>>>>>>> safSISU=safSu=SU2\,safSg=AmfDemo_2N\,safApp=AmfDemo1,safSi=AmfDe
>>>>>>>>>>> mo1,safApp=AmfDemo1
>>>>>>>>>>>          saAmfSISUHAState=STANDBY(2)
>>>>>>>>>>> safSISU=safSu=SC-2\,safSg=2N\,safApp=OpenSAF,safSi=SC-
>>>>>>>>>>> 2N,safApp=OpenSAF
>>>>>>>>>>>          saAmfSISUHAState=STANDBY(2)
>>>>>>>>>>> safSISU=safSu=SC-
>>>>>>>>>>> 1\,safSg=NoRed\,safApp=OpenSAF,safSi=NoRed1,safApp=OpenSAF
>>>>>>>>>>>          saAmfSISUHAState=ACTIVE(1)
>>>>>>>>>>> safSISU=safSu=PL-
>>>>>>>>>>> 4\,safSg=NoRed\,safApp=OpenSAF,safSi=NoRed3,safApp=OpenSAF
>>>>>>>>>>>          saAmfSISUHAState=ACTIVE(1)
>>>>>>>>>>> safSISU=safSu=PL-
>>>>>>>>>>> 3\,safSg=NoRed\,safApp=OpenSAF,safSi=NoRed2,safApp=OpenSAF
>>>>>>>>>>>          saAmfSISUHAState=ACTIVE(1)
>>>>>>>>>>> safSISU=safSu=SC-
>>>>>>>>>>> 2\,safSg=NoRed\,safApp=OpenSAF,safSi=NoRed4,safApp=OpenSAF
>>>>>>>>>>>          saAmfSISUHAState=ACTIVE(1)
>>>>>>>>>>> safSISU=safSu=SC-1\,safSg=2N\,safApp=OpenSAF,safSi=SC-
>>>>>>>>>>> 2N,safApp=OpenSAF
>>>>>>>>>>>          saAmfSISUHAState=ACTIVE(1)
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Thanks
>>>>>>>>>>> -Nagu
>>>>>>>>>>>
>>>>>>>>>>>> -----Original Message-----
>>>>>>>>>>>> From: Minh Hon Chau [mailto:[email protected]]
>>>>>>>>>>>> Sent: 05 August 2016 02:50
>>>>>>>>>>>> To: [email protected]; Nagendra Kumar; Praveen
>>>>>>>>>>>> Malviya;
>>>>>>>>>>>> [email protected]; [email protected];
>>>>>>>>>>>> [email protected]
>>>>>>>>>>>> Cc: [email protected]
>>>>>>>>>>>> Subject: [PATCH 2 of 2] AMFND: Admin operation continuation if
>>>>>>>>>>>> csi
>>>>>>>>>>> callback
>>>>>>>>>>>> completes during headless [#1725 part 1] V1
>>>>>>>>>>>>
>>>>>>>>>>>> osaf/services/saf/amf/amfnd/di.cc | 199
>>>>>>>>>>>> +++++++++++++++++-
>>>>>>>>> ---
>>>>>>>>>> --
>>>>>>>>>>> --
>>>>>>>>>>>> osaf/services/saf/amf/amfnd/include/avnd_di.h |    1 +
>>>>>>>>>>>>   2 files changed, 134 insertions(+), 66 deletions(-)
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> The patch buffers susi_resp_msg during headless stage and
>>>>>>>>>>>> resend
>>>>>>>>>>>> it to AMFD after headless.
>>>>>>>>>>>>
>>>>>>>>>>>> diff --git a/osaf/services/saf/amf/amfnd/di.cc
>>>>>>>>>>>> b/osaf/services/saf/amf/amfnd/di.cc
>>>>>>>>>>>> --- a/osaf/services/saf/amf/amfnd/di.cc
>>>>>>>>>>>> +++ b/osaf/services/saf/amf/amfnd/di.cc
>>>>>>>>>>>> @@ -804,11 +804,6 @@ uint32_t avnd_di_susi_resp_send(AVND_CB
>>>>>>>>>>>>       if (cb->term_state ==
>>>>>>>>>>>> AVND_TERM_STATE_OPENSAF_SHUTDOWN_STARTED)
>>>>>>>>>>>>           return rc;
>>>>>>>>>>>>
>>>>>>>>>>>> -    if (cb->is_avd_down == true) {
>>>>>>>>>>>> -        m_AVND_SU_ALL_SI_RESET(su);
>>>>>>>>>>>> -        return rc;
>>>>>>>>>>>> -    }
>>>>>>>>>>>> -
>>>>>>>>>>>>       // should be in assignment pending state to be here
>>>>>>>>>>>> osafassert(m_AVND_SU_IS_ASSIGN_PEND(su));
>>>>>>>>>>>>
>>>>>>>>>>>> @@ -819,64 +814,76 @@ uint32_t avnd_di_susi_resp_send(AVND_CB
>>>>>>>>>>>>       TRACE_ENTER2("Sending Resp su=%s, si=%s, curr_state=%u,
>>>>>>>>>>>> prv_state=%u", su->name.value, curr_si->name.value,curr_si-
>>>>>>>>>>>>> curr_state,curr_si->prv_state);
>>>>>>>>>>>>       /* populate the susi resp msg */
>>>>>>>>>>>>       msg.info.avd = new AVSV_DND_MSG();
>>>>>>>>>>>> -        msg.type = AVND_MSG_AVD;
>>>>>>>>>>>> -        msg.info.avd->msg_type =
>>>>>>>>>>>> AVSV_N2D_INFO_SU_SI_ASSIGN_MSG;
>>>>>>>>>>>> - msg.info.avd->msg_info.n2d_su_si_assign.msg_id = ++(cb-
>>>>>>>>>>>>> snd_msg_id);
>>>>>>>>>>>> - msg.info.avd->msg_info.n2d_su_si_assign.node_id = cb-
>>>>>>>>>>>>> node_info.nodeId;
>>>>>>>>>>>> -        if (si) {
>>>>>>>>>>>> - msg.info.avd->msg_info.n2d_su_si_assign.single_csi =
>>>>>>>>>>>> - ((si->single_csi_add_rem_in_si ==
>>>>>>>>>>>> AVSV_SUSI_ACT_BASE)
>>>>>>>>> ?
>>>>>>>>>>>> false : true);
>>>>>>>>>>>> -        }
>>>>>>>>>>>> -        TRACE("curr_assign_state '%u'",
>>>>>>>>>>>> curr_si->curr_assign_state);
>>>>>>>>>>>> - msg.info.avd->msg_info.n2d_su_si_assign.msg_act =
>>>>>>>>>>>> - (m_AVND_SU_SI_CURR_ASSIGN_STATE_IS_ASSIGNED(curr_si)
>>>>>>>>>> ||
>>>>>>>>>>>> -
>>>>>>>>> m_AVND_SU_SI_CURR_ASSIGN_STATE_IS_ASSIGNING(curr_si))
>>>>>>>>>> ?
>>>>>>>>>>>> - ((!curr_si->prv_state) ? AVSV_SUSI_ACT_ASGN :
>>>>>>>>>>>> AVSV_SUSI_ACT_MOD) : AVSV_SUSI_ACT_DEL;
>>>>>>>>>>>> - msg.info.avd->msg_info.n2d_su_si_assign.su_name = su->name;
>>>>>>>>>>>> -        if (si) {
>>>>>>>>>>>> - msg.info.avd->msg_info.n2d_su_si_assign.si_name =
>>>>>>>>>>>> si-
>>>>>>>>>> name;
>>>>>>>>>>>> -                if (AVSV_SUSI_ACT_ASGN ==
>>>>>>>>>>>> si->single_csi_add_rem_in_si) {
>>>>>>>>>>>> - TRACE("si->curr_assign_state '%u'", curr_si-
>>>>>>>>>>>>> curr_assign_state);
>>>>>>>>>>>> -
>>>>>>>>>>>> msg.info.avd->msg_info.n2d_su_si_assign.msg_act =
>>>>>>>>>>>> -
>>>>>>>>>>>> (m_AVND_SU_SI_CURR_ASSIGN_STATE_IS_ASSIGNED(curr_si) ||
>>>>>>>>>>>> -
>>>>>>>>>>>> m_AVND_SU_SI_CURR_ASSIGN_STATE_IS_ASSIGNING(curr_si)) ?
>>>>>>>>>>>> - AVSV_SUSI_ACT_ASGN :
>>>>>>>>>>>> AVSV_SUSI_ACT_DEL;
>>>>>>>>>>>> -                }
>>>>>>>>>>>> -        }
>>>>>>>>>>>> - msg.info.avd->msg_info.n2d_su_si_assign.ha_state =
>>>>>>>>>>>> -                (SA_AMF_HA_QUIESCING == curr_si->curr_state) ?
>>>>>>>>>>>> SA_AMF_HA_QUIESCED : curr_si->curr_state;
>>>>>>>>>>>> - msg.info.avd->msg_info.n2d_su_si_assign.error =
>>>>>>>>>>>> - (m_AVND_SU_SI_CURR_ASSIGN_STATE_IS_ASSIGNED(curr_si)
>>>>>>>>>> ||
>>>>>>>>>>>> -
>>>>>>>>> m_AVND_SU_SI_CURR_ASSIGN_STATE_IS_REMOVED(curr_si))
>>>>>>>>>> ?
>>>>>>>>>>>> NCSCC_RC_SUCCESS : NCSCC_RC_FAILURE;
>>>>>>>>>>>> +    msg.type = AVND_MSG_AVD;
>>>>>>>>>>>> +    msg.info.avd->msg_type = AVSV_N2D_INFO_SU_SI_ASSIGN_MSG;
>>>>>>>>>>>> + msg.info.avd->msg_info.n2d_su_si_assign.node_id = cb-
>>>>>>>>>>>>> node_info.nodeId;
>>>>>>>>>>>> +    if (si) {
>>>>>>>>>>>> + msg.info.avd->msg_info.n2d_su_si_assign.single_csi =
>>>>>>>>>>>> + ((si->single_csi_add_rem_in_si ==
>>>>>>>>>>>> AVSV_SUSI_ACT_BASE) ? false : true);
>>>>>>>>>>>> +    }
>>>>>>>>>>>> +    TRACE("curr_assign_state '%u'",
>>>>>>>>>>>> curr_si->curr_assign_state);
>>>>>>>>>>>> + msg.info.avd->msg_info.n2d_su_si_assign.msg_act =
>>>>>>>>>>>> +
>>>>>>>>>>>> (m_AVND_SU_SI_CURR_ASSIGN_STATE_IS_ASSIGNED(curr_si) ||
>>>>>>>>>>>> +
>>>>>>>>>>>> m_AVND_SU_SI_CURR_ASSIGN_STATE_IS_ASSIGNING(curr_si)) ?
>>>>>>>>>>>> +                ((!curr_si->prv_state) ?
>>>>>>>>>>>> AVSV_SUSI_ACT_ASGN : AVSV_SUSI_ACT_MOD) : AVSV_SUSI_ACT_DEL;
>>>>>>>>>>>> + msg.info.avd->msg_info.n2d_su_si_assign.su_name = su->name;
>>>>>>>>>>>> +    if (si) {
>>>>>>>>>>>> + msg.info.avd->msg_info.n2d_su_si_assign.si_name = si-
>>>>>>>>>>>>> name;
>>>>>>>>>>>> +        if (AVSV_SUSI_ACT_ASGN ==
>>>>>>>>>>>> si->single_csi_add_rem_in_si) {
>>>>>>>>>>>> +            TRACE("si->curr_assign_state '%u'", curr_si-
>>>>>>>>>>>>> curr_assign_state);
>>>>>>>>>>>> +                msg.info.avd-
>>>>>>>>>>>>> msg_info.n2d_su_si_assign.msg_act =
>>>>>>>>>>>> +
>>>>>>>>>>>> (m_AVND_SU_SI_CURR_ASSIGN_STATE_IS_ASSIGNED(curr_si) ||
>>>>>>>>>>>> +
>>>>>>>>>>>> m_AVND_SU_SI_CURR_ASSIGN_STATE_IS_ASSIGNING(curr_si)) ?
>>>>>>>>>>>> +                    AVSV_SUSI_ACT_ASGN :
>>>>>>>>>>>> AVSV_SUSI_ACT_DEL;
>>>>>>>>>>>> +        }
>>>>>>>>>>>> +    }
>>>>>>>>>>>> + msg.info.avd->msg_info.n2d_su_si_assign.ha_state =
>>>>>>>>>>>> +            (SA_AMF_HA_QUIESCING == curr_si->curr_state) ?
>>>>>>>>>>>> SA_AMF_HA_QUIESCED : curr_si->curr_state;
>>>>>>>>>>>> + msg.info.avd->msg_info.n2d_su_si_assign.error =
>>>>>>>>>>>> +
>>>>>>>>>>>> (m_AVND_SU_SI_CURR_ASSIGN_STATE_IS_ASSIGNED(curr_si) ||
>>>>>>>>>>>> +
>>>>>>>>>>>> m_AVND_SU_SI_CURR_ASSIGN_STATE_IS_REMOVED(curr_si)) ?
>>>>>>>>>>>> +NCSCC_RC_SUCCESS : NCSCC_RC_FAILURE;
>>>>>>>>>>>>
>>>>>>>>>>>> -        if (msg.info.avd->msg_info.n2d_su_si_assign.msg_act ==
>>>>>>>>>>>> AVSV_SUSI_ACT_ASGN)
>>>>>>>>>>>> -                osafassert(si);
>>>>>>>>>>>> +    if (msg.info.avd->msg_info.n2d_su_si_assign.msg_act ==
>>>>>>>>>>>> AVSV_SUSI_ACT_ASGN)
>>>>>>>>>>>> +        osafassert(si);
>>>>>>>>>>>>
>>>>>>>>>>>> -        /* send the msg to AvD */
>>>>>>>>>>>> -        TRACE("Sending. msg_id'%u', node_id'%u', msg_act'%u',
>>>>>>>>>>>> su'%s',
>>>>>>>>>>> si'%s',
>>>>>>>>>>>> ha_state'%u', error'%u', single_csi'%u'",
>>>>>>>>>>>> - msg.info.avd->msg_info.n2d_su_si_assign.msg_id,
>>>>>>>>>> msg.info.avd-
>>>>>>>>>>>>> msg_info.n2d_su_si_assign.node_id,
>>>>>>>>>>>> - msg.info.avd->msg_info.n2d_su_si_assign.msg_act,
>>>>>>>>>>> msg.info.avd-
>>>>>>>>>>>>> msg_info.n2d_su_si_assign.su_name.value,
>>>>>>>>>>>> - msg.info.avd->msg_info.n2d_su_si_assign.si_name.value,
>>>>>>>>>>>> msg.info.avd->msg_info.n2d_su_si_assign.ha_state,
>>>>>>>>>>>> - msg.info.avd->msg_info.n2d_su_si_assign.error,
>>>>>>>>> msg.info.avd-
>>>>>>>>>>>>> msg_info.n2d_su_si_assign.single_csi);
>>>>>>>>>>>> +    /* send the msg to AvD */
>>>>>>>>>>>> +    TRACE("Sending. msg_id'%u', node_id'%u', msg_act'%u',
>>>>>>>>>>>> su'%s',
>>>>>>>>>>>> si'%s', ha_state'%u', error'%u', single_csi'%u'",
>>>>>>>>>>>> + msg.info.avd->msg_info.n2d_su_si_assign.msg_id,
>>>>>>>>>>>> msg.info.avd->msg_info.n2d_su_si_assign.node_id,
>>>>>>>>>>>> + msg.info.avd->msg_info.n2d_su_si_assign.msg_act,
>>>>>>>>>>>> msg.info.avd->msg_info.n2d_su_si_assign.su_name.value,
>>>>>>>>>>>> + msg.info.avd->msg_info.n2d_su_si_assign.si_name.value,
>>>>>>>>>>>> msg.info.avd->msg_info.n2d_su_si_assign.ha_state,
>>>>>>>>>>>> + msg.info.avd->msg_info.n2d_su_si_assign.error,
>>>>>>>>>>>> +msg.info.avd->msg_info.n2d_su_si_assign.single_csi);
>>>>>>>>>>>>
>>>>>>>>>>>> -        if ((su->si_list.n_nodes > 1) && (si == nullptr)) {
>>>>>>>>>>>> -                if
>>>>>>>>>>>> (msg.info.avd->msg_info.n2d_su_si_assign.msg_act ==
>>>>>>>>>>>> AVSV_SUSI_ACT_DEL)
>>>>>>>>>>>> -                        LOG_NO("Removed 'all SIs' from '%s'",
>>>>>>>>>>>> su->name.value);
>>>>>>>>>>>> +    if ((su->si_list.n_nodes > 1) && (si == nullptr)) {
>>>>>>>>>>>> +        if (msg.info.avd->msg_info.n2d_su_si_assign.msg_act ==
>>>>>>>>>>>> AVSV_SUSI_ACT_DEL)
>>>>>>>>>>>> +            LOG_NO("Removed 'all SIs' from '%s'", su-
>>>>>>>>>>>>> name.value);
>>>>>>>>>>>> -                if
>>>>>>>>>>>> (msg.info.avd->msg_info.n2d_su_si_assign.msg_act ==
>>>>>>>>>>>> AVSV_SUSI_ACT_MOD)
>>>>>>>>>>>> -                        LOG_NO("Assigned 'all SIs' %s of
>>>>>>>>>>>> '%s'",
>>>>>>>>>>>> - ha_state[msg.info.avd-
>>>>>>>>>>>>> msg_info.n2d_su_si_assign.ha_state],
>>>>>>>>>>>> - su->name.value);
>>>>>>>>>>>> -        }
>>>>>>>>>>>> +        if (msg.info.avd->msg_info.n2d_su_si_assign.msg_act ==
>>>>>>>>>>>> AVSV_SUSI_ACT_MOD)
>>>>>>>>>>>> +            LOG_NO("Assigned 'all SIs' %s of '%s'",
>>>>>>>>>>>> +                    ha_state[msg.info.avd-
>>>>>>>>>>>>> msg_info.n2d_su_si_assign.ha_state],
>>>>>>>>>>>> +                    su->name.value);
>>>>>>>>>>>> +    }
>>>>>>>>>>>>
>>>>>>>>>>>> -        rc = avnd_di_msg_send(cb, &msg);
>>>>>>>>>>>> -        if (NCSCC_RC_SUCCESS == rc)
>>>>>>>>>>>> -                msg.info.avd = 0;
>>>>>>>>>>>> -
>>>>>>>>>>>> -        /* we have completed the SU SI msg processing */
>>>>>>>>>>>> -        if (su_assign_state_is_stable(su))
>>>>>>>>>>>> - m_AVND_SU_ASSIGN_PEND_RESET(su);
>>>>>>>>>>>> -        m_AVND_SU_ALL_SI_RESET(su);
>>>>>>>>>>>> +    if (cb->is_avd_down == true) {
>>>>>>>>>>>> +        // We are in headless, buffer this msg
>>>>>>>>>>>> + msg.info.avd->msg_info.n2d_su_si_assign.msg_id = 0;
>>>>>>>>>>>> +        if (avnd_diq_rec_add(cb, &msg) == nullptr) {
>>>>>>>>>>>> +            rc = NCSCC_RC_FAILURE;
>>>>>>>>>>>> +        }
>>>>>>>>>>>> +        m_AVND_SU_ALL_SI_RESET(su);
>>>>>>>>>>>> +        LOG_NO("avnd_di_susi_resp_send() deferred as AMF
>>>>>>>>>>>> director is offline");
>>>>>>>>>>>> +    } else {
>>>>>>>>>>>> +        // We are in normal cluster, send msg to director
>>>>>>>>>>>> + msg.info.avd->msg_info.n2d_su_si_assign.msg_id = ++(cb-
>>>>>>>>>>>>> snd_msg_id);
>>>>>>>>>>>> +        /* send the msg to AvD */
>>>>>>>>>>>> +        rc = avnd_di_msg_send(cb, &msg);
>>>>>>>>>>>> +        if (NCSCC_RC_SUCCESS == rc)
>>>>>>>>>>>> +            msg.info.avd = 0;
>>>>>>>>>>>> +        /* we have completed the SU SI msg processing */
>>>>>>>>>>>> +        if (su_assign_state_is_stable(su)) {
>>>>>>>>>>>> +            m_AVND_SU_ASSIGN_PEND_RESET(su);
>>>>>>>>>>>> +        }
>>>>>>>>>>>> +        m_AVND_SU_ALL_SI_RESET(su);
>>>>>>>>>>>> +    }
>>>>>>>>>>>>
>>>>>>>>>>>>       /* free the contents of avnd message */
>>>>>>>>>>>>       avnd_msg_content_free(cb, &msg); @@ -1255,14 +1262,7 @@
>>>>>>>>>>>> void
>>>>>>>>>>>> avnd_diq_rec_del(AVND_CB *cb, AVND_
>>>>>>>>>>>>       /* stop the AvD msg response timer */
>>>>>>>>>>>>       if (m_AVND_TMR_IS_ACTIVE(rec->resp_tmr)) {
>>>>>>>>>>>>           m_AVND_TMR_MSG_RESP_STOP(cb, *rec);
>>>>>>>>>>>> -        // Resend msgs from queue because amfd dropped during
>>>>>>>>>>>> sync
>>>>>>>>>>>> -        if ((cb->dnd_list.head != nullptr)) {
>>>>>>>>>>>> -            TRACE("retransmit message to amfd");
>>>>>>>>>>>> -            AVND_DND_MSG_LIST *pending_rec = 0;
>>>>>>>>>>>> -            for (pending_rec = cb->dnd_list.head;
>>>>>>>>>>>> pending_rec !=
>>>>>>>>>>>> nullptr; pending_rec = pending_rec->next) {
>>>>>>>>>>>> -                avnd_diq_rec_send(cb, pending_rec);
>>>>>>>>>>>> -            }
>>>>>>>>>>>> -        }
>>>>>>>>>>>> +        avnd_diq_rec_send_buffered_msg(cb);
>>>>>>>>>>>>           /* resend pg start track */
>>>>>>>>>>>>           avnd_di_resend_pg_start_track(cb);
>>>>>>>>>>>>       }
>>>>>>>>>>>> @@ -1275,6 +1275,73 @@ void avnd_diq_rec_del(AVND_CB *cb,
>>>>>>>>> AVND_
>>>>>>>>>>>>       TRACE_LEAVE();
>>>>>>>>>>>>       return;
>>>>>>>>>>>>   }
>>>>>>>>>>>>
>>>>>>>>> +/************************************************************
>>>>>>>>>>>> ****************
>>>>>>>>>>>> +  Name          : avnd_diq_rec_send_buffered_msg
>>>>>>>>>>>> +
>>>>>>>>>>>> +  Description   : Resend buffered msg
>>>>>>>>>>>> +
>>>>>>>>>>>> +  Arguments     : cb  - ptr to the AvND control block
>>>>>>>>>>>> +
>>>>>>>>>>>> +  Return Values : None.
>>>>>>>>>>>> +
>>>>>>>>>>>> +  Notes         : None.
>>>>>>>>>>>>
>>>>>>>>> +*************************************************************
>>>>>>>>>>>> **********
>>>>>>>>>>>> +*******/ void avnd_diq_rec_send_buffered_msg(AVND_CB *cb) {
>>>>>>>>>>>> +    TRACE_ENTER();
>>>>>>>>>>>> +    // Resend msgs from queue because amfnd dropped during
>>>>>>>>>>>> headless
>>>>>>>>>>>> +    // or headless-synchronization
>>>>>>>>>>>> +    if ((cb->dnd_list.head != nullptr)) {
>>>>>>>>>>>> +        AVND_DND_MSG_LIST *pending_rec = 0;
>>>>>>>>>>>> +        TRACE("Attach msg_id of buffered msg");
>>>>>>>>>>>> +        bool found = true;
>>>>>>>>>>>> +        while (found) {
>>>>>>>>>>>> +            found = false;
>>>>>>>>>>>> +            for (pending_rec = cb->dnd_list.head;
>>>>>>>>>>>> pending_rec !=
>>>>>>>>>>>> nullptr; pending_rec = pending_rec->next) {
>>>>>>>>>>>> +                if (pending_rec->msg.type ==
>>>>>>>>>>>> AVND_MSG_AVD) {
>>>>>>>>>>>> +                    // At this moment, only oper_state
>>>>>>>>>>>> msg needs to report to director
>>>>>>>>>>>> +                    if (pending_rec->msg.info.avd-
>>>>>>>>>>>>> msg_type == AVSV_N2D_INFO_SU_SI_ASSIGN_MSG &&
>>>>>>>>>>>> + pending_rec->msg.info.avd-
>>>>>>>>>>>>> msg_info.n2d_su_si_assign.msg_id == 0) {
>>>>>>>>>>>> + m_AVND_DIQ_REC_POP(cb,
>>>>>>>>>>>> pending_rec); #if 0
>>>>>>>>>>>> +                        // only resend if this SUSI
>>>>>>>>>>>> does exist
>>>>>>>>>>>> +                        AVND_SU *su =
>>>>>>>>>>>> m_AVND_SUDB_REC_GET(cb->sudb,
>>>>>>>>>>>> +                                pending_rec-
>>>>>>>>>>>>> msg.info.avd->msg_info.n2d_su_si_assign.su_name);
>>>>>>>>>>>> +                        if (su != nullptr && su-
>>>>>>>>>>>>> si_list.n_nodes > 0) { #endif
>>>>>>>>>>>> +                            pending_rec-
>>>>>>>>>>>>> msg.info.avd->msg_info.n2d_su_si_assign.msg_id =
>>>>>>>>>>>>> ++(cb->snd_msg_id);
>>>>>>>>>>>> +
>>>>>>>>>>>>     m_AVND_DIQ_REC_PUSH(cb, pending_rec);
>>>>>>>>>>>> +                            LOG_NO("Found and
>>>>>>>>>>>> resend buffered su_si_assign msg for SU:'%s', "
>>>>>>>>>>>> +
>>>>>>>>>>>>     "SI:'%s', ha_state:'%u', msg_act:'%u', single_csi:'%u', "
>>>>>>>>>>>> +
>>>>>>>>>>>>     "error:'%u', msg_id:'%u'",
>>>>>>>>>>>> +
>>>>>>>>>>>>     pending_rec->msg.info.avd-
>>>>>>>>>>>>> msg_info.n2d_su_si_assign.su_name.value,
>>>>>>>>>>>> +
>>>>>>>>>>>>     pending_rec->msg.info.avd-
>>>>>>>>>>>>> msg_info.n2d_su_si_assign.si_name.value,
>>>>>>>>>>>> +
>>>>>>>>>>>> pending_rec->msg.info.avd->msg_info.n2d_su_si_assign.ha_state,
>>>>>>>>>>>> +
>>>>>>>>>>>> pending_rec->msg.info.avd->msg_info.n2d_su_si_assign.msg_act,
>>>>>>>>>>>> +
>>>>>>>>>>>> pending_rec->msg.info.avd->msg_info.n2d_su_si_assign.single_csi,
>>>>>>>>>>>>
>>>>>>>>>>>> +
>>>>>>>>>>>> pending_rec->msg.info.avd->msg_info.n2d_su_si_assign.error,
>>>>>>>>>>>> +
>>>>>>>>>>>> pending_rec->msg.info.avd->msg_info.n2d_su_si_assign.msg_id);
>>>>>>>>>>>> +
>>>>>>>>>>>> +#if 0
>>>>>>>>>>>> +                        } else {
>>>>>>>>>>>> +
>>>>>>>>>>>>     avnd_msg_content_free(cb, &pending_rec->msg);
>>>>>>>>>>>> +                            delete pending_rec;
>>>>>>>>>>>> +                            pending_rec = cb-
>>>>>>>>>>>>> dnd_list.head;
>>>>>>>>>>>> +                        }
>>>>>>>>>>>> +#endif
>>>>>>>>>>>> +                        found = true;
>>>>>>>>>>>> +                    }
>>>>>>>>>>>> +                }
>>>>>>>>>>>> +            }
>>>>>>>>>>>> +        }
>>>>>>>>>>>> +        TRACE("retransmit message to amfd");
>>>>>>>>>>>> +         for (pending_rec = cb->dnd_list.head; pending_rec !=
>>>>>>>>>>>> nullptr;
>>>>>>>>>>>> pending_rec = pending_rec->next) {
>>>>>>>>>>>> +             avnd_diq_rec_send(cb, pending_rec);
>>>>>>>>>>>> +         }
>>>>>>>>>>>> +    }
>>>>>>>>>>>> +    TRACE_LEAVE();
>>>>>>>>>>>> +    return;
>>>>>>>>>>>> +}
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>> /*************************************************************
>>>>>>>>>>>> ***************
>>>>>>>>>>>>     Name          : avnd_diq_rec_send
>>>>>>>>>>>> diff --git a/osaf/services/saf/amf/amfnd/include/avnd_di.h
>>>>>>>>>>>> b/osaf/services/saf/amf/amfnd/include/avnd_di.h
>>>>>>>>>>>> --- a/osaf/services/saf/amf/amfnd/include/avnd_di.h
>>>>>>>>>>>> +++ b/osaf/services/saf/amf/amfnd/include/avnd_di.h
>>>>>>>>>>>> @@ -79,6 +79,7 @@ void avnd_di_msg_ack_process(struct avnd
>>>>>>>>>>>> void
>>>>>>>>>>>> avnd_diq_del(struct avnd_cb_tag *); AVND_DND_MSG_LIST
>>>>>>>>>>>> *avnd_diq_rec_add(struct avnd_cb_tag *cb, AVND_MSG *msg);  void
>>>>>>>>>>>> avnd_diq_rec_del(struct avnd_cb_tag *cb, AVND_DND_MSG_LIST
>>>>>>>>> *rec);
>>>>>>>>>>>> +void avnd_diq_rec_send_buffered_msg(struct avnd_cb_tag *cb);
>>>>>>>>>>>>   uint32_t avnd_diq_rec_send(struct avnd_cb_tag *cb,
>>>>>>>>>>> AVND_DND_MSG_LIST
>>>>>>>>>>>> *rec);  uint32_t avnd_di_reg_su_rsp_snd(struct avnd_cb_tag *cb,
>>>>>>>>>>>> SaNameT *su_name, uint32_t ret_code); uint32_t
>>>>>>>>>>> avnd_di_ack_nack_msg_send(struct
>>>>>>>>>>>> avnd_cb_tag *cb, uint32_t rcv_id, uint32_t view_num);
>>>>>>>>>>> --------------------------------------------------------------------
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> --
>>>>>>>>>>> -------- _______________________________________________
>>>>>>>>>>> Opensaf-devel mailing list
>>>>>>>>>>> [email protected]
>>>>>>>>>>> https://lists.sourceforge.net/lists/listinfo/opensaf-devel
>>>>>>>>>> ----------------------------------------------------------------------
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> -------- _______________________________________________
>>>>>>>>>> Opensaf-devel mailing list
>>>>>>>>>> [email protected]
>>>>>>>>>> https://lists.sourceforge.net/lists/listinfo/opensaf-devel
>>>>>>>>> ------------------------------------------------------------------------------
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> Opensaf-devel mailing list
>>>>>>>>> [email protected]
>>>>>>>>> https://lists.sourceforge.net/lists/listinfo/opensaf-devel
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>
>

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

Reply via email to