diff options
author | Yehuda Sadeh <yehuda@hq.newdream.net> | 2011-09-01 13:37:17 -0700 |
---|---|---|
committer | Yehuda Sadeh <yehuda@hq.newdream.net> | 2011-09-01 13:38:19 -0700 |
commit | 2aad7c2028e1085e0a49dacc6191913db4006a5d (patch) | |
tree | 5ddadbd022afc3b62271b6b09c019f3b800942f6 | |
parent | e09d4a96025f58f370f30b0aa61d88b2173074e4 (diff) | |
download | ceph-2aad7c2028e1085e0a49dacc6191913db4006a5d.tar.gz |
rgw: multipart meta object uses tmap
-rw-r--r-- | src/rgw/rgw_access.h | 2 | ||||
-rw-r--r-- | src/rgw/rgw_bucket.cc | 7 | ||||
-rw-r--r-- | src/rgw/rgw_op.cc | 25 | ||||
-rw-r--r-- | src/rgw/rgw_rados.cc | 11 | ||||
-rw-r--r-- | src/rgw/rgw_rados.h | 2 |
5 files changed, 24 insertions, 23 deletions
diff --git a/src/rgw/rgw_access.h b/src/rgw/rgw_access.h index 63e199df168..9a7a19623a7 100644 --- a/src/rgw/rgw_access.h +++ b/src/rgw/rgw_access.h @@ -232,7 +232,7 @@ public: virtual bool supports_tmap() { return false; } - virtual int tmap_get(rgw_obj& obj, bufferlist& bl) { return -ENOTSUP; } + virtual int tmap_get(rgw_obj& obj, bufferlist& header, std::map<string, bufferlist>& m) { return -ENOTSUP; } virtual int tmap_set(rgw_obj& obj, std::string& key, bufferlist& bl) { return -ENOTSUP; } virtual int tmap_set(rgw_obj& obj, map<std::string, bufferlist>& m) { return -ENOTSUP; } virtual int tmap_create(rgw_obj& obj, std::string& key, bufferlist& bl) { return -ENOTSUP; } diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index a1c440fee3b..c8ceccde9b0 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -145,13 +145,12 @@ static int withdraw_pool(string& pool_name) int rgw_bucket_allocate_pool(string& bucket_name, rgw_bucket& bucket) { - bufferlist bl; bufferlist header; map<string, bufferlist> m; string pool_name; rgw_obj obj(pi_buckets, avail_pools); - int ret = rgwstore->tmap_get(obj, bl); + int ret = rgwstore->tmap_get(obj, header, m); if (ret < 0) { if (ret == -ENOENT) { return generate_pool(bucket_name, bucket); @@ -159,10 +158,6 @@ int rgw_bucket_allocate_pool(string& bucket_name, rgw_bucket& bucket) return ret; } - bufferlist::iterator iter = bl.begin(); - ::decode(header, iter); - ::decode(m, iter); - if (!m.size()) { return generate_pool(bucket_name, bucket); } diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index b357fb2683a..2de13f89fd8 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -749,7 +749,6 @@ void RGWPutObj::execute() goto done_err; bl.clear(); - map<string, bufferlist> meta_attrs; RGWUploadPartInfo info; string p = "part."; p.append(part_num); @@ -758,13 +757,10 @@ void RGWPutObj::execute() info.size = s->obj_size; info.modified = ceph_clock_now(g_ceph_context); ::encode(info, bl); - meta_attrs[p] = bl; rgw_obj meta_obj(s->bucket, multipart_meta_obj, s->object_str, mp_ns); - // we don't set a category, since by now a category should have already been assigned - string nocategory; - ret = rgwstore->put_obj_meta(s->obj_ctx, s->user.user_id, meta_obj, NULL, meta_attrs, nocategory, false); + ret = rgwstore->tmap_set(meta_obj, p, bl); } } done: @@ -1191,11 +1187,12 @@ done: } static int get_multiparts_info(struct req_state *s, string& meta_oid, map<uint32_t, RGWUploadPartInfo>& parts, - RGWAccessControlPolicy& policy, map<string, bufferlist>& new_attrs) + RGWAccessControlPolicy& policy, map<string, bufferlist>& attrs) { void *handle; - map<string, bufferlist> attrs; + map<string, bufferlist> parts_map; map<string, bufferlist>::iterator iter; + bufferlist header; rgw_obj obj(s->bucket, meta_oid, s->object_str, mp_ns); @@ -1206,20 +1203,22 @@ static int get_multiparts_info(struct req_state *s, string& meta_oid, map<uint32 if (ret < 0) return ret; + ret = rgwstore->tmap_get(obj, header, parts_map); + if (ret < 0) + return ret; + for (iter = attrs.begin(); iter != attrs.end(); ++iter) { string name = iter->first; if (name.compare(RGW_ATTR_ACL) == 0) { bufferlist& bl = iter->second; bufferlist::iterator bli = bl.begin(); ::decode(policy, bli); - new_attrs[RGW_ATTR_ACL] = bl; - continue; - } - if (name.compare(0, 5, "part.") != 0) { - new_attrs[iter->first] = iter->second; - continue; + break; } + } + + for (iter = parts_map.begin(); iter != parts_map.end(); ++iter) { bufferlist& bl = iter->second; bufferlist::iterator bli = bl.begin(); RGWUploadPartInfo info; diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index f9bc8e6c5a2..ddc59b7e172 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -1473,8 +1473,9 @@ int RGWRados::get_bucket_stats(rgw_bucket& bucket, map<string, RGWBucketStats>& return 0; } -int RGWRados::tmap_get(rgw_obj& obj, bufferlist& bl) +int RGWRados::tmap_get(rgw_obj& obj, bufferlist& header, std::map<string, bufferlist>& m) { + bufferlist bl; librados::IoCtx io_ctx; rgw_bucket& bucket = obj.bucket; std::string& oid = obj.object; @@ -1485,8 +1486,14 @@ int RGWRados::tmap_get(rgw_obj& obj, bufferlist& bl) io_ctx.locator_set_key(obj.key); r = io_ctx.tmap_get(oid, bl); + if (r < 0) + return r; - return r; + bufferlist::iterator iter = bl.begin(); + ::decode(header, iter); + ::decode(m, iter); + + return 0; } diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index a78ff5a5d9a..2cbaaa70340 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -228,7 +228,7 @@ public: virtual int get_bucket_id(rgw_bucket& bucket, uint64_t *bucket_id); virtual bool supports_tmap() { return true; } - virtual int tmap_get(rgw_obj& obj, bufferlist& bl); + virtual int tmap_get(rgw_obj& obj, bufferlist& header, std::map<string, bufferlist>& m); virtual int tmap_set(rgw_obj& obj, std::string& key, bufferlist& bl); virtual int tmap_set(rgw_obj& obj, map<std::string, bufferlist>& m); virtual int tmap_create(rgw_obj& obj, std::string& key, bufferlist& bl); |