From 262f6683c0c6a0a908964f1eed97ee2361eef74d Mon Sep 17 00:00:00 2001 From: Adam Kupczyk Date: Fri, 30 Sep 2016 11:26:29 +0200 Subject: [PATCH] Fixed problem with snappy compressor when data size <=3. Signed-off-by: Adam Kupczyk --- src/compressor/snappy/SnappyCompressor.h | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/src/compressor/snappy/SnappyCompressor.h b/src/compressor/snappy/SnappyCompressor.h index dadd17902b8ba..aa377b510ac36 100644 --- a/src/compressor/snappy/SnappyCompressor.h +++ b/src/compressor/snappy/SnappyCompressor.h @@ -76,23 +76,15 @@ class SnappyCompressor : public Compressor { int decompress(bufferlist::iterator &p, size_t compressed_len, bufferlist &dst) override { - size_t res_len = 0; - // Trick, decompress only need first few bytes of buffer. note - // that 4 bytes is *not* enough.. it works for small buffers (a - // few MB), but not large ones (~260 MB), because the 32-bit value - // is encoded as a varint. From snappy.cc: - // if (Varint::Parse32WithLimit(start, limit, &v) != NULL) { - // 8 bytes is enough. - bufferlist::const_iterator ptmp = p; - bufferlist tmp; - ptmp.copy(std::min(8lu, compressed_len), tmp); - if (!snappy::GetUncompressedLength(tmp.c_str(), tmp.length(), &res_len)) { + snappy::uint32 res_len = 0; + BufferlistSource source_1(p, compressed_len); + if (!snappy::GetUncompressedLength(&source_1, &res_len)) { return -1; } - BufferlistSource source(p, compressed_len); + BufferlistSource source_2(p, compressed_len); bufferptr ptr(res_len); - if (snappy::RawUncompress(&source, ptr.c_str())) { - p = source.get_pos(); + if (snappy::RawUncompress(&source_2, ptr.c_str())) { + p = source_2.get_pos(); dst.append(ptr); return 0; } -- 2.39.5