]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/blueStore: fix discard_unallocated for compressed blob
authorIgor Fedotov <ifedotov@mirantis.com>
Fri, 8 Jul 2016 16:29:50 +0000 (19:29 +0300)
committerIgor Fedotov <ifedotov@mirantis.com>
Thu, 11 Aug 2016 11:28:02 +0000 (14:28 +0300)
Signed-off-by: Igor Fedotov <ifedotov@mirantis.com>
src/os/bluestore/BlueStore.cc

index b60d978f0b75cf1838f5f597304495251d6157ac..959a63cbb14a2e7d6fcb622c585562a74ac7b677 100644 (file)
@@ -1144,11 +1144,27 @@ bool BlueStore::OnodeSpace::map_any(std::function<bool(OnodeRef)> f)
 void BlueStore::Blob::discard_unallocated()
 {
   size_t pos = 0;
-  for (auto e : blob.extents) {
-    if (!e.is_valid()) {
-      bc.discard(pos, e.length);
+  if (blob.is_compressed()) {
+    bool discard = false;
+    bool all_invalid = true;
+    for (auto e : blob.extents) {
+      if (!e.is_valid()) {
+        discard = true;
+      } else {
+        all_invalid = false;
+      }
+    }
+    assert(discard == all_invalid); //in case of compressed blob all or none pextents are invalid.
+    if(discard) {
+      bc.discard(0, blob.get_compressed_payload_original_length());
+    }
+  } else {
+    for (auto e : blob.extents) {
+      if (!e.is_valid()) {
+        bc.discard(pos, e.length);
+      }
+      pos += e.length;
     }
-    pos += e.length;
   }
 }