From dfcb8412cf6ca2bb5a0c9d1f82ee0c120ec304e3 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Fri, 2 Mar 2012 14:56:22 -0800 Subject: [PATCH] rgw: multipart object working with manifest Signed-off-by: Yehuda Sadeh --- src/rgw/rgw_common.h | 5 +++++ src/rgw/rgw_op.cc | 37 +++++++++++++++++-------------------- src/rgw/rgw_rados.cc | 2 ++ 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h index a282c4ea381f8..0d9f9ab86673b 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -710,6 +710,11 @@ public: set_obj(o); orig_key = key = o; } + void init_ns(rgw_bucket& b, std::string& o, std::string& n) { + bucket = b; + set_ns(n); + set_obj(o); + } int set_ns(const char *n) { if (!n) return -EINVAL; diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index b75acd4149e10..68d54a1fa2fbf 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -24,7 +24,6 @@ using namespace std; using ceph::crypto::MD5; static string mp_ns = "multipart"; -static string tmp_ns = "tmp"; static string shadow_ns = "shadow"; class MultipartMetaFilter : public RGWAccessListFilter { @@ -841,8 +840,7 @@ int RGWPutObjProcessor_Multipart::prepare(struct req_state *s) } oid = mp.get_part(part_num); - obj.set_ns(mp_ns); - obj.init(s->bucket, oid, s->object_str); + obj.init(s->bucket, oid, s->object_str, mp_ns); return 0; } @@ -865,6 +863,7 @@ int RGWPutObjProcessor_Multipart::complete(string& etag, map string multipart_meta_obj = mp.get_meta(); rgw_obj meta_obj(s->bucket, multipart_meta_obj, s->object_str, mp_ns); +dout(0) << __FILE__ << ":" << __LINE__ << ": meta_obj=" << meta_obj << dendl; r = rgwstore->tmap_set(meta_obj, p, bl); @@ -1460,8 +1459,7 @@ void RGWCompleteMultipart::execute() rgw_obj meta_obj; rgw_obj target_obj; RGWMPObj mp; - vector ranges; - + RGWObjManifest manifest; ret = get_params(); if (ret < 0) @@ -1538,26 +1536,25 @@ void RGWCompleteMultipart::execute() string oid = mp.get_part(obj_iter->second.num); rgw_obj src_obj(s->bucket, oid, s->object_str, mp_ns); - RGWCloneRangeInfo range; - range.src = src_obj; - range.src_ofs = 0; - range.dst_ofs = ofs; - range.len = obj_iter->second.size; - ranges.push_back(range); + RGWObjManifestPart& part = manifest.objs[ofs]; + + part.loc = src_obj; + part.loc_ofs = 0; + part.size = obj_iter->second.size; - ofs += obj_iter->second.size; + ofs += part.size; } - ret = rgwstore->clone_objs(s->obj_ctx, target_obj, ranges, attrs, RGW_OBJ_CATEGORY_MAIN, NULL, true, false); + + manifest.obj_size = ofs; + + rgwstore->set_atomic(s->obj_ctx, target_obj); + + ret = rgwstore->put_obj_meta(s->obj_ctx, target_obj, ofs, NULL, attrs, + RGW_OBJ_CATEGORY_MAIN, false, NULL, NULL, &manifest); if (ret < 0) goto done; - // now erase all parts - for (obj_iter = obj_parts.begin(); obj_iter != obj_parts.end(); ++obj_iter) { - string oid = mp.get_part(obj_iter->second.num); - rgw_obj obj(s->bucket, oid, s->object_str, mp_ns); - rgwstore->delete_obj(s->obj_ctx, obj); - } - // and also remove the metadata obj + // remove the upload obj meta_obj.init(s->bucket, meta_oid, s->object_str, mp_ns); rgwstore->delete_obj(s->obj_ctx, meta_obj); diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 6b9a21df0b030..82f0271f07670 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -1966,6 +1966,8 @@ int RGWRados::obj_stat(void *ctx, rgw_obj& obj, uint64_t *psize, time_t *pmtime, if (r < 0) return r; + io_ctx.locator_set_key(key); + map attrset; uint64_t size = 0; time_t mtime = 0; -- 2.39.5