]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: add decompressor call to read path
authorIgor Fedotov <ifedotov@mirantis.com>
Fri, 13 May 2016 15:18:12 +0000 (18:18 +0300)
committerSage Weil <sage@redhat.com>
Wed, 1 Jun 2016 15:38:49 +0000 (11:38 -0400)
Signed-off-by: Igor Fedotov <ifedotov@mirantis.com>
src/os/bluestore/BlueStore.cc
src/os/bluestore/BlueStore.h

index 822732159ef37c35f39c0d9673d128de900d3962..62cb7fb2d2f9b47c0d43e092f720dd48e609444e 100644 (file)
@@ -30,6 +30,7 @@
 #include "BlueFS.h"
 #include "BlueRocksEnv.h"
 #include "Checksummer.h"
+#include "compressor/Compressor.h"
 
 #define dout_subsys ceph_subsys_bluestore
 
@@ -3060,11 +3061,24 @@ int BlueStore::_verify_csum(const bluestore_blob_t* blob, uint64_t blob_xoffset,
   return 0;
 }
 
-int BlueStore::_decompress(const bufferlist& source, bufferlist* result)
+int BlueStore::_decompress(bufferlist& source, bufferlist* result)
 {
   int r = 0;
-  //FIXME: just a stub, need to be implemented!
-  result->append(source);
+  bufferlist::iterator i = source.begin();
+  bluestore_compression_header_t chdr;
+  ::decode(chdr, i);
+  CompressorRef compressor = Compressor::create(cct, chdr.type);
+  if (!compressor.get()) {
+    // if compressor isn't available - error, because cannot return decompressed data?
+    derr << __func__ << " can't load decompressor " << chdr.type << dendl;
+    r = -EIO;
+  } else {
+    r = compressor->decompress(i, *result);
+    if (r < 0) {
+      derr << __func__ << " decompression failed with exit code " << r << dendl;
+      r = -EIO;
+    }
+  }
   return r;
 }
 
@@ -5346,6 +5360,8 @@ void BlueStore::_do_write_small(
                               b_off, padded.length(), padded, &b->csum_data);
       }
       o->onode.punch_hole(offset, length, &wctx->lex_old);
+      dout(20) << __func__ << "  lexold 0x" << std::hex << offset << std::dec
+              << ": " << ep->second << dendl;
       bluestore_lextent_t& lex = o->onode.extent_map[offset] =
        bluestore_lextent_t(blob, b_off + head_pad, length, 0);
       b->ref_map.get(lex.offset, lex.length);
index 4cff5d937fe36017bbdde2950ee644a65d3509e8..b889c61a3aaa7763a7a2269cd8480f2551453113 100644 (file)
@@ -932,7 +932,7 @@ private:
     extents2read_t* result);
 
   int _verify_csum(const bluestore_blob_t* blob, uint64_t blob_xoffset, const bufferlist& bl) const;
-  int _decompress(const bufferlist& source, bufferlist* result);
+  int _decompress(bufferlist& source, bufferlist* result);
 
 
   // --------------------------------------------------------