]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: ensure blob_t::put_ref respects csum chunk size
authorSage Weil <sage@redhat.com>
Mon, 6 Jun 2016 18:52:22 +0000 (14:52 -0400)
committerSage Weil <sage@redhat.com>
Wed, 15 Jun 2016 19:25:29 +0000 (15:25 -0400)
We can't deallocate part of a csum chunk.

Signed-off-by: Sage Weil <sage@redhat.com>
src/os/bluestore/bluestore_types.cc
src/test/objectstore/test_bluestore_types.cc

index a8c0c8eff12d9cdc7f5d3f6b1776006f53f0ad05..1425bf401329959116f95a06664ac39fbed05be5 100644 (file)
@@ -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;
index beb78fdad5776ed00a55861b804ef034496b15bd..18935280c4d9fd246a5177a6f372d0dec0258e13 100644 (file)
@@ -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<bluestore_pextent_t> 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)