summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2013-05-09 14:13:24 -0700
committerYehuda Sadeh <yehuda@inktank.com>2013-05-09 14:13:24 -0700
commit0557e6c1027ac5f08d8d2f93c2fc443de4df6ce4 (patch)
tree2d7f6d697ed2c062193d5be83593e2e93f1b65bc
parent619a68a396d3a4b6dbcebcce75932a65b7788915 (diff)
downloadceph-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.cc4
-rw-r--r--src/rgw/rgw_bucket.cc30
-rw-r--r--src/rgw/rgw_bucket.h2
-rw-r--r--src/rgw/rgw_main.cc2
-rw-r--r--src/rgw/rgw_op.cc16
-rw-r--r--src/rgw/rgw_rados.cc39
-rw-r--r--src/rgw/rgw_rados.h6
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,