From: an.groshev Date: Tue, 15 Jan 2019 12:57:34 +0000 (+0300) Subject: rgw: swift: fix: https://tracker.ceph.com/issues/37765 X-Git-Tag: v15.1.0~1975^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9cbbd63776cfcbcd8011f77be15313ee8d9bc373;p=ceph.git rgw: swift: fix: https://tracker.ceph.com/issues/37765 The meaning is as follows: iterate_slo_parts() set end offset equal to the size of the segment, but RGWRados::iterate_obj args wait offset not size. Signed-off-by: Andrey Groshev --- diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 22cbf01957c9..1f46e8807f09 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -1464,7 +1464,7 @@ static int iterate_slo_parts(CephContext *cct, ent.meta.etag = part.etag; uint64_t cur_total_len = obj_ofs; - uint64_t start_ofs = 0, end_ofs = ent.meta.size; + uint64_t start_ofs = 0, end_ofs = ent.meta.size - 1; if (!found_start && cur_total_len + ent.meta.size > (uint64_t)ofs) { start_ofs = ofs - obj_ofs; @@ -1474,7 +1474,7 @@ static int iterate_slo_parts(CephContext *cct, obj_ofs += ent.meta.size; if (!found_end && obj_ofs > (uint64_t)end) { - end_ofs = end - cur_total_len + 1; + end_ofs = end - cur_total_len; found_end = true; } @@ -1483,6 +1483,12 @@ static int iterate_slo_parts(CephContext *cct, if (found_start) { if (cb) { + dout(20) << "iterate_slo_parts()" + << " obj=" << part.obj_name + << " start_ofs=" << start_ofs + << " end_ofs=" << end_ofs + << dendl; + // SLO is a Swift thing, and Swift has no knowledge of S3 Policies. int r = cb(part.bucket, ent, part.bucket_acl, (part.bucket_policy ? @@ -1709,8 +1715,7 @@ int RGWGetObj::handle_slo_manifest(bufferlist& bl) part.obj_name = obj_name; part.size = entry.size_bytes; part.etag = entry.etag; - ldpp_dout(this, 20) << "slo_part: ofs=" << ofs - << " bucket=" << part.bucket + ldpp_dout(this, 20) << "slo_part: bucket=" << part.bucket << " obj=" << part.obj_name << " size=" << part.size << " etag=" << part.etag @@ -1734,6 +1739,10 @@ int RGWGetObj::handle_slo_manifest(bufferlist& bl) } total_len = end - ofs + 1; + ldpp_dout(this, 20) << "Requested: ofs=" << ofs + << " end=" << end + << " total=" << total_len + << dendl; r = iterate_slo_parts(s->cct, store, ofs, end, slo_parts, get_obj_user_manifest_iterate_cb, (void *)this);