Hi Neel, The current code has 3 second sleep before initializing MDS. The change the patch makes is to wait (not sleep) for veteran PL after initializing MDS.
The priority is to make sure that IMMD will process intro message from veteran PL before intro message from newly-joined nodes. Otherwise IMMND on newly-joined node will crash, please see ticket description for details. BR, Hung Nguyen - DEK Technologies -------------------------------------------------------------------------------- From: Neelakanta Reddy [email protected] Sent: Monday, March 21, 2016 2:03PM To: Hung Nguyen, Zoran Milinkovic [email protected], [email protected] Cc: Opensaf-devel [email protected] Subject: Re: [PATCH 1 of 1] imm: Wait for veterans when IMMD starts [#1698] Hi Hung, The present code already has 3seconds delay. Published patch, also sleeps for same 3 seconds. If the veteran IMMD can not send the INTRO event for 3 seconds , then there is some problem with the system. waiting for 3 seconds is a long wait to send intro. the priority part also may not be required. Thanks, Neel. On Thursday 10 March 2016 12:56 PM, Hung Nguyen wrote: > osaf/services/saf/immsv/immd/immd_cb.h | 3 ++ > osaf/services/saf/immsv/immd/immd_main.c | 36 > ++++++++++++++++++++++++++++--- > osaf/services/saf/immsv/immd/immd_mds.c | 20 ++++++++++++++++- > 3 files changed, 53 insertions(+), 6 deletions(-) > > > IMMD will wait for intro message from veterans and give up after 3 > seconds if can't find any veteran. > > This patch also improves the startup time of IMMD. > IMMD will not always 'sleep' for 3 seconds. It will just wait until a > veteran attaches. > Also the standby IMMD will not have any delay in startup process. > > diff --git a/osaf/services/saf/immsv/immd/immd_cb.h > b/osaf/services/saf/immsv/immd/immd_cb.h > --- a/osaf/services/saf/immsv/immd/immd_cb.h > +++ b/osaf/services/saf/immsv/immd/immd_cb.h > @@ -141,6 +141,9 @@ typedef struct immd_cb_tag { > SaUint16T mScAbsenceAllowed; /* Non zero if SC absence is > allowed (loss of both IMMDs/SCs). > Value is number of seconds of SC absence > tolerated. */ > MDS_DEST payload_coord_dest; /* IMMND coord may be at payload if > mScAbsenceAllowed is nonzero */ > + > + NCS_LOCK veteran_sync_lock; /* Sync up with veteran payload > after headless */ > + NCS_SEL_OBJ veteran_sync_sel; /* Sync up with veteran payload > after headless */ > } IMMD_CB; > uint32_t immd_immnd_info_tree_init(IMMD_CB *cb); > diff --git a/osaf/services/saf/immsv/immd/immd_main.c > b/osaf/services/saf/immsv/immd/immd_main.c > --- a/osaf/services/saf/immsv/immd/immd_main.c > +++ b/osaf/services/saf/immsv/immd/immd_main.c > @@ -33,6 +33,7 @@ > #include <rda_papi.h> > #include <daemon.h> > #include <nid_api.h> > +#include "osaf_poll.h" > #include "immd.h" > #include <immd_proc.h> > @@ -257,10 +258,16 @@ int main(int argc, char *argv[]) > } > if(scAbsenceAllowed) { > - LOG_NO("******* SC_ABSENCE_ALLOWED (Headless Hydra) is > configured: %u ***********", > - scAbsenceAllowed); > - LOG_NO("Waiting 3 seconds to allow IMMND MDS attachments to > get processed."); > - sleep(3); > + /* Create the sel-obj before initializing MDS. > + * This way, we can avoid an extra 'veteran_sync_awaited' > variable in IMMD_CB */ > + if (m_NCS_LOCK_INIT(&immd_cb->veteran_sync_lock) != > NCSCC_RC_SUCCESS) { > + LOG_ER("Failed to get veteran_sync_lock lock"); > + goto done; > + } > + if (m_NCS_SEL_OBJ_CREATE(&immd_cb->veteran_sync_sel)!= > NCSCC_RC_SUCCESS) { > + LOG_ER("Failed to create veteran_sync_sel sel_obj"); > + goto done; > + } > } > immd_cb->mScAbsenceAllowed = scAbsenceAllowed; > @@ -270,6 +277,27 @@ int main(int argc, char *argv[]) > goto done; > } > + if(scAbsenceAllowed) { > + LOG_NO("******* SC_ABSENCE_ALLOWED (Headless Hydra) is > configured: %u ***********", > + scAbsenceAllowed); > + > + /* If this IMMD has active role, wait for veteran payloads. > + * Give up after 3 seconds if there's no veteran payload. */ > + if (immd_cb->ha_state == SA_AMF_HA_ACTIVE) { > + LOG_NO("Waiting 3 seconds to allow IMMND MDS attachments > to get processed."); > + > + if > (osaf_poll_one_fd(m_GET_FD_FROM_SEL_OBJ(immd_cb->veteran_sync_sel), > 3000) != 1) { > + TRACE("osaf_poll_one_fd on veteran_sync_sel failed or > timed out"); > + } else { > + TRACE("osaf_poll_one_fd on veteran_sync_sel succeeded"); > + } > + } > + > + m_NCS_LOCK(&immd_cb->veteran_sync_lock,NCS_LOCK_WRITE); > + m_NCS_SEL_OBJ_DESTROY(&immd_cb->veteran_sync_sel); > + m_NCS_UNLOCK(&immd_cb->veteran_sync_lock,NCS_LOCK_WRITE); > + } > + > daemon_sigterm_install(&term_fd); > /* Get file descriptor for mailbox */ > diff --git a/osaf/services/saf/immsv/immd/immd_mds.c > b/osaf/services/saf/immsv/immd/immd_mds.c > --- a/osaf/services/saf/immsv/immd/immd_mds.c > +++ b/osaf/services/saf/immsv/immd/immd_mds.c > @@ -489,6 +489,7 @@ static uint32_t immd_mds_rcv(IMMD_CB *cb > { > uint32_t rc = NCSCC_RC_SUCCESS; > IMMSV_EVT *pEvt = (IMMSV_EVT *)rcv_info->i_msg; > + NCS_IPC_PRIORITY prio = NCS_IPC_PRIORITY_NORMAL; > pEvt->sinfo.ctxt = rcv_info->i_msg_ctxt; > pEvt->sinfo.dest = rcv_info->i_fr_dest; > @@ -497,8 +498,23 @@ static uint32_t immd_mds_rcv(IMMD_CB *cb > pEvt->sinfo.stype = MDS_SENDTYPE_RSP; > } > + /* Set priority of intro messages from veteran payloads to > PRIORITY_HIGH. > + * IMMD will process them before the intro messages from other > IMMNDs. */ > + if (cb->mScAbsenceAllowed && > + pEvt->info.immd.type == IMMD_EVT_ND2D_INTRO && > + pEvt->info.immd.info.ctrl_msg.refresh == 2) { > + > + prio = NCS_IPC_PRIORITY_HIGH; > + > + m_NCS_LOCK(&immd_cb->veteran_sync_lock,NCS_LOCK_WRITE); > + if (cb->veteran_sync_sel.raise_obj != -1) { /* Check if the > sel_obj is not destroyed */ > + m_NCS_SEL_OBJ_IND(&cb->veteran_sync_sel); > + } > + m_NCS_UNLOCK(&immd_cb->veteran_sync_lock,NCS_LOCK_WRITE); > + } > + > /* Put it in IMMD's Event Queue */ > - rc = m_NCS_IPC_SEND(&cb->mbx, (NCSCONTEXT)pEvt, > NCS_IPC_PRIORITY_NORMAL); > + rc = m_NCS_IPC_SEND(&cb->mbx, (NCSCONTEXT)pEvt, prio); > if (NCSCC_RC_SUCCESS != rc) { > LOG_WA("IMMD - IPC SEND FAILED"); > } > @@ -542,7 +558,7 @@ static uint32_t immd_mds_svc_evt(IMMD_CB > evt->info.immd.info.mds_info.node_id = svc_evt->i_node_id; > /* Put it in IMMD's Event Queue */ > - rc = m_NCS_IPC_SEND(&cb->mbx, (NCSCONTEXT)evt, > NCS_IPC_PRIORITY_HIGH); > + rc = m_NCS_IPC_SEND(&cb->mbx, (NCSCONTEXT)evt, > NCS_IPC_PRIORITY_VERY_HIGH); > if (NCSCC_RC_SUCCESS != rc) { > LOG_WA("IMMD - IPC SEND FAILED"); > free(evt); ------------------------------------------------------------------------------ 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=278785351&iu=/4140 _______________________________________________ Opensaf-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel
