Hi Hung, Reviewed and tested the patch. Cannot reproduce the problem.
Ack from me. Thanks, Zoran -----Original Message----- From: Hung Nguyen [mailto:[email protected]] Sent: Thursday, March 10, 2016 8:27 AM To: Zoran Milinkovic; [email protected] Cc: [email protected] Subject: [PATCH 1 of 1] imm: Wait for veterans when IMMD starts [#1698] 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
