From: Igor Fedotov Date: Tue, 9 Jul 2019 18:19:37 +0000 (+0300) Subject: os/bluestore: StupidAllocator stucks on 4GB allocations X-Git-Tag: v15.1.0~2221^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=1a91a67bf2fab64d27a000b3c62d3d7beac1aa75;p=ceph.git os/bluestore: StupidAllocator stucks on 4GB allocations Signed-off-by: Igor Fedotov --- diff --git a/src/os/bluestore/StupidAllocator.cc b/src/os/bluestore/StupidAllocator.cc index db2e9e3634c2..bfc46f459f93 100644 --- a/src/os/bluestore/StupidAllocator.cc +++ b/src/os/bluestore/StupidAllocator.cc @@ -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)), diff --git a/src/test/objectstore/Allocator_test.cc b/src/test/objectstore/Allocator_test.cc index afee6e19afc4..6ebd0f2906eb 100644 --- a/src/test/objectstore/Allocator_test.cc +++ b/src/test/objectstore/Allocator_test.cc @@ -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,