From: fang.yuxiang Date: Sat, 27 May 2017 07:20:30 +0000 (+0800) Subject: rgw: get wrong content when download object with specific range when X-Git-Tag: v11.2.1~23^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=640a7a26296e652ffb8b8bfab87839d7bfd66d1b;p=ceph.git rgw: get wrong content when download object with specific range when compression was enabled look at the prototype: RGWGetObj_Decompress::handle_data(bufferlist& bl, off_t bl_ofs, off_t bl_len) we should trim the bl using bl_ofs and bl_len. Fixes: http://tracker.ceph.com/issues/20100 Signed-off-by: fang yuxiang (cherry picked from commit afe9d99570059b88837690950a4f4525e0e60262) --- diff --git a/src/rgw/rgw_compression.cc b/src/rgw/rgw_compression.cc index 6c48039b74199..3649601379e66 100644 --- a/src/rgw/rgw_compression.cc +++ b/src/rgw/rgw_compression.cc @@ -76,17 +76,18 @@ int RGWGetObj_Decompress::handle_data(bufferlist& bl, off_t bl_ofs, off_t bl_len 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; @@ -130,7 +131,7 @@ void RGWGetObj_Decompress::fixup_range(off_t& ofs, off_t& end) vector::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, @@ -150,7 +151,7 @@ void RGWGetObj_Decompress::fixup_range(off_t& ofs, off_t& end) 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; diff --git a/src/test/rgw/test_rgw_compression.cc b/src/test/rgw/test_rgw_compression.cc index 0720f3ce79a3e..a95ec7fc8cb9d 100644 --- a/src/test/rgw/test_rgw_compression.cc +++ b/src/test/rgw/test_rgw_compression.cc @@ -36,15 +36,15 @@ TEST(Decompress, FixupRangePartial) 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)); }