]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
os/bluestore: StupidAllocator stucks on 4GB allocations
authorIgor Fedotov <ifedotov@suse.com>
Tue, 9 Jul 2019 18:19:37 +0000 (21:19 +0300)
committerIgor Fedotov <ifedotov@suse.com>
Tue, 9 Jul 2019 18:19:37 +0000 (21:19 +0300)
Signed-off-by: Igor Fedotov <ifedotov@suse.com>
src/os/bluestore/StupidAllocator.cc
src/test/objectstore/Allocator_test.cc

index db2e9e3634c2d84108f87d6dbf8fa68bcda98ad7..bfc46f459f9351dfa34f4a1c16f64a11cbbde3a0 100644 (file)
@@ -193,6 +193,8 @@ int64_t StupidAllocator::allocate(
   if (max_alloc_size == 0) {
     max_alloc_size = want_size;
   }
+  // cap with 32-bit val
+  max_alloc_size = std::min(max_alloc_size, 0x10000000 - alloc_unit);
 
   while (allocated_size < want_size) {
     res = allocate_int(std::min(max_alloc_size, (want_size - allocated_size)),
index afee6e19afc469dad942446e0cc89af9cc4a14ae..6ebd0f2906eb37a8a3a5d76ad06fbdde08675728 100644 (file)
@@ -336,7 +336,7 @@ TEST_P(AllocTest, test_alloc_big2)
   int64_t mas = 1024*1024;
   init_alloc(blocks*block_size, block_size);
   alloc->init_add_free(0, blocks * block_size);
-  
+
   PExtentVector extents;
   uint64_t need = block_size * blocks / 4; // 2GB
   EXPECT_EQ(need,
@@ -347,6 +347,24 @@ TEST_P(AllocTest, test_alloc_big2)
   EXPECT_TRUE(extents[0].length > 0);
 }
 
+//Verifies stuck 4GB chunk allocation
+//in StupidAllocator
+//
+TEST_P(AllocTest, test_alloc_big3)
+{
+  int64_t block_size = 4096;
+  int64_t blocks = 1048576 * 2;
+  int64_t mas = 1024*1024;
+  init_alloc(blocks*block_size, block_size);
+  alloc->init_add_free(0, blocks * block_size);
+
+  PExtentVector extents;
+  uint64_t need = block_size * blocks / 2; // 4GB
+  EXPECT_EQ(need,
+      alloc->allocate(need, mas, 0, &extents));
+  EXPECT_TRUE(extents[0].length > 0);
+}
+
 INSTANTIATE_TEST_SUITE_P(
   Allocator,
   AllocTest,