]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: fix unused 'tail' calculation.
authorIgor Fedotov <ifedotov@suse.com>
Mon, 3 Feb 2020 15:36:21 +0000 (18:36 +0300)
committerNathan Cutler <ncutler@suse.com>
Thu, 14 May 2020 11:01:52 +0000 (13:01 +0200)
Fixes: https://tracker.ceph.com/issues/41901
Signed-off-by: Igor Fedotov <ifedotov@suse.com>
(cherry picked from commit c91cc3a8d689995e8554c41c9b0f652d9a3458da)

Conflicts:
    src/test/objectstore/store_test.cc
- omitted test case "TEST_P(StoreTestSpecificAUSize, ReproBug41901Test)"
  from the backport, because nautilus does not have the
  "bluestore_debug_enforce_settings" option

src/os/bluestore/BlueStore.cc
src/os/bluestore/bluestore_types.h

index 042aa6d97c7b0be1d04404c7bc9468b4abb10eea..f4181b6c754a48eadcd78ac3d0ffdabf5bd94366 100644 (file)
@@ -12738,12 +12738,14 @@ int BlueStore::_do_alloc_write(
     }
 
     if (wi.mark_unused) {
+      ceph_assert(!dblob.is_compressed());
       auto b_end = b_off + wi.bl.length();
       if (b_off) {
         dblob.add_unused(0, b_off);
       }
-      if (b_end < wi.blob_length) {
-        dblob.add_unused(b_end, wi.blob_length - b_end);
+      uint64_t llen = dblob.get_logical_length();
+      if (b_end < llen) {
+        dblob.add_unused(b_end, llen - b_end);
       }
     }
 
index d80df2516842285e6bcfcd8ff8b5e03ecc507725..7f2393d240db3b768fea45368da4479ae525f151 100644 (file)
@@ -631,6 +631,7 @@ public:
     if (!has_unused()) {
       return false;
     }
+    ceph_assert(!is_compressed());
     uint64_t blob_len = get_logical_length();
     ceph_assert((blob_len % (sizeof(unused)*8)) == 0);
     ceph_assert(offset + length <= blob_len);
@@ -646,6 +647,7 @@ public:
 
   /// mark a range that has never been used
   void add_unused(uint64_t offset, uint64_t length) {
+    ceph_assert(!is_compressed());
     uint64_t blob_len = get_logical_length();
     ceph_assert((blob_len % (sizeof(unused)*8)) == 0);
     ceph_assert(offset + length <= blob_len);
@@ -663,6 +665,7 @@ public:
   /// indicate that a range has (now) been used.
   void mark_used(uint64_t offset, uint64_t length) {
     if (has_unused()) {
+      ceph_assert(!is_compressed());
       uint64_t blob_len = get_logical_length();
       ceph_assert((blob_len % (sizeof(unused)*8)) == 0);
       ceph_assert(offset + length <= blob_len);