]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: multipart object working with manifest
authorYehuda Sadeh <yehuda@hq.newdream.net>
Fri, 2 Mar 2012 22:56:22 +0000 (14:56 -0800)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Mon, 5 Mar 2012 23:00:27 +0000 (15:00 -0800)
Signed-off-by: Yehuda Sadeh <yehuda@hq.newdream.net>
src/rgw/rgw_common.h
src/rgw/rgw_op.cc
src/rgw/rgw_rados.cc

index a282c4ea381f860dc8b2263374f31a7d211a1036..0d9f9ab86673b716842132d4ccf53390711c8d62 100644 (file)
@@ -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;
index b75acd4149e101e7d5e45bc7c6897f2b46fa0450..68d54a1fa2fbf4fec0b03eee87b6b7fe7ee090d1 100644 (file)
@@ -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, bufferlist>
   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<RGWCloneRangeInfo> 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);
 
index 6b9a21df0b030be2e4d82467147a9e08dba6bb97..82f0271f076703b2d940fd04e67eaf32ce1e630f 100644 (file)
@@ -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<string, bufferlist> attrset;
   uint64_t size = 0;
   time_t mtime = 0;