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. case 2: Create nodegroup (PL4 + PL5) with LOCKED, lock nodegroup, delay quiesced csi cbk, stop SC, restart SC. case 3: Create nodegroup (PL4 + PL5) with LOCKED, lock PL5, lock nodegroup, delay quiesced csi cbk, stop SC, restart SC.
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; hans.nordeb...@ericsson.com; Praveen Malviya; >>>>>>>> gary....@dektech.com.au; long.hb.ngu...@dektech.com.au >>>>>>>> Cc: opensaf-devel@lists.sourceforge.net >>>>>>>> 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; hans.nordeb...@ericsson.com; Praveen Malviya; >>>>>>>>> gary....@dektech.com.au; long.hb.ngu...@dektech.com.au >>>>>>>>> Cc: opensaf-devel@lists.sourceforge.net >>>>>>>>> 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; hans.nordeb...@ericsson.com; Praveen Malviya; >>>>>>>>>> gary....@dektech.com.au; long.hb.ngu...@dektech.com.au >>>>>>>>>> Cc: opensaf-devel@lists.sourceforge.net >>>>>>>>>> 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:minh.c...@dektech.com.au] >>>>>>>>>>> Sent: 05 August 2016 02:50 >>>>>>>>>>> To: hans.nordeb...@ericsson.com; Nagendra Kumar; Praveen >>>>>>>>>>> Malviya; >>>>>>>>>>> gary....@dektech.com.au; long.hb.ngu...@dektech.com.au; >>>>>>>>>>> minh.c...@dektech.com.au >>>>>>>>>>> Cc: opensaf-devel@lists.sourceforge.net >>>>>>>>>>> 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 >>>>>>>>>> Opensaf-devel@lists.sourceforge.net >>>>>>>>>> https://lists.sourceforge.net/lists/listinfo/opensaf-devel >>>>>>>>> ---------------------------------------------------------------------- >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> -------- _______________________________________________ >>>>>>>>> Opensaf-devel mailing list >>>>>>>>> Opensaf-devel@lists.sourceforge.net >>>>>>>>> https://lists.sourceforge.net/lists/listinfo/opensaf-devel >>>>>>>> ------------------------------------------------------------------------------ >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> _______________________________________________ >>>>>>>> Opensaf-devel mailing list >>>>>>>> Opensaf-devel@lists.sourceforge.net >>>>>>>> https://lists.sourceforge.net/lists/listinfo/opensaf-devel >>>>>> >>>>> >>>> >>> >> > ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel