]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: bucket metadata operations go through metadata handler
authorYehuda Sadeh <yehuda@inktank.com>
Thu, 9 May 2013 21:13:24 +0000 (14:13 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Thu, 9 May 2013 21:13:24 +0000 (14:13 -0700)
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/rgw/rgw_admin.cc
src/rgw/rgw_bucket.cc
src/rgw/rgw_bucket.h
src/rgw/rgw_main.cc
src/rgw/rgw_op.cc
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h

index 678aed5b3735a6a67b336ff5117c1f587539c8f4..344cbdbdc690ea206ec0d4920f11de88584939d0 100644 (file)
@@ -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;
index 95be53fa7595c1bff8cd3d618306cdea45e252d1..53f6bf96c9f6c4125e0383c43fa76c7e83f9d42c 100644 (file)
@@ -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;
index 0994baba488a950cc6bac82ea6018fa42d49907b..d8915e364a83cdc9b58edaa48a47da6bf28203a0 100644 (file)
@@ -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.
index 66cfc73c3d8dfe8a579630773ef0e33fad880b4d..57c6c5781cec8b242ed59a045f293052bd60454a 100644 (file)
@@ -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;
index ff4f5177acf57037249a024b5a24416cfece84a6..d1bba263c9184b4281a0d1b76db5e1e1633c5d65 100644 (file)
@@ -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;
   }
index 1d5b6e5dd4a842e9c84ee338361893f2c48793b7..7b4606652ecb0d6fae3438766815e5fb3465a46c 100644 (file)
@@ -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;
 }
index 175870dfa0ce1ae32d38ab6eb387d21e737d9f74..99a2a4c9e258d71bc80cd8342cf4c8ccc080e365 100644 (file)
@@ -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,