class Compressor {
public:
virtual ~Compressor() {}
- virtual int compress(bufferlist &in, bufferlist &out) = 0;
- virtual int decompress(bufferlist &in, bufferlist &out) = 0;
+ virtual int compress(const bufferlist &in, bufferlist &out) = 0;
+ virtual int decompress(const bufferlist &in, bufferlist &out) = 0;
static CompressorRef create(CephContext *cct, const string &type);
};
size_t left;
public:
- BufferlistSource(bufferlist &data): pb(data.buffers().begin()), pb_off(0), left(data.length()) {}
+ BufferlistSource(const bufferlist &data): pb(data.buffers().begin()), pb_off(0), left(data.length()) {}
virtual ~BufferlistSource() {}
virtual size_t Available() const { return left; }
virtual const char* Peek(size_t* len) {
public:
virtual ~SnappyCompressor() {}
virtual const char* get_method_name() { return "snappy"; }
- virtual int compress(bufferlist &src, bufferlist &dst) {
+ virtual int compress(const bufferlist &src, bufferlist &dst) {
BufferlistSource source(src);
bufferptr ptr(snappy::MaxCompressedLength(src.length()));
snappy::UncheckedByteArraySink sink(ptr.c_str());
dst.append(ptr, 0, sink.CurrentDestination()-ptr.c_str());
return 0;
}
- virtual int decompress(bufferlist &src, bufferlist &dst) {
- BufferlistSource source(src);
+ virtual int decompress(const bufferlist &src, bufferlist &dst) {
size_t res_len = 0;
// Trick, decompress only need first 32bits buffer
- if (!snappy::GetUncompressedLength(src.get_contiguous(0, 8), 8, &res_len))
+ bufferlist tmp;
+ tmp.substr_of( src, 0, 4 );
+ if (!snappy::GetUncompressedLength(tmp.c_str(), tmp.length(), &res_len))
return -1;
+ BufferlistSource source(src);
bufferptr ptr(res_len);
if (snappy::RawUncompress(&source, ptr.c_str())) {
dst.append(ptr);
public:
virtual ~CompressorExample() {}
- virtual int compress(bufferlist &in, bufferlist &out)
+ virtual int compress(const bufferlist &in, bufferlist &out)
{
out = in;
return 0;
}
- virtual int decompress(bufferlist &in, bufferlist &out)
+ virtual int decompress(const bufferlist &in, bufferlist &out)
{
out = in;
return 0;
{
SnappyCompressor sp;
EXPECT_EQ(sp.get_method_name(), "snappy");
- char* test = "This is test text";
+ const char* test = "This is test text";
int len = strlen(test);
bufferlist in, out;
in.append(test, len);
EXPECT_EQ(res, 0);
}
+TEST(SnappyCompressor, sharded_input_decompress)
+{
+ const size_t small_prefix_size=3;
+
+ SnappyCompressor sp;
+ EXPECT_EQ(sp.get_method_name(), "snappy");
+ string test(128*1024,0);
+ int len = test.size();
+ bufferlist in, out;
+ in.append(test.c_str(), len);
+ int res = sp.compress(in, out);
+ EXPECT_EQ(res, 0);
+ EXPECT_GT(out.length(), small_prefix_size);
+
+ bufferlist out2, tmp;
+ tmp.substr_of(out, 0, small_prefix_size );
+ out2.append( tmp );
+ size_t left = out.length()-small_prefix_size;
+ size_t offs = small_prefix_size;
+ while( left > 0 ){
+ size_t shard_size = MIN( 2048, left );
+ tmp.substr_of(out, offs, shard_size );
+ out2.append( tmp );
+ left -= shard_size;
+ offs += shard_size;
+ }
+
+ bufferlist after;
+ res = sp.decompress(out2, after);
+ EXPECT_EQ(res, 0);
+}
+
int main(int argc, char **argv) {
vector<const char*> args;
argv_to_vec(argc, (const char **)argv, args);