]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: get wrong content when download object with specific range when 16178/head
authorfang.yuxiang <fang.yuxiang@eisoo.com>
Sat, 27 May 2017 07:20:30 +0000 (15:20 +0800)
committerNathan Cutler <ncutler@suse.com>
Thu, 6 Jul 2017 17:16:24 +0000 (19:16 +0200)
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 <fang.yuxiang@eisoo.com>
(cherry picked from commit afe9d99570059b88837690950a4f4525e0e60262)

src/rgw/rgw_compression.cc
src/test/rgw/test_rgw_compression.cc

index 6c48039b74199d77789b454e9aa66e0f67c957e4..3649601379e663a042c0c3439105559ea7c0ca39 100644 (file)
@@ -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<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,
@@ -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;
index 0720f3ce79a3ee85687c4bc95c8087b910c23a2c..a95ec7fc8cb9dbb7f9f7f23441f715c029b5d4f6 100644 (file)
@@ -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));
 }