From 009c844e34bcd3e4e34eace90f90a140484e2794 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Mon, 12 Oct 2015 18:43:27 +0200 Subject: [PATCH] rgw: fix wrong length in Content-Range HTTP header of Swift's DLO. Fixes: #13452 Signed-off-by: Radoslaw Zarzynski (cherry picked from commit b48f3d774129e0b37531fccda513626bd8ef07e5) --- src/rgw/rgw_op.cc | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 02545cd202837..069ff78078346 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -738,11 +738,12 @@ int RGWGetObj::read_user_manifest_part(rgw_bucket& bucket, RGWObjEnt& ent, RGWAc static int iterate_user_manifest_parts(CephContext *cct, RGWRados *store, off_t ofs, off_t end, rgw_bucket& bucket, string& obj_prefix, RGWAccessControlPolicy *bucket_policy, uint64_t *ptotal_len, + uint64_t *pobj_size, int (*cb)(rgw_bucket& bucket, RGWObjEnt& ent, RGWAccessControlPolicy *bucket_policy, off_t start_ofs, off_t end_ofs, void *param), void *cb_param) { uint64_t obj_ofs = 0, len_count = 0; - bool found_start = false, found_end = false; + bool found_start = false, found_end = false, handled_end = false; string delim; bool is_truncated; vector objs; @@ -763,7 +764,7 @@ static int iterate_user_manifest_parts(CephContext *cct, RGWRados *store, off_t vector::iterator viter; - for (viter = objs.begin(); viter != objs.end() && !found_end; ++viter) { + for (viter = objs.begin(); viter != objs.end(); ++viter) { RGWObjEnt& ent = *viter; uint64_t cur_total_len = obj_ofs; uint64_t start_ofs = 0, end_ofs = ent.size; @@ -783,7 +784,7 @@ static int iterate_user_manifest_parts(CephContext *cct, RGWRados *store, off_t perfcounter->tinc(l_rgw_get_lat, (ceph_clock_now(cct) - start_time)); - if (found_start) { + if (found_start && !handled_end) { len_count += end_ofs - start_ofs; if (cb) { @@ -793,12 +794,16 @@ static int iterate_user_manifest_parts(CephContext *cct, RGWRados *store, off_t } } + handled_end = found_end; start_time = ceph_clock_now(cct); } - } while (is_truncated && !found_end); + } while (is_truncated); if (ptotal_len) *ptotal_len = len_count; + if (pobj_size) { + *pobj_size = obj_ofs; + } return 0; } @@ -855,19 +860,17 @@ int RGWGetObj::handle_user_manifest(const char *prefix) } /* dry run to find out total length */ - int r = iterate_user_manifest_parts(s->cct, store, ofs, end, bucket, obj_prefix, bucket_policy, &total_len, NULL, NULL); + int r = iterate_user_manifest_parts(s->cct, store, ofs, end, bucket, obj_prefix, bucket_policy, &total_len, &s->obj_size, NULL, NULL); if (r < 0) return r; - s->obj_size = total_len; - if (!get_data) { bufferlist bl; send_response_data(bl, 0, 0); return 0; } - r = iterate_user_manifest_parts(s->cct, store, ofs, end, bucket, obj_prefix, bucket_policy, NULL, get_obj_user_manifest_iterate_cb, (void *)this); + r = iterate_user_manifest_parts(s->cct, store, ofs, end, bucket, obj_prefix, bucket_policy, NULL, NULL, get_obj_user_manifest_iterate_cb, (void *)this); if (r < 0) return r; -- 2.39.5