From: singuliere Date: Wed, 17 Mar 2021 06:35:04 +0000 (+0100) Subject: common/mempool: only fail tests if sharding is very bad X-Git-Tag: v15.2.13~19^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c0969de17fc5015c691f4104c263e4009fa5010e;p=ceph.git common/mempool: only fail tests if sharding is very bad Fixes: https://tracker.ceph.com/issues/49781 Signed-off-by: singuliere (cherry picked from commit db79769d6d557acc021a434ff285db2d69458d0a) Conflicts: src/include/mempool.h: 0fcf893e18057400bf9c7acc8471ff7eebc71331 in master added #include in Client.h, making it available in the tests. It needs to be added explicitly for octopus. --- diff --git a/src/include/mempool.h b/src/include/mempool.h index e9907c82587..e53104b177b 100644 --- a/src/include/mempool.h +++ b/src/include/mempool.h @@ -258,7 +258,7 @@ public: // Dirt cheap, see: // https://fossies.org/dox/glibc-2.32/pthread__self_8c_source.html size_t me = (size_t)pthread_self(); - size_t i = (me >> 12) & ((1 << num_shard_bits) - 1); + size_t i = (me >> CEPH_PAGE_SHIFT) & ((1 << num_shard_bits) - 1); return i; } diff --git a/src/test/test_mempool.cc b/src/test/test_mempool.cc index 99b87d11f26..dfcf0c57ca4 100644 --- a/src/test/test_mempool.cc +++ b/src/test/test_mempool.cc @@ -22,6 +22,7 @@ #include "gtest/gtest.h" #include "include/btree_map.h" #include "include/mempool.h" +#include void check_usage(mempool::pool_index_t ix) { @@ -404,7 +405,7 @@ TEST(mempool, btree_map_test) TEST(mempool, check_shard_select) { - const size_t samples = 100; + const size_t samples = mempool::num_shards * 100; std::atomic_int shards[mempool::num_shards] = {0}; std::vector workers; for (size_t i = 0; i < samples; i++) { @@ -419,15 +420,16 @@ TEST(mempool, check_shard_select) } workers.clear(); - double EX = (double)samples / (double)mempool::num_shards; - double VarX = 0; + size_t missed = 0; for (size_t i = 0; i < mempool::num_shards; i++) { - VarX += (EX - shards[i]) * (EX - shards[i]); + if (shards[i] == 0) { + missed++; + } } - //random gives VarX below 200 - //when half slots are 0, we get ~300 - //when all samples go into one slot, we get ~9000 - EXPECT_LT(VarX, 200); + + // If more than half of the shards did not get anything, + // the distribution is bad enough to deserve a failure. + EXPECT_LT(missed, mempool::num_shards / 2); }