Adjust rx-event test to exercise cancel/fire race 55/12755/2
authorBenjamin Kaduk <kaduk@mit.edu>
Thu, 5 Oct 2017 04:03:44 +0000 (23:03 -0500)
committerBenjamin Kaduk <kaduk@mit.edu>
Wed, 8 Nov 2017 16:25:23 +0000 (11:25 -0500)
We currently do not properly handle the case where a thread runs
rxevent_Cancel() in parallel with the event-handler thread attempting
to fire that event, but the test suite only picked up on this issue
in a handful of the Debian automated builds (somewhat less-resourced
ones, perhaps).

Modify the event scheduling algorithm in the test so as to create a
larger chunk of events scheduled to fire "right away" and thereby
exercise the race condition more often when we proceed to cancel
a quarter of events "right away".

Change-Id: I50f55fd532901147cfda1a5f40ef949bf3270401
Reviewed-on: https://gerrit.openafs.org/12755
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Mark Vitale <mvitale@sinenomine.net>
Reviewed-by: Michael Meffie <mmeffie@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>

tests/rx/event-t.c

index 2812fa5..c990246 100644 (file)
@@ -124,10 +124,14 @@ main(void)
     ok(pthread_create(&handler, NULL, eventHandler, NULL) == 0,
        "Created handler thread");
 
-    /* Add 1000 random events to fire over the next 3 seconds */
+    /* Add 1000 random events to fire over the next 3 seconds, but front-loaded
+     * a bit so that we can exercise the cancel/fire race path. */
 
     for (counter = 0; counter < NUMEVENTS; counter++) {
-        when = random() % 3000;
+        when = random() % 4000;
+       /* Put 1/4 of events "right away" so we cancel them as they fire */
+       if (when >= 3000)
+           when = random() % 5;
        clock_GetTime(&now);
        eventTime = now;
        clock_Addmsec(&eventTime, when);