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

Reply via email to