From: Igor Fedotov Date: Fri, 13 May 2016 15:18:12 +0000 (+0300) Subject: os/bluestore: add decompressor call to read path X-Git-Tag: v11.0.0~359^2~76 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2942f36f36fb4df77fa224d979f11360b30e6b6a;p=ceph.git os/bluestore: add decompressor call to read path Signed-off-by: Igor Fedotov --- diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 822732159ef3..62cb7fb2d2f9 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -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); diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index 4cff5d937fe3..b889c61a3aaa 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -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); // --------------------------------------------------------