lderr(cct) << "Cannot load compressor of type " << cs_info->compression_type << dendl;
return -EIO;
}
- bufferlist out_bl, in_bl;
+ bufferlist out_bl, in_bl, temp_in_bl;
+ bl.copy(bl_ofs, bl_len, temp_in_bl);
bl_ofs = 0;
if (waiting.length() != 0) {
in_bl.append(waiting);
- in_bl.append(bl);
+ in_bl.append(temp_in_bl);
waiting.clear();
} else {
- in_bl.claim(bl);
+ in_bl.claim(temp_in_bl);
}
bl_len = in_bl.length();
-
+
while (first_block <= last_block) {
bufferlist tmp, tmp_out;
int ofs_in_bl = first_block->new_ofs - cur_ofs;
vector<compression_block>::iterator fb, lb;
// not bad to use auto for lambda, I think
auto cmp_u = [] (off_t ofs, const compression_block& e) { return (unsigned)ofs < e.old_ofs; };
- auto cmp_l = [] (const compression_block& e, off_t ofs) { return e.old_ofs < (unsigned)ofs; };
+ auto cmp_l = [] (const compression_block& e, off_t ofs) { return e.old_ofs <= (unsigned)ofs; };
fb = upper_bound(cs_info->blocks.begin()+1,
cs_info->blocks.end(),
ofs,
q_len = end - last_block->old_ofs + 1;
ofs = first_block->new_ofs;
- end = last_block->new_ofs + last_block->len;
+ end = last_block->new_ofs + last_block->len - 1;
first_data = true;
cur_ofs = ofs;
RGWGetObj_Decompress decompress(g_ceph_context, &cs_info, partial, &cb);
// test translation from logical ranges to compressed ranges
- ASSERT_EQ(range_t(0, 6), fixup_range(&decompress, 0, 1));
- ASSERT_EQ(range_t(0, 6), fixup_range(&decompress, 1, 7));
- ASSERT_EQ(range_t(0, 6), fixup_range(&decompress, 7, 8));
- ASSERT_EQ(range_t(0, 12), fixup_range(&decompress, 0, 9));
- ASSERT_EQ(range_t(0, 12), fixup_range(&decompress, 7, 9));
- ASSERT_EQ(range_t(6, 12), fixup_range(&decompress, 8, 9));
- ASSERT_EQ(range_t(6, 12), fixup_range(&decompress, 8, 16));
- ASSERT_EQ(range_t(6, 18), fixup_range(&decompress, 8, 17));
- ASSERT_EQ(range_t(12, 18), fixup_range(&decompress, 16, 24));
- ASSERT_EQ(range_t(12, 24), fixup_range(&decompress, 16, 999));
- ASSERT_EQ(range_t(18, 24), fixup_range(&decompress, 998, 999));
+ ASSERT_EQ(range_t(0, 5), fixup_range(&decompress, 0, 1));
+ ASSERT_EQ(range_t(0, 5), fixup_range(&decompress, 1, 7));
+ ASSERT_EQ(range_t(0, 11), fixup_range(&decompress, 7, 8));
+ ASSERT_EQ(range_t(0, 11), fixup_range(&decompress, 0, 9));
+ ASSERT_EQ(range_t(0, 11), fixup_range(&decompress, 7, 9));
+ ASSERT_EQ(range_t(6, 11), fixup_range(&decompress, 8, 9));
+ ASSERT_EQ(range_t(6, 17), fixup_range(&decompress, 8, 16));
+ ASSERT_EQ(range_t(6, 17), fixup_range(&decompress, 8, 17));
+ ASSERT_EQ(range_t(12, 23), fixup_range(&decompress, 16, 24));
+ ASSERT_EQ(range_t(12, 23), fixup_range(&decompress, 16, 999));
+ ASSERT_EQ(range_t(18, 23), fixup_range(&decompress, 998, 999));
}