HI Vu, SA_AIS_ERR_TIMEOUT returnd means it is unspecified whether the call succeeded or did not, so you can do :
Do a saClmFinalize() with out capuring error of `lgs_cb->clm_hdl` , before saClmInitialize_4 in while loop. or validate ` _lgs_cb->clm_hdl` before saClmInitialize_4 in while loop. -AVM On 11/24/2016 1:46 PM, Vu Minh Nguyen wrote: > Hi Mahesh, > > Have you had time to look at this? > > Regards, Vu > >> -----Original Message----- >> From: Vu Minh Nguyen [mailto:[email protected]] >> Sent: Tuesday, November 22, 2016 11:04 AM >> To: 'Lennart Lund' <[email protected]>; >> '[email protected]' <[email protected]> >> Cc: '[email protected]' <opensaf- >> [email protected]> >> 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:[email protected]] >>> Sent: Monday, November 21, 2016 7:34 PM >>> To: Vu Minh Nguyen <[email protected]>; >>> [email protected] >>> Cc: [email protected] >>> 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:[email protected]] >>>> Sent: den 17 november 2016 07:31 >>>> To: Lennart Lund <[email protected]>; >> [email protected] >>>> Cc: [email protected] >>>> 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 [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel
