From: Sage Weil Date: Mon, 6 Jun 2016 18:52:22 +0000 (-0400) Subject: os/bluestore: ensure blob_t::put_ref respects csum chunk size X-Git-Tag: v11.0.0~160^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=bd8ac2157ee76bb5ee271fce9d5e328d66b85349;p=ceph.git os/bluestore: ensure blob_t::put_ref respects csum chunk size We can't deallocate part of a csum chunk. Signed-off-by: Sage Weil --- diff --git a/src/os/bluestore/bluestore_types.cc b/src/os/bluestore/bluestore_types.cc index a8c0c8eff12d..1425bf401329 100644 --- a/src/os/bluestore/bluestore_types.cc +++ b/src/os/bluestore/bluestore_types.cc @@ -570,6 +570,11 @@ void bluestore_blob_t::put_ref( return; } + // we cannot release something smaller than our csum chunk size + if (has_csum_data() && get_csum_block_size() > min_release_size) { + min_release_size = get_csum_block_size(); + } + // search from logical releases for (auto le : logical) { uint64_t r_off = le.offset; diff --git a/src/test/objectstore/test_bluestore_types.cc b/src/test/objectstore/test_bluestore_types.cc index beb78fdad577..18935280c4d9 100644 --- a/src/test/objectstore/test_bluestore_types.cc +++ b/src/test/objectstore/test_bluestore_types.cc @@ -491,6 +491,22 @@ TEST(bluestore_blob_t, put_ref) ASSERT_EQ(1u, b.extents.size()); ASSERT_FALSE(b.extents[0].is_valid()); } + // verify csum chunk size if factored in properly + { + bluestore_blob_t b; + vector r; + b.length = mas * 4; + b.extents.push_back(bluestore_pextent_t(0, mas*4)); + b.init_csum(bluestore_blob_t::CSUM_CRC32C, 14, b.length); + b.ref_map.get(0, mas*4); + ASSERT_TRUE(b.is_allocated(0, mas*4)); + b.put_ref(0, mas*3, mrs, &r); + cout << "r " << r << " " << b << std::endl; + ASSERT_EQ(0u, r.size()); + ASSERT_TRUE(b.is_allocated(0, mas*4)); + ASSERT_TRUE(b.extents[0].is_valid()); + ASSERT_EQ(mas*4, b.extents[0].length); + } } TEST(bluestore_blob_t, calc_csum)