diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2013-05-09 14:13:24 -0700 |
---|---|---|
committer | Yehuda Sadeh <yehuda@inktank.com> | 2013-05-09 14:13:24 -0700 |
commit | 0557e6c1027ac5f08d8d2f93c2fc443de4df6ce4 (patch) | |
tree | 2d7f6d697ed2c062193d5be83593e2e93f1b65bc | |
parent | 619a68a396d3a4b6dbcebcce75932a65b7788915 (diff) | |
download | ceph-0557e6c1027ac5f08d8d2f93c2fc443de4df6ce4.tar.gz |
rgw: bucket metadata operations go through metadata handler
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r-- | src/rgw/rgw_admin.cc | 4 | ||||
-rw-r--r-- | src/rgw/rgw_bucket.cc | 30 | ||||
-rw-r--r-- | src/rgw/rgw_bucket.h | 2 | ||||
-rw-r--r-- | src/rgw/rgw_main.cc | 2 | ||||
-rw-r--r-- | src/rgw/rgw_op.cc | 16 | ||||
-rw-r--r-- | src/rgw/rgw_rados.cc | 39 | ||||
-rw-r--r-- | src/rgw/rgw_rados.h | 6 |
7 files changed, 53 insertions, 46 deletions
diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index 678aed5b373..344cbdbdc69 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -438,7 +438,7 @@ static void dump_bucket_usage(map<RGWObjCategory, RGWBucketStats>& stats, Format int bucket_stats(rgw_bucket& bucket, Formatter *formatter) { RGWBucketInfo bucket_info; - int r = store->get_bucket_info(NULL, bucket.name, bucket_info); + int r = store->get_bucket_info(NULL, bucket.name, bucket_info, NULL); if (r < 0) return r; @@ -478,7 +478,7 @@ static int init_bucket(string& bucket_name, rgw_bucket& bucket) { if (!bucket_name.empty()) { RGWBucketInfo bucket_info; - int r = store->get_bucket_info(NULL, bucket_name, bucket_info); + int r = store->get_bucket_info(NULL, bucket_name, bucket_info, NULL); if (r < 0) { cerr << "could not get bucket info for bucket=" << bucket_name << std::endl; return r; diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index 95be53fa759..53f6bf96c9f 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -135,6 +135,12 @@ int rgw_remove_user_bucket_info(RGWRados *store, string user_id, rgw_bucket& buc return ret; } +int rgw_bucket_store_info(RGWRados *store, string& bucket_name, bufferlist& bl, bool exclusive, + map<string, bufferlist> *pattrs, RGWObjVersionTracker *objv_tracker) { + return store->meta_mgr->put_entry(bucket_meta_handler, bucket_name, bl, exclusive, objv_tracker, pattrs); +} + + int RGWBucket::create_bucket(string bucket_str, string& user_id, string& display_name) { RGWAccessControlPolicy policy, old_policy; @@ -150,7 +156,9 @@ int RGWBucket::create_bucket(string bucket_str, string& user_id, string& display policy.create_default(user_id, display_name); policy.encode(aclbl); - ret = store->get_bucket_info(NULL, bucket_str, bucket_info); + RGWObjVersionTracker objv_tracker; + + ret = store->get_bucket_info(NULL, bucket_str, bucket_info, &objv_tracker); if (ret < 0) return ret; @@ -218,7 +226,8 @@ void check_bad_user_bucket_mapping(RGWRados *store, const string& user_id, bool rgw_bucket& bucket = bucket_ent.bucket; RGWBucketInfo bucket_info; - int r = store->get_bucket_info(NULL, bucket.name, bucket_info); + RGWObjVersionTracker objv_tracker; + int r = store->get_bucket_info(NULL, bucket.name, bucket_info, &objv_tracker); if (r < 0) { ldout(store->ctx(), 0) << "could not get bucket info for bucket=" << bucket << dendl; continue; @@ -355,7 +364,8 @@ int RGWBucket::init(RGWRados *storage, RGWBucketAdminOpState& op_state) return -EINVAL; if (!bucket_name.empty()) { - int r = store->get_bucket_info(NULL, bucket_name, bucket_info); + RGWObjVersionTracker objv_tracker; + int r = store->get_bucket_info(NULL, bucket_name, bucket_info, &objv_tracker); if (r < 0) { ldout(store->ctx(), 0) << "could not get bucket info for bucket=" << bucket_name << dendl; return r; @@ -839,7 +849,8 @@ static int bucket_stats(RGWRados *store, std::string& bucket_name, Formatter *f rgw_bucket bucket; map<RGWObjCategory, RGWBucketStats> stats; - int r = store->get_bucket_info(NULL, bucket_name, bucket_info); + RGWObjVersionTracker objv_tracker; + int r = store->get_bucket_info(NULL, bucket_name, bucket_info, &objv_tracker); if (r < 0) return r; @@ -1266,9 +1277,9 @@ public: class RGWBucketMetadataHandler : public RGWMetadataHandler { - int init_bucket(RGWRados *store, string& bucket_name, rgw_bucket& bucket) { + int init_bucket(RGWRados *store, string& bucket_name, rgw_bucket& bucket, RGWObjVersionTracker *objv_tracker) { RGWBucketInfo bucket_info; - int r = store->get_bucket_info(NULL, bucket_name, bucket_info); + int r = store->get_bucket_info(NULL, bucket_name, bucket_info, objv_tracker); if (r < 0) { cerr << "could not get bucket info for bucket=" << bucket_name << std::endl; return r; @@ -1286,8 +1297,7 @@ public: RGWObjVersionTracker objv_tracker; - - int ret = store->get_bucket_info(NULL, entry, bci.info, &bci.attrs); + int ret = store->get_bucket_info(NULL, entry, bci.info, &objv_tracker, &bci.attrs); if (ret < 0) return ret; @@ -1303,7 +1313,7 @@ public: decode_json_obj(bci, obj); - int ret = store->put_bucket_info(entry, bci.info, false, &bci.attrs); + int ret = store->put_bucket_info(entry, bci.info, false, &objv_tracker, &bci.attrs); if (ret < 0) return ret; @@ -1318,7 +1328,7 @@ public: int remove(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker) { #warning FIXME: use objv_tracker rgw_bucket bucket; - int r = init_bucket(store, entry, bucket); + int r = init_bucket(store, entry, bucket, &objv_tracker); if (r < 0) { cerr << "could not init bucket=" << entry << std::endl; return r; diff --git a/src/rgw/rgw_bucket.h b/src/rgw/rgw_bucket.h index 0994baba488..d8915e364a8 100644 --- a/src/rgw/rgw_bucket.h +++ b/src/rgw/rgw_bucket.h @@ -22,6 +22,8 @@ using namespace std; // define as static when RGWBucket implementation compete extern void rgw_get_buckets_obj(string& user_id, string& buckets_obj_id); +extern int rgw_bucket_store_info(RGWRados *store, string& bucket_name, bufferlist& bl, bool exclusive, + map<string, bufferlist> *pattrs, RGWObjVersionTracker *objv_tracker); /** * Store a list of the user's buckets, with associated functinos. diff --git a/src/rgw/rgw_main.cc b/src/rgw/rgw_main.cc index 66cfc73c3d8..57c6c5781ce 100644 --- a/src/rgw/rgw_main.cc +++ b/src/rgw/rgw_main.cc @@ -463,6 +463,8 @@ int main(int argc, const char **argv) if (r) return 1; + rgw_user_init(store->meta_mgr); + rgw_bucket_init(store->meta_mgr); rgw_log_usage_init(g_ceph_context, store); RGWREST rest; diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index ff4f5177acf..d1bba263c91 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -213,7 +213,8 @@ static int get_policy_from_attr(CephContext *cct, RGWRados *store, void *ctx, RG /* object exists, but policy is broken */ RGWBucketInfo info; RGWUserInfo uinfo; - int r = store->get_bucket_info(ctx, obj.bucket.name, info); + RGWObjVersionTracker objv_tracker; + int r = store->get_bucket_info(ctx, obj.bucket.name, info, &objv_tracker); if (r < 0) goto done; r = rgw_get_user_info_by_uid(store, info.owner, uinfo); @@ -295,7 +296,8 @@ int rgw_build_policies(RGWRados *store, struct req_state *s, bool only_bucket, b RGWBucketInfo bucket_info; if (s->bucket_name_str.size()) { - ret = store->get_bucket_info(s->obj_ctx, s->bucket_name_str, bucket_info); + RGWObjVersionTracker objv_tracker; + ret = store->get_bucket_info(s->obj_ctx, s->bucket_name_str, bucket_info, &objv_tracker); if (ret < 0) { ldout(s->cct, 0) << "NOTICE: couldn't get bucket from bucket_name (name=" << s->bucket_name_str << ")" << dendl; return ret; @@ -496,7 +498,8 @@ int RGWGetObj::handle_user_manifest(const char *prefix) if (bucket_name.compare(s->bucket.name) != 0) { RGWBucketInfo bucket_info; - int r = store->get_bucket_info(NULL, bucket_name, bucket_info); + RGWObjVersionTracker objv_tracker; + int r = store->get_bucket_info(NULL, bucket_name, bucket_info, &objv_tracker); if (r < 0) { ldout(s->cct, 0) << "could not get bucket info for bucket=" << bucket_name << dendl; return r; @@ -881,7 +884,8 @@ void RGWCreateBucket::execute() */ RGWBucketInfo info; map<string, bufferlist> attrs; - int r = store->get_bucket_info(NULL, s->bucket.name, info, &attrs); + RGWObjVersionTracker objv_tracker; + int r = store->get_bucket_info(NULL, s->bucket.name, info, &objv_tracker, &attrs); if (r < 0) { ldout(s->cct, 0) << "ERROR: get_bucket_info on bucket=" << s->bucket.name << " returned err=" << r << " after create_bucket returned -EEXIST" << dendl; ret = r; @@ -1662,7 +1666,7 @@ int RGWCopyObj::verify_permission() /* get buckets info (source and dest) */ - ret = store->get_bucket_info(s->obj_ctx, src_bucket_name, src_bucket_info); + ret = store->get_bucket_info(s->obj_ctx, src_bucket_name, src_bucket_info, NULL); if (ret < 0) return ret; @@ -1671,7 +1675,7 @@ int RGWCopyObj::verify_permission() if (src_bucket_name.compare(dest_bucket_name) == 0) { dest_bucket_info = src_bucket_info; } else { - ret = store->get_bucket_info(s->obj_ctx, dest_bucket_name, dest_bucket_info); + ret = store->get_bucket_info(s->obj_ctx, dest_bucket_name, dest_bucket_info, NULL); if (ret < 0) return ret; } diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 1d5b6e5dd4a..7b4606652ec 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -1316,7 +1316,7 @@ int RGWRados::create_pool(rgw_bucket& bucket) * returns 0 on success, -ERR# otherwise. */ int RGWRados::create_bucket(string& owner, rgw_bucket& bucket, - map<std::string, bufferlist>& attrs, + map<std::string, bufferlist>& attrs, bool exclusive) { int ret = 0; @@ -1356,10 +1356,11 @@ int RGWRados::create_bucket(string& owner, rgw_bucket& bucket, if (r < 0 && r != -EEXIST) return r; + RGWObjVersionTracker objv_tracker; RGWBucketInfo info; info.bucket = bucket; info.owner = owner; - ret = store_bucket_info(info, &attrs, exclusive); + ret = put_bucket_info(bucket.name, info, exclusive, &objv_tracker, &attrs); if (ret == -EEXIST) { index_ctx.remove(dir_oid); } @@ -1367,20 +1368,6 @@ int RGWRados::create_bucket(string& owner, rgw_bucket& bucket, return ret; } -int RGWRados::store_bucket_info(RGWBucketInfo& info, map<string, bufferlist> *pattrs, bool exclusive) -{ - bufferlist bl; - ::encode(info, bl); - - int ret = rgw_put_system_obj(this, zone.domain_root, info.bucket.name, bl.c_str(), bl.length(), exclusive, NULL, pattrs); - if (ret < 0) - return ret; - - ldout(cct, 20) << "store_bucket_info: bucket=" << info.bucket << " owner " << info.owner << dendl; - return 0; -} - - int RGWRados::select_bucket_placement(string& bucket_name, rgw_bucket& bucket) { bufferlist map_bl; @@ -2110,7 +2097,8 @@ int RGWRados::set_bucket_owner(rgw_bucket& bucket, ACLOwner& owner) { RGWBucketInfo info; map<string, bufferlist> attrs; - int r = get_bucket_info(NULL, bucket.name, info, &attrs); + RGWObjVersionTracker objv_tracker; + int r = get_bucket_info(NULL, bucket.name, info, &objv_tracker, &attrs); if (r < 0) { ldout(cct, 0) << "NOTICE: get_bucket_info on bucket=" << bucket.name << " returned err=" << r << dendl; return r; @@ -2118,7 +2106,7 @@ int RGWRados::set_bucket_owner(rgw_bucket& bucket, ACLOwner& owner) info.owner = owner.get_id(); - r = put_bucket_info(bucket.name, info, false, &attrs); + r = put_bucket_info(bucket.name, info, false, &objv_tracker, &attrs); if (r < 0) { ldout(cct, 0) << "NOTICE: put_bucket_info on bucket=" << bucket.name << " returned err=" << r << dendl; return r; @@ -2142,8 +2130,9 @@ int RGWRados::set_buckets_enabled(vector<rgw_bucket>& buckets, bool enabled) ldout(cct, 20) << "disabling bucket name=" << bucket.name << dendl; RGWBucketInfo info; + RGWObjVersionTracker objv_tracker; map<string, bufferlist> attrs; - int r = get_bucket_info(NULL, bucket.name, info, &attrs); + int r = get_bucket_info(NULL, bucket.name, info, &objv_tracker, &attrs); if (r < 0) { ldout(cct, 0) << "NOTICE: get_bucket_info on bucket=" << bucket.name << " returned err=" << r << ", skipping bucket" << dendl; ret = r; @@ -2155,7 +2144,7 @@ int RGWRados::set_buckets_enabled(vector<rgw_bucket>& buckets, bool enabled) info.flags |= BUCKET_SUSPENDED; } - r = put_bucket_info(bucket.name, info, false, &attrs); + r = put_bucket_info(bucket.name, info, false, &objv_tracker, &attrs); if (r < 0) { ldout(cct, 0) << "NOTICE: put_bucket_info on bucket=" << bucket.name << " returned err=" << r << ", skipping bucket" << dendl; ret = r; @@ -2168,7 +2157,7 @@ int RGWRados::set_buckets_enabled(vector<rgw_bucket>& buckets, bool enabled) int RGWRados::bucket_suspended(rgw_bucket& bucket, bool *suspended) { RGWBucketInfo bucket_info; - int ret = get_bucket_info(NULL, bucket.name, bucket_info); + int ret = get_bucket_info(NULL, bucket.name, bucket_info, NULL); if (ret < 0) { return ret; } @@ -3768,11 +3757,11 @@ int RGWRados::get_bucket_stats(rgw_bucket& bucket, uint64_t *bucket_ver, uint64_ return 0; } -int RGWRados::get_bucket_info(void *ctx, string& bucket_name, RGWBucketInfo& info, map<string, bufferlist> *pattrs) +int RGWRados::get_bucket_info(void *ctx, string& bucket_name, RGWBucketInfo& info, RGWObjVersionTracker *objv_tracker, map<string, bufferlist> *pattrs) { bufferlist bl; - int ret = rgw_get_system_obj(this, ctx, zone.domain_root, bucket_name, bl, NULL, pattrs); + int ret = rgw_get_system_obj(this, ctx, zone.domain_root, bucket_name, bl, objv_tracker, pattrs); if (ret < 0) { if (ret != -ENOENT) return ret; @@ -3796,13 +3785,13 @@ int RGWRados::get_bucket_info(void *ctx, string& bucket_name, RGWBucketInfo& inf return 0; } -int RGWRados::put_bucket_info(string& bucket_name, RGWBucketInfo& info, bool exclusive, map<string, bufferlist> *pattrs) +int RGWRados::put_bucket_info(string& bucket_name, RGWBucketInfo& info, bool exclusive, RGWObjVersionTracker *objv_tracker, map<string, bufferlist> *pattrs) { bufferlist bl; ::encode(info, bl); - int ret = rgw_put_system_obj(this, zone.domain_root, bucket_name, bl.c_str(), bl.length(), exclusive, NULL, pattrs); + int ret = rgw_bucket_store_info(this, info.bucket.name, bl, exclusive, pattrs, objv_tracker); return ret; } diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 175870dfa0c..99a2a4c9e25 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -546,7 +546,7 @@ class RGWRados int update_placement_map(); int select_bucket_placement(std::string& bucket_name, rgw_bucket& bucket); - int store_bucket_info(RGWBucketInfo& info, map<string, bufferlist> *pattrs, bool exclusive); + int store_bucket_info(RGWBucketInfo& info, map<string, bufferlist> *pattrs, RGWObjVersionTracker *objv_tracker, bool exclusive); protected: CephContext *cct; @@ -945,8 +945,8 @@ public: int decode_policy(bufferlist& bl, ACLOwner *owner); int get_bucket_stats(rgw_bucket& bucket, uint64_t *bucket_ver, uint64_t *master_ver, map<RGWObjCategory, RGWBucketStats>& stats); - virtual int get_bucket_info(void *ctx, string& bucket_name, RGWBucketInfo& info, map<string, bufferlist> *pattrs = NULL); - virtual int put_bucket_info(string& bucket_name, RGWBucketInfo& info, bool exclusive, map<string, bufferlist> *pattrs); + virtual int get_bucket_info(void *ctx, string& bucket_name, RGWBucketInfo& info, RGWObjVersionTracker *objv_tracker, map<string, bufferlist> *pattrs = NULL); + virtual int put_bucket_info(string& bucket_name, RGWBucketInfo& info, bool exclusive, RGWObjVersionTracker *objv_tracker, map<string, bufferlist> *pattrs); int cls_rgw_init_index(librados::IoCtx& io_ctx, librados::ObjectWriteOperation& op, string& oid); int cls_obj_prepare_op(rgw_bucket& bucket, RGWModifyOp op, string& tag, |