Hi Hans N,
Thanks for your comment and suggestion.
Thanks
-Nagu
> -----Original Message-----
> From: Hans Nordebäck [mailto:[email protected]]
> Sent: 21 March 2016 18:17
> To: Nagendra Kumar; Praveen Malviya; [email protected];
> [email protected]
> Cc: [email protected]
> Subject: Re: [PATCH 1 of 1] amfnd: process su instantiation in a separate
> thread [#517]
>
> Hi Nagu,
>
> ack, code review only. One comment, you can create a class e.g.
> ImmReader and add a header file imm.hh:
>
> class ImmReader {
> public:
> static void imm_reader_thread();
> static void imm_reader_thread_create();
> static void ir_process_event(AVND_EVT *evt);
> private:
>
> enum {
> FD_MBX = 0
> };
>
> static ir_cb_t ir_cb;
> static struct pollfd fds[FD_MBX + 1];
> static const nfds_t irfds {FD_MBX + 1};
>
> // disallow copy and assign, TODO(hafe) add common macro for this
> ImmReader(const ImmReader&);
> void operator=(const ImmReader&);
> };
>
> This class could also be made a singleton.
> And use c++ 11 thread support instead of pthreads, example below:
>
>
> /* -*- OpenSAF -*-
> *
> * (C) Copyright 2016 The OpenSAF Foundation
> *
> * This program is distributed in the hope that it will be useful, but
> * WITHOUT ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY
> * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are
> licensed
> * under the GNU Lesser General Public License Version 2.1, February 1999.
> * The complete license can be accessed from the following location:
> * http://opensource.org/licenses/lgpl-license.php
> * See the Copying file included with the OpenSAF distribution for full
> * licensing terms.
> *
> * Author(s): Oracle
> *
> */
>
> #include <thread>
> #include "avnd.h"
> #include <poll.h>
>
>
>
> struct pollfd ImmReader::fds[];
> extern const AVND_EVT_HDLR g_avnd_func_list[AVND_EVT_MAX];
>
> /**
> * This thread will read classes and object information thereby
> allowing main
> * thread to proceed with other important work.
> * As of now, SU instantiation needs imm data to be read, so
> * only this event is being handled here.
> * Going forward, we need to use this function for similar purposes.
> * @param _cb
> *
> * @return void*
> */
> void ImmReader::imm_reader_thread() {
> uint32_t rc = SA_AIS_OK;
> AVND_EVT *evt;
> TRACE_ENTER();
> NCS_SEL_OBJ mbx_fd;
>
> /* create the mail box */
> rc = m_NCS_IPC_CREATE(&ir_cb.mbx);
> if (NCSCC_RC_SUCCESS != rc) {
> LOG_CR("AvND Mailbox creation failed");
> exit(EXIT_FAILURE);
> }
> TRACE("Ir mailbox creation success");
>
> /* attach the mail box */
> rc = m_NCS_IPC_ATTACH(&ir_cb.mbx);
> if (NCSCC_RC_SUCCESS != rc) {
> LOG_CR("Ir mailbox attach failed");
> exit(EXIT_FAILURE);
> }
>
> mbx_fd = ncs_ipc_get_sel_obj(&ir_cb.mbx);
> fds[FD_MBX].fd = mbx_fd.rmv_obj;
> fds[FD_MBX].events = POLLIN;
>
> while (1) {
> if (poll(fds, irfds, -1) == (-1)) {
> if (errno == EINTR) {
> continue;
> }
>
> LOG_ER("poll Fail - %s", strerror(errno));
> exit(EXIT_FAILURE);
> }
>
> if (fds[FD_MBX].revents & POLLIN) {
> while (nullptr != (evt = (AVND_EVT *)
> ncs_ipc_non_blk_recv(&ir_cb.mbx)))
> ir_process_event(evt);
> }
> }
> TRACE_LEAVE();
> }
>
> /**
> * Start a imm reader thread.
> * @param Nothing.
> * @return Nothing.
> */
> void ImmReader::imm_reader_thread_create() {
>
> TRACE_ENTER();
>
> std::thread t {imm_reader_thread};
> t.detach();
>
> TRACE_LEAVE();
> }
>
> /**
> * This function process events, which requires reading data from imm.
> * As of now, SU instantiation needs to read data, so diverting SU
> * instantiation in this thread. Going forward, we need to use this
> * function for similar purposes.
> * @param Event pointer.
> * @return Nothing.
> */
> void ImmReader::ir_process_event(AVND_EVT *evt) {
> uint32_t res = NCSCC_RC_SUCCESS;
> AVND_EVT_TYPE evt_type = evt->type;
> TRACE_ENTER2("Evt type:%u", evt_type);
>
> osafassert(AVND_EVT_AVD_SU_PRES_MSG == evt_type);
>
> res = g_avnd_func_list[evt_type] (avnd_cb, evt);
>
> /* log the result of event processing */
> TRACE("Evt Type: '%u', '%s'", evt_type, ((res == NCSCC_RC_SUCCESS) ?
> "success" : "failure"));
>
> if (evt)
> avnd_evt_destroy(evt);
>
> TRACE_LEAVE2("res '%u'", res);
> }
>
> /Thanks HansN
>
> On 03/18/2016 07:57 AM, Nagendra Kumar wrote:
> > Hi Hans N,
> > I concur with your understanding and we need to make
> Amfnd implementation also the same way as is there in Amfd going forward
> as I mentioned in the email.
> >
> > Thanks for your review and testing time.
> >
> > Thanks
> > -Nagu
> >> -----Original Message-----
> >> From: Hans Nordebäck [mailto:[email protected]]
> >> Sent: 18 March 2016 12:16
> >> To: Nagendra Kumar; Praveen Malviya; [email protected];
> >> [email protected]
> >> Cc: [email protected]
> >> Subject: Re: [PATCH 1 of 1] amfnd: process su instantiation in a separate
> >> thread [#517]
> >>
> >> Hi Nagu,
> >>
> >> the purpose with the "provoke" was to point to two problems mentioned
> in
> >> the ticket, "immutil should not do abort and the other problem is that
> >> immutil do sleeps in try again loops. Avnd is event based and immutil is
> >> configurable but errors and try-again logic has to be managed by avnd."
> >> if you change the sleep(180) to return an error code instead, e.g.
> >> return SA_AIS_ERR_BAD_HANDLE; immutil takes the decision to abort,
> >> shouldn't we configure immutil for amfnd the same as for amfd?
> >>
> >> I will try to finish the review today.
> >>
> >> /Thanks HansN
> >>
> >>
> >> On 03/18/2016 06:15 AM, Nagendra Kumar wrote:
> >>> Hi Hans N,
> >>> Thanks for review.
> >>> As explained in the ticket and as I explained in the previous emails and
> >>> in
> >> the review request, that this patch solves chicken-egg problem of Immnd
> and
> >> Amfnd.
> >>> I am not able to simulate the problem mentioned in the ticket by Bertil
> >> because that was rare case and was never explained how to reproduce.
> >>> Since there are many places Amfnd is using
> saImmOmSearchInitialize_2(),
> >> so keeping 180 seconds sleep will definitely cause the problem, which you
> >> have seen, but will not be seen if the same thing happens during Immnd
> goes
> >> down and Amfnd wants to read information in SU Instantiation. So, the
> patch
> >> solves the problem even if you keep sleep of 180 sec during SU
> instantiation.
> >>> So, the problem of reading from Immnd hangs issue will be there in
> >>> many flows, which needs further action of modifying the code, But the
> >> patch sent for review is the first thing to start.
> >>> So, after this patch, we need to work on the following work items in this
> >> ticket:
> >>> 1. Pushing Imm reading information in other flows of the code in
> >>> the
> >> separate thread created in the floated patch: This is not going to be easy
> as
> >> Amfnd execution and Reading Imm goes together and segregating them
> into
> >> two flows are not easy.
> >>> 2. Handling of BAD_HANDLE in all the places as done in Amfd.
> >>> 3. Handling of TIMEOUT in all the places as done in Amfd.
> >>>
> >>> So, these items will come and we need to work on these items further.
> >>>
> >>> The easy steps to get chicken-egg issue:
> >>> 1. Start controllers, upload Amf demo.
> >>> 2. Now, add a new component in the SU. This is done because a new
> >> component will be read from avnd_evt_avd_su_pres_evh->
> >> avnd_comp_config_get_su-> avnd_comp_create(). The old
> >> components(uploaded via immcfg -f) are already read in
> >> avnd_evt_avd_reg_su_evh().
> >>> 1. Keep sleep of 3 sec in Amfd in unlock_instantiation().
> >>> 2. Issue unlock-in on Demo SU.
> >>> 3. Keep 5 sec sleep in stop function of Immnd.
> >>> 4. Before sleep expiry, kill Immnd.
> >>> 5. After sleep, Amfd sends a request to Amfnd to instantiate SU, but it
> >> goes and call Imm api to read configuration.
> >>> Since Immnd is not there, so it hangs in Initialize().
> >>> 6. When Immnd comes up after sleep and responds CLC script, it waits
> for
> >> Amfnd to call instantiate CLC, which is not possible as Amfnd is hung in
> Imm
> >> api.
> >>> Since this patch has a separate thread now to read Imm (implemented
> SU
> >> Instantiation), so would be first step to go.
> >>> Thanks
> >>> -Nagu
> >>>> -----Original Message-----
> >>>> From: Hans Nordebäck [mailto:[email protected]]
> >>>> Sent: 17 March 2016 21:29
> >>>> To: Nagendra Kumar; Praveen Malviya; [email protected];
> >>>> [email protected]
> >>>> Cc: [email protected]; Hans Nordebäck
> >>>> Subject: Re: [PATCH 1 of 1] amfnd: process su instantiation in a
> >>>> separate thread [#517]
> >>>>
> >>>> Hi Nagu,
> >>>>
> >>>> I did a quick test with a patch (attached in this mail) that provokes
> >>>> the fault reported in #517. I did a quick test with the patch for
> >>>> review and the "provoking" patch, the fault seems to remain.
> >>>>
> >>>> I tested according to below:
> >>>> - Apply both patches.
> >>>> - Start the system in UML.
> >>>> - Check traces on SC-2, tail -f root/var/SC-2/log/messages
> >>>> - When the system is up load the AmfDemo configuration, immcfg -f
> >>>> immcfg -f /hostfs/AppConfig-2N.xml
> >>>>
> >>>>
> >>>> Mar 17 16:55:12 SC-2 local0.err osafamfnd[467]: ER XXXX: Provoke
> >>>> ticket
> >>>> 517 fault, safSu=SU2,safSg=AmfDemo,safApp=AmfDemo1
> >>>> Mar 17 16:55:33 SC-2 user.notice kernel: random: nonblocking pool is
> >>>> initialized Mar 17 16:56:09 SC-2 local0.err osafamfwd[631]: TIMEOUT
> >>>> receiving AMF health check request, generating core for amfnd Mar 17
> >>>> 16:56:09 SC-2 local0.err osafamfwd[631]: Last received healthcheck
> >>>> cnt=2
> >>>>
> >>>> /Thanks HansN
> >>>>
> >>>>
> >>>> On 03/15/2016 09:26 AM, [email protected] wrote:
> >>>>> osaf/services/saf/amf/amfnd/Makefile.am | 3 +-
> >>>>> osaf/services/saf/amf/amfnd/evt.cc | 14 ++-
> >>>>> osaf/services/saf/amf/amfnd/imm.cc | 137
> >>>> +++++++++++++++++++++++++++++
> >>>>> osaf/services/saf/amf/amfnd/include/avnd.h | 6 +
> >>>>> osaf/services/saf/amf/amfnd/main.cc | 3 +-
> >>>>> 5 files changed, 158 insertions(+), 5 deletions(-)
> >>>>>
> >>>>>
> >>>>> If immnd is down and Amf decides to instantiate some SU, then there
> >>>>> is a deadlock between Amfnd and Imm. Amf calls Imm api to read imm
> >>>>> attributes during SU instantiation and stuck because Imm is down.
> >>>>> Imm waits for Amfnd to instantiate/restart it.
> >>>>> So, both waits for each other. This is a deadlock.
> >>>>> So, the fix bypasses main thread for SU instantiation and does
> >>>>> process of SU instantiation in a separate thread.
> >>>>> So, when Imm is down, its instantiation/restart happens in the main
> >>>>> thread. If any SU instantiation request comes, then Amfnd routes
> >>>>> that request in a separate thread, that threads stuck in Imm api
> >>>>> call untill Imm is not restarted and responds to Imm api call.
> >>>>> This obviates the deadlock between Amfnd and Imm.
> >>>>> So, this fix has advantage for not having any mutex between threads.
> >>>>> The reason is that SU is yet to instantiate, so it is still immune
> >>>>> to faults of any components and hence no need of having any mutex
> >>>>> among the threads.
> >>>>>
> >>>>> diff --git a/osaf/services/saf/amf/amfnd/Makefile.am
> >>>> b/osaf/services/saf/amf/amfnd/Makefile.am
> >>>>> --- a/osaf/services/saf/amf/amfnd/Makefile.am
> >>>>> +++ b/osaf/services/saf/amf/amfnd/Makefile.am
> >>>>> @@ -60,7 +60,8 @@ osafamfnd_SOURCES = \
> >>>>> term.cc \
> >>>>> tmr.cc \
> >>>>> util.cc \
> >>>>> - verify.cc
> >>>>> + verify.cc \
> >>>>> + imm.cc
> >>>>>
> >>>>> osafamfnd_LDADD = \
> >>>>> $(top_builddir)/osaf/tools/safimm/src/libimmutil.la \ diff --
> git
> >>>>> a/osaf/services/saf/amf/amfnd/evt.cc
> >>>> b/osaf/services/saf/amf/amfnd/evt.cc
> >>>>> --- a/osaf/services/saf/amf/amfnd/evt.cc
> >>>>> +++ b/osaf/services/saf/amf/amfnd/evt.cc
> >>>>> @@ -319,9 +319,17 @@ void avnd_evt_destroy(AVND_EVT *evt)
> >>>>>
> >>
> **************************************************************
> >>>> ****************/
> >>>>> uint32_t avnd_evt_send(AVND_CB *cb, AVND_EVT *evt)
> >>>>> {
> >>>>> - uint32_t rc = m_NCS_IPC_SEND(&cb->mbx, evt, evt->priority);
> >>>>> - if (NCSCC_RC_SUCCESS != rc)
> >>>>> - LOG_CR("AvND send event to mailbox failed, type = %u",
> >>>> evt->type);
> >>>>> + uint32_t rc;
> >>>>> + if (evt->type == AVND_EVT_AVD_SU_PRES_MSG) {
> >>>>> + TRACE("AVND_EVT_AVD_REG_SU_MSG");
> >>>>> + rc = m_NCS_IPC_SEND(&ir_cb.mbx, evt, evt-
> >priority);
> >>>>> + if (NCSCC_RC_SUCCESS != rc)
> >>>>> + LOG_CR("AvND send event to mailbox failed,
> type =
> >>>> %u", evt->type);
> >>>>> + } else {
> >>>>> + rc = m_NCS_IPC_SEND(&cb->mbx, evt, evt->priority);
> >>>>> + if (NCSCC_RC_SUCCESS != rc)
> >>>>> + LOG_CR("AvND send event to mailbox failed,
> type =
> >>>> %u", evt->type);
> >>>>> + }
> >>>>>
> >>>>> return rc;
> >>>>> }
> >>>>> diff --git a/osaf/services/saf/amf/amfnd/imm.cc
> >>>> b/osaf/services/saf/amf/amfnd/imm.cc
> >>>>> new file mode 100644
> >>>>> --- /dev/null
> >>>>> +++ b/osaf/services/saf/amf/amfnd/imm.cc
> >>>>> @@ -0,0 +1,137 @@
> >>>>> +/* -*- OpenSAF -*-
> >>>>> + *
> >>>>> + * (C) Copyright 2016 The OpenSAF Foundation
> >>>>> + *
> >>>>> + * This program is distributed in the hope that it will be useful,
> >>>>> +but
> >>>>> + * WITHOUT ANY WARRANTY; without even the implied warranty of
> >>>> MERCHANTABILITY
> >>>>> + * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are
> >>>> licensed
> >>>>> + * under the GNU Lesser General Public License Version 2.1,
> >>>>> + February
> >>>> 1999.
> >>>>> + * The complete license can be accessed from the following location:
> >>>>> + * http://opensource.org/licenses/lgpl-license.php
> >>>>> + * See the Copying file included with the OpenSAF distribution for
> >>>>> + full
> >>>>> + * licensing terms.
> >>>>> + *
> >>>>> + * Author(s): Oracle
> >>>>> + *
> >>>>> + */
> >>>>> +
> >>>>> +#include "avnd.h"
> >>>>> +#include <poll.h>
> >>>>> +
> >>>>> +enum {
> >>>>> + FD_MBX = 0
> >>>>> +};
> >>>>> +
> >>>>> +ir_cb_t ir_cb;
> >>>>> +
> >>>>> +extern const AVND_EVT_HDLR g_avnd_func_list[AVND_EVT_MAX];
> >>>>> +
> >>>>> +static struct pollfd fds[FD_MBX + 1]; static nfds_t irfds = FD_MBX
> >>>>> ++ 1; static void ir_process_event(AVND_EVT *evt);
> >>>>> +
> >>>>> +/**
> >>>>> + * This thread will read classes and object information thereby
> >>>>> +allowing
> >>>> main
> >>>>> + * thread to proceed with other important work.
> >>>>> + * As of now, SU instantiation needs imm data to be read, so
> >>>>> + * only this event is being handled here.
> >>>>> + * Going forward, we need to use this function for similar purposes.
> >>>>> + * @param _cb
> >>>>> + *
> >>>>> + * @return void*
> >>>>> + */
> >>>>> +static void *imm_reader_thread(void *_cb) {
> >>>>> + uint32_t rc = SA_AIS_OK;
> >>>>> + AVND_EVT *evt;
> >>>>> + TRACE_ENTER();
> >>>>> + NCS_SEL_OBJ mbx_fd;
> >>>>> +
> >>>>> + /* create the mail box */
> >>>>> + rc = m_NCS_IPC_CREATE(&ir_cb.mbx);
> >>>>> + if (NCSCC_RC_SUCCESS != rc) {
> >>>>> + LOG_CR("AvND Mailbox creation failed");
> >>>>> + exit(EXIT_FAILURE);
> >>>>> + }
> >>>>> + TRACE("Ir mailbox creation success");
> >>>>> +
> >>>>> + /* attach the mail box */
> >>>>> + rc = m_NCS_IPC_ATTACH(&ir_cb.mbx);
> >>>>> + if (NCSCC_RC_SUCCESS != rc) {
> >>>>> + LOG_CR("Ir mailbox attach failed");
> >>>>> + exit(EXIT_FAILURE);
> >>>>> + }
> >>>>> +
> >>>>> + mbx_fd = ncs_ipc_get_sel_obj(&ir_cb.mbx);
> >>>>> + fds[FD_MBX].fd = mbx_fd.rmv_obj;
> >>>>> + fds[FD_MBX].events = POLLIN;
> >>>>> +
> >>>>> + while (1) {
> >>>>> + if (poll(fds, irfds, -1) == (-1)) {
> >>>>> + if (errno == EINTR) {
> >>>>> + continue;
> >>>>> + }
> >>>>> +
> >>>>> + LOG_ER("poll Fail - %s", strerror(errno));
> >>>>> + exit(EXIT_FAILURE);
> >>>>> + }
> >>>>> +
> >>>>> + if (fds[FD_MBX].revents & POLLIN) {
> >>>>> + while (nullptr != (evt = (AVND_EVT
> >>>> *)ncs_ipc_non_blk_recv(&ir_cb.mbx)))
> >>>>> + ir_process_event(evt);
> >>>>> + }
> >>>>> + }
> >>>>> + TRACE_LEAVE();
> >>>>> +}
> >>>>> +
> >>>>> +/**
> >>>>> + * Start a imm reader thread.
> >>>>> + * @param Nothing.
> >>>>> + * @return Nothing.
> >>>>> + */
> >>>>> +void imm_reader_thread_create(void) {
> >>>>> + pthread_t thread;
> >>>>> + pthread_attr_t attr;
> >>>>> +
> >>>>> + TRACE_ENTER();
> >>>>> +
> >>>>> + pthread_attr_init(&attr);
> >>>>> + pthread_attr_setdetachstate(&attr,
> PTHREAD_CREATE_DETACHED);
> >>>>> +
> >>>>> + if (pthread_create(&thread, &attr, imm_reader_thread,
> &ir_cb) !=
> >>>>> +0)
> >>>> {
> >>>>> + LOG_ER("pthread_create FAILED: %s",
> strerror(errno));
> >>>>> + exit(EXIT_FAILURE);
> >>>>> + }
> >>>>> +
> >>>>> + pthread_attr_destroy(&attr);
> >>>>> +
> >>>>> + TRACE_LEAVE();
> >>>>> +}
> >>>>> +
> >>>>> +/**
> >>>>> + * This function process events, which requires reading data from
> imm.
> >>>>> + * As of now, SU instantiation needs to read data, so diverting SU
> >>>>> + * instantiation in this thread. Going forward, we need to use this
> >>>>> + * function for similar purposes.
> >>>>> + * @param Event pointer.
> >>>>> + * @return Nothing.
> >>>>> + */
> >>>>> +void ir_process_event(AVND_EVT *evt) {
> >>>>> + uint32_t res = NCSCC_RC_SUCCESS;
> >>>>> + AVND_EVT_TYPE evt_type = evt->type;
> >>>>> + TRACE_ENTER2("Evt type:%u", evt_type);
> >>>>> +
> >>>>> + osafassert(AVND_EVT_AVD_SU_PRES_MSG == evt_type);
> >>>>> +
> >>>>> + res = g_avnd_func_list[evt_type] (avnd_cb, evt);
> >>>>> +
> >>>>> + /* log the result of event processing */
> >>>>> + TRACE("Evt Type: '%u', '%s'", evt_type, ((res ==
> NCSCC_RC_SUCCESS)
> >>>> ? "success" : "failure"));
> >>>>> +
> >>>>> + if (evt)
> >>>>> + avnd_evt_destroy(evt);
> >>>>> +
> >>>>> + TRACE_LEAVE2("res '%u'", res);
> >>>>> +}
> >>>>> diff --git a/osaf/services/saf/amf/amfnd/include/avnd.h
> >>>> b/osaf/services/saf/amf/amfnd/include/avnd.h
> >>>>> --- a/osaf/services/saf/amf/amfnd/include/avnd.h
> >>>>> +++ b/osaf/services/saf/amf/amfnd/include/avnd.h
> >>>>> @@ -69,5 +69,11 @@
> >>>>>
> >>>>> extern uint32_t avnd_create(void);
> >>>>> extern void avnd_sigterm_handler(void);
> >>>>> +typedef struct {
> >>>>> + SYSF_MBX mbx;
> >>>>> +}ir_cb_t;
> >>>>> +
> >>>>> +extern ir_cb_t ir_cb;
> >>>>> +extern void imm_reader_thread_create(void);
> >>>>>
> >>>>> #endif
> >>>>> diff --git a/osaf/services/saf/amf/amfnd/main.cc
> >>>> b/osaf/services/saf/amf/amfnd/main.cc
> >>>>> --- a/osaf/services/saf/amf/amfnd/main.cc
> >>>>> +++ b/osaf/services/saf/amf/amfnd/main.cc
> >>>>> @@ -552,7 +552,7 @@ void avnd_main_process(void)
> >>>>> LOG_ER("signal TERM failed: %s", strerror(errno));
> >>>>> goto done;
> >>>>> }
> >>>>> -
> >>>>> + imm_reader_thread_create();
> >>>>> mbx_fd = ncs_ipc_get_sel_obj(&avnd_cb->mbx);
> >>>>> fds[FD_MBX].fd = mbx_fd.rmv_obj;
> >>>>> fds[FD_MBX].events = POLLIN;
> >>>>> @@ -638,6 +638,7 @@ void avnd_evt_process(AVND_EVT *evt)
> >>>>> done:
> >>>>> if (evt)
> >>>>> avnd_evt_destroy(evt);
> >>>>> + TRACE_LEAVE();
> >>>>> }
> >>>>>
> >>>>>
> >>
> /*************************************************************
> >>>> ****************
> >>>>
> >>
>
>
------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel