[LTP] [PATCH v2] include: add an exponential backoff macro for function repeat

Li Wang liwang@redhat.com
Tue Apr 17 05:05:04 CEST 2018


Richard Palethorpe <rpalethorpe@suse.de> wrote:

How about:
>
> /**
>  * TST_RETRY_FUNC() - Repeatedly retry a function with an increasing delay.
>  * @FUNC - The function which will be retried
>  * @ERET - The value returned from @FUNC on success
>  *
>  * This macro will call @FUNC in a loop with a delay between retries. If
> @FUNC
>  * returns @ERET then the loop exits. The delay between retries starts at
> one
>  * micro second and is then doubled each iteration until it exceeds one
> second
>  * (the total time sleeping will be aproximately one second as well). When
> the
>  * delay exceeds one second tst_brk() is called.
>  */
>
​
I like this description.
​

>
> > + * @FUNC: the function which will be retried
> > + * @ERET: an expected return value from the FUNC
> > + */
> > +#define TST_RETRY_FUNC(FUNC, ERET) \
> > +     TST_RETRY_FN_EXP_BACKOFF(FUNC, ERET, 1)
> > +
> > +#define TST_RETRY_FN_EXP_BACKOFF(FUNC, ERET, MAX_DELAY)      \
> > +do { int tst_delay = 1;                                      \
> > +     for (;;) {                                              \
> > +             typeof(FUNC) ret = FUNC;                        \
> > +             if (ret == ERET)                                \
> > +                     break;                                  \
>
> Maybe it should return ret somehow?
>

​Maybe yes!

And, if we do that, the macro should probably be rewritten ​as:

​#define TST_RETRY_FN_EXP_BACKOFF(FUNC, ERET, MAX_DELAY)    \
({    int tst_delay = 1;                    \
    for (;;) {                        \
        typeof(FUNC) ret = FUNC;            \
        if (ret == ERET)                \
            break;                    \
        if (tst_delay < MAX_DELAY * 1000000) {        \
            tst_res(TINFO,                \
                #FUNC" returned %i, retrying"    \
                " in %ius", ret, tst_delay);    \
            usleep(tst_delay);            \
            tst_delay *= 2;                \
        } else {                    \
            tst_brk(TBROK, #FUNC" failed");        \
        }                        \
    }                            \
    ERET;                            \
})
​



-- 
Li Wang
liwang@redhat.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.linux.it/pipermail/ltp/attachments/20180417/29a46f38/attachment-0001.html>


More information about the ltp mailing list