diff options
author | George Joseph <gjoseph@digium.com> | 2016-10-25 10:20:16 -0600 |
---|---|---|
committer | George Joseph <gjoseph@digium.com> | 2016-10-25 11:31:46 -0500 |
commit | 3a2092b72266b78ab2c10bfac03bf28f207becdc (patch) | |
tree | 7e200e57e450c58dce8d2f864542ab2a97cfa5ba /tests | |
parent | 2bd8af6d0bc3cc9e08457924f190a76ff8cbb0b7 (diff) |
test_astobj2_thrash: Fix multithreaded issues
The test uses 4 threads to grow, count, lookup and shrink 15K objects
in a container. If there's only 1 execution engine available, the test
will complete in <50ms. If each threads gets its own execution engine,
the test may timeout after 60 seconds because the count thread does a
locked ao2_callback on the whole container in a tight loop with only
a sched_yield to give up time. The lock contention makes the test
execution times wildly variable and mostly timeout. 2 execution
engines are OK, 3 results in about 33% failure rate and >=4 causes
a 80% failure rate.
To fix, the sched_yield was changed to a usleep(500).
Also, the number of buckets specified for the container was an even
number so that was changed to the next prime number greater than
(MAX_HASH_ENTRIES / 100). That's 151 currently.
Change-Id: I50cd2344161ea61bfe4b96d2a29a6ccf88385c77
Diffstat (limited to 'tests')
-rw-r--r-- | tests/test_astobj2_thrash.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/tests/test_astobj2_thrash.c b/tests/test_astobj2_thrash.c index 814234cc3..324c4f4b9 100644 --- a/tests/test_astobj2_thrash.c +++ b/tests/test_astobj2_thrash.c @@ -46,6 +46,13 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/utils.h" #define MAX_HASH_ENTRIES 15000 +/* + * Use one of the online calculators to find the first prime number + * greater than MAX_HASH_ENTRIES / 100. + */ +#define HASH_BUCKETS 151 + +#define COUNT_SLEEP_US 500 #define MAX_TEST_SECONDS 60 struct hash_test { @@ -207,7 +214,7 @@ static void *hash_test_count(void *d) if (last_count == count) { /* Allow other threads to run. */ - sched_yield(); + usleep(COUNT_SLEEP_US); } else if (last_count > count) { /* Make sure the ao2 container never shrinks */ return "ao2 container unexpectedly shrank"; @@ -261,7 +268,7 @@ AST_TEST_DEFINE(hash_test) data.preload = MAX_HASH_ENTRIES / 2; data.max_grow = MAX_HASH_ENTRIES - data.preload; data.deadline = ast_tvadd(ast_tvnow(), ast_tv(MAX_TEST_SECONDS, 0)); - data.to_be_thrashed = ao2_container_alloc(MAX_HASH_ENTRIES / 100, hash_string, + data.to_be_thrashed = ao2_container_alloc(HASH_BUCKETS, hash_string, compare_strings); if (data.to_be_thrashed == NULL) { |