[PATCH v5] Fix time/tst-cpuclock1 intermitent failures
Lucas A. M. Magalhaes
lamm@linux.ibm.com
Tue Mar 24 19:42:44 GMT 2020
Hi Carlos,
Thanks for the review.
Quoting Carlos O'Donell (2020-03-23 18:06:34)
> On 3/23/20 1:20 PM, Lucas A. M. Magalhaes via Libc-alpha wrote:
> > +
> > +/* Returns TRUE if the observed time is within the given percentage bounds of
> > +the expected time, and FALSE otherwise.
> > +For example the call
> > +
> > +support_timespec_check_in_range(expected, observed, .5, 1.2);
> > +
> > +will check if
> > +
> > +.5 <= observed/expected <= 1.2
> > +
> > +In other words it will check if observed time is within 50% to 120% of
> > +the expected time. */
> > +int
> > +support_timespec_check_in_range (struct timespec expected, struct timespec observed,
> > + double lower_bound, double upper_bound)
> > +{
> > + assert (upper_bound >= lower_bound);
> > + long expected_norm = expected.tv_sec * TIMESPEC_HZ + expected.tv_nsec;
>
> This can cause overflow/underflow.
>
> Please review timespec_add.
>
> We should set this to a extreme value just like timepsec_add for both overflow/underflow.
>
> > + assert(expected_norm != 0);
>
> Why can't expected_norm be zero?
>
It can't be zero because of the division below. Do you have any suggestions on
this matter?
> If you have an abstract timespec you may want to check against that.
>
> I would assert that all values are *positive* and write that into the comments
> above.
>
> > + long observed_norm = observed.tv_sec * TIMESPEC_HZ + observed.tv_nsec;
> > + double ratio = (double)observed_norm / expected_norm;
> > + return (lower_bound <= ratio && ratio <= upper_bound);
> > +}
[...]
> > +
> > +#include <support/test-driver.c>
> > diff --git a/time/tst-cpuclock1.c b/time/tst-cpuclock1.c
> > index 0120906f23..fe9bb0a31e 100644
> > --- a/time/tst-cpuclock1.c
> > +++ b/time/tst-cpuclock1.c
> > @@ -26,6 +26,7 @@
> > #include <signal.h>
> > #include <stdint.h>
> > #include <sys/wait.h>
> > +#include <support/timespec.h>
> >
> > /* This function is intended to rack up both user and system time. */
> > static void
> > @@ -155,16 +156,11 @@ do_test (void)
> > printf ("live PID %d after sleep => %ju.%.9ju\n",
> > child, (uintmax_t) after.tv_sec, (uintmax_t) after.tv_nsec);
> >
> > - struct timespec diff = { .tv_sec = after.tv_sec - before.tv_sec,
> > - .tv_nsec = after.tv_nsec - before.tv_nsec };
> > - if (diff.tv_nsec < 0)
> > - {
> > - --diff.tv_sec;
> > - diff.tv_nsec += 1000000000;
> > - }
> > - if (diff.tv_sec != 0
> > - || diff.tv_nsec > 600000000
> > - || diff.tv_nsec < 100000000)
> > + /* The bound values are empirically defined by testing this code over high cpu
> > + usage and different nice values. */
> > + struct timespec diff = timespec_sub (support_timespec_normalize (after),
> > + support_timespec_normalize (before));
> > + if (!support_timespec_check_in_range (sleeptime, diff, .0025, 1.3))
>
> The value of 0.0025 doesn't seem correct, can you please confirm that?
>
I got values as low as 0,0008s for this. But I can be more restrict. The
values lower than 0.1 are less than < 1% of my sample. But these are the ones
bothering during cpu stress.
> This is supposed to be a 0.5s wait, and wait of 1ms doesn't seem correct.
>
---
Lucas A. M. Magalhães
More information about the Libc-alpha
mailing list