]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
common/mempool: only fail tests if sharding is very bad 40566/head
authorsinguliere <singuliere@autistici.org>
Wed, 17 Mar 2021 06:35:04 +0000 (07:35 +0100)
committersinguliere <singuliere@autistici.org>
Fri, 9 Apr 2021 05:36:25 +0000 (07:36 +0200)
Fixes: https://tracker.ceph.com/issues/49781
Signed-off-by: singuliere <singuliere@autistici.org>
(cherry picked from commit db79769d6d557acc021a434ff285db2d69458d0a)

src/include/mempool.h
src/test/test_mempool.cc

index c03aa175cfa07ef4c1acb5206cd8152322d6221d..fe84f3b8f09704b7f8f3f0834251f436a5634786 100644 (file)
@@ -259,7 +259,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;
   }
 
index 99b87d11f265ae85b99e32bbff27e5ded7fc24f1..6ac3bc31e6a7e4d0900d96ca6444c31175630004 100644 (file)
@@ -404,7 +404,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<std::thread> workers;
   for (size_t i = 0; i < samples; i++) {
@@ -419,15 +419,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);
 }