Hi Mahesh, Have you had time to look at this?
Regards, Vu > -----Original Message----- > From: Vu Minh Nguyen [mailto:vu.m.ngu...@dektech.com.au] > Sent: Tuesday, November 22, 2016 11:04 AM > To: 'Lennart Lund' <lennart.l...@ericsson.com>; > 'mahesh.va...@oracle.com' <mahesh.va...@oracle.com> > Cc: 'opensaf-devel@lists.sourceforge.net' <opensaf- > de...@lists.sourceforge.net> > Subject: RE: [PATCH 1 of 1] log: handle TRY_AGAIN error code of > saClmInitialize() [#2192] > > Thanks Lennart for your comments. Below is the fix due to your comments. > > //> ==================== > diff --git a/osaf/services/saf/logsv/lgs/lgs_clm.cc > b/osaf/services/saf/logsv/lgs/lgs_clm.cc > --- a/osaf/services/saf/logsv/lgs/lgs_clm.cc > +++ b/osaf/services/saf/logsv/lgs/lgs_clm.cc > @@ -16,6 +16,7 @@ > */ > #include "osaf/services/saf/logsv/lgs/lgs.h" > #include "osaf/services/saf/logsv/lgs/lgs_clm.h" > +#include "osaf/libs/core/cplusplus/base/time.h" > > static bool clm_initialized; > static void *clm_node_db = NULL; /* used for C++ STL map */ > @@ -348,13 +349,20 @@ void *lgs_clm_init_thread(void *cb) { > static SaVersionT clmVersion = { 'B', 0x04, 0x01 }; > lgs_cb_t *_lgs_cb = reinterpret_cast<lgs_cb_t *> (cb); > SaAisErrorT rc; > + > TRACE_ENTER(); > + > rc = saClmInitialize_4(&_lgs_cb->clm_hdl, &clm_callbacks, &clmVersion); > + while ((rc == SA_AIS_ERR_TRY_AGAIN) || (rc == SA_AIS_ERR_TIMEOUT)) { > + base::Sleep(base::kOneHundredMilliseconds); > + rc = saClmInitialize_4(&_lgs_cb->clm_hdl, &clm_callbacks, &clmVersion); > + } > if (rc != SA_AIS_OK) { > LOG_ER("saClmInitialize failed with error: %d", rc); > TRACE_LEAVE(); > exit(EXIT_FAILURE); > } > + > rc = saClmSelectionObjectGet(_lgs_cb->clm_hdl, &lgs_cb- > >clmSelectionObject); > if (rc != SA_AIS_OK) { > LOG_ER("saClmSelectionObjectGet failed with error: %d", rc); > > //< ==================== > > Regards, Vu > > > -----Original Message----- > > From: Lennart Lund [mailto:lennart.l...@ericsson.com] > > Sent: Monday, November 21, 2016 7:34 PM > > To: Vu Minh Nguyen <vu.m.ngu...@dektech.com.au>; > > mahesh.va...@oracle.com > > Cc: opensaf-devel@lists.sourceforge.net > > Subject: RE: [PATCH 1 of 1] log: handle TRY_AGAIN error code of > > saClmInitialize() [#2192] > > > > Hi Vu, > > > > Ack with comment > > > > There is a generic timeout handling in OpenSAF that can be used with this > > kind of loops in order to make them simpler. You find that handling by > > including "base/time.h" > > The following is an example from SMF where this is used. Note that also > > base::Sleep is used instead of usleep(): > > > > const SaTimeT kNanoMillis = 1000000; > > SaAisErrorT oi_rc = SA_AIS_OK; > > SaAisErrorT imm_rc = SA_AIS_OK; > > m_errno = SA_AIS_OK; > > bool method_rc = false; > > base::Timer adminOpTimer(smfd_cb->adminOpTimeout / > > kNanoMillis); > > > > while (adminOpTimer.is_timeout() == false) { > > imm_rc = saImmOmAdminOperationInvoke_2( > > m_ownerHandle, > > &nodeGroupName, 0, adminOp, params, > > &oi_rc, > > smfd_cb->adminOpTimeout); > > if ((imm_rc == SA_AIS_ERR_TRY_AGAIN) || > > (imm_rc == SA_AIS_OK && oi_rc == > > SA_AIS_ERR_TRY_AGAIN)) { > > base::Sleep(base::MillisToTimespec(2000)); > > continue; > > } else if (imm_rc != SA_AIS_OK) { > > LOG_NO("%s: saImmOmAdminOperationInvoke_2 " > > "Fail %s", __FUNCTION__, > > saf_error(imm_rc)); > > m_errno = imm_rc; > > break; > > } else if (oi_rc != SA_AIS_OK) { > > LOG_NO("%s: SaAmfAdminOperationId %d Fail %s", > > __FUNCTION__, adminOp, saf_error(oi_rc)); > > m_errno = oi_rc; > > break; > > } else { > > // Operation success > > method_rc = true; > > break; > > } > > } > > if (adminOpTimer.is_timeout()) { > > // Do some error handling because of timeout > > . > > . > > . > > } > > > > Thanks > > Lennart > > > > > -----Original Message----- > > > From: Vu Minh Nguyen [mailto:vu.m.ngu...@dektech.com.au] > > > Sent: den 17 november 2016 07:31 > > > To: Lennart Lund <lennart.l...@ericsson.com>; > mahesh.va...@oracle.com > > > Cc: opensaf-devel@lists.sourceforge.net > > > Subject: [PATCH 1 of 1] log: handle TRY_AGAIN error code of > > saClmInitialize() > > > [#2192] > > > > > > osaf/services/saf/logsv/lgs/lgs_clm.cc | 12 ++++++++++++ > > > 1 files changed, 12 insertions(+), 0 deletions(-) > > > > > > > > > LOG did not deal with TRY_AGAIN error code of `saClmInitialize()`, > > > LOG would exit, and cause node reboot if getting TRY_AGAIN. > > > > > > The patch adds a while loop to do retry when getting TRY_AGAIN. > > > > > > diff --git a/osaf/services/saf/logsv/lgs/lgs_clm.cc > > > b/osaf/services/saf/logsv/lgs/lgs_clm.cc > > > --- a/osaf/services/saf/logsv/lgs/lgs_clm.cc > > > +++ b/osaf/services/saf/logsv/lgs/lgs_clm.cc > > > @@ -348,13 +348,25 @@ void *lgs_clm_init_thread(void *cb) { > > > static SaVersionT clmVersion = { 'B', 0x04, 0x01 }; > > > lgs_cb_t *_lgs_cb = reinterpret_cast<lgs_cb_t *> (cb); > > > SaAisErrorT rc; > > > + uint32_t msecs_waited = 0; > > > + const uint32_t max_waiting_time_10s = 10 * 1000; /* 10 secs */ > > > + > > > TRACE_ENTER(); > > > + > > > rc = saClmInitialize_4(&_lgs_cb->clm_hdl, &clm_callbacks, > &clmVersion); > > > + while (((rc == SA_AIS_ERR_TRY_AGAIN) || (rc == > SA_AIS_ERR_TIMEOUT) > > > || > > > + (rc == SA_AIS_ERR_UNAVAILABLE)) && > > > + (msecs_waited < max_waiting_time_10s)) { > > > + usleep(100*1000); > > > + msecs_waited += 100; > > > + rc = saClmInitialize_4(&_lgs_cb->clm_hdl, &clm_callbacks, > > &clmVersion); > > > + } > > > if (rc != SA_AIS_OK) { > > > LOG_ER("saClmInitialize failed with error: %d", rc); > > > TRACE_LEAVE(); > > > exit(EXIT_FAILURE); > > > } > > > + > > > rc = saClmSelectionObjectGet(_lgs_cb->clm_hdl, &lgs_cb- > > > >clmSelectionObject); > > > if (rc != SA_AIS_OK) { > > > LOG_ER("saClmSelectionObjectGet failed with error: %d", rc); ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel