]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: unlink bucket from user on metadata rm bucket:< bucket>
authorYehuda Sadeh <yehuda@inktank.com>
Tue, 25 Jun 2013 19:19:17 +0000 (12:19 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Tue, 25 Jun 2013 19:19:17 +0000 (12:19 -0700)
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/rgw/rgw_bucket.cc
src/rgw/rgw_bucket.h
src/rgw/rgw_op.cc
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h

index 1e3a17ae6fe833a0c5444333e4aeea7ad2833eba..22727f2558d1fafc46c4848d23a34fffb327b588 100644 (file)
@@ -102,7 +102,7 @@ int rgw_add_bucket(RGWRados *store, string user_id, rgw_bucket& bucket, time_t c
   return ret;
 }
 
-int rgw_remove_user_bucket_info(RGWRados *store, string user_id, rgw_bucket& bucket)
+int rgw_remove_user_bucket_info(RGWRados *store, string user_id, const string& bucket_name)
 {
   int ret;
 
@@ -112,7 +112,7 @@ int rgw_remove_user_bucket_info(RGWRados *store, string user_id, rgw_bucket& buc
   rgw_get_buckets_obj(user_id, buckets_obj_id);
 
   rgw_obj obj(store->zone.user_uid_pool, buckets_obj_id);
-  ret = store->omap_del(obj, bucket.name);
+  ret = store->omap_del(obj, bucket_name);
   if (ret < 0) {
     ldout(store->ctx(), 0) << "ERROR: error removing bucket from directory: "
         << cpp_strerror(-ret)<< dendl;
@@ -350,7 +350,7 @@ int rgw_remove_bucket(RGWRados *store, rgw_bucket& bucket, bool delete_children)
     return ret;
   }
 
-  ret = rgw_remove_user_bucket_info(store, info.owner, bucket);
+  ret = rgw_remove_user_bucket_info(store, info.owner, bucket.name);
   if (ret < 0) {
     lderr(store->ctx()) << "ERROR: unable to remove user bucket information" << dendl;
   }
@@ -437,7 +437,7 @@ int RGWBucket::link(RGWBucketAdminOpState& op_state, std::string *err_msg)
       return -EIO;
     }
 
-    r = rgw_remove_user_bucket_info(store, owner.get_id(), bucket);
+    r = rgw_remove_user_bucket_info(store, owner.get_id(), bucket.name);
     if (r < 0) {
       set_err_msg(err_msg, "could not unlink policy from user " + owner.get_id());
       return r;
@@ -493,7 +493,7 @@ int RGWBucket::unlink(RGWBucketAdminOpState& op_state, std::string *err_msg)
     return -EINVAL;
   }
 
-  int r = rgw_remove_user_bucket_info(store, user_info.user_id, bucket);
+  int r = rgw_remove_user_bucket_info(store, user_info.user_id, bucket.name);
   if (r < 0) {
     set_err_msg(err_msg, "error unlinking bucket" + cpp_strerror(-r));
   }
@@ -1389,14 +1389,23 @@ public:
   };
 
   int remove(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker) {
-    rgw_bucket bucket;
-    int r = init_bucket(store, entry, bucket, &objv_tracker);
-    if (r < 0) {
-      cerr << "could not init bucket=" << entry << std::endl;
-      return r;
+    RGWBucketEntryPoint be;
+
+    int ret = store->get_bucket_entrypoint_info(NULL, entry, be, &objv_tracker, NULL);
+    if (ret < 0)
+      return ret;
+
+    ret = rgw_remove_user_bucket_info(store, be.owner, entry);
+    if (ret < 0) {
+      lderr(store->ctx()) << "could not unlink bucket=" << entry << " owner=" << be.owner << dendl;
     }
 
-    return store->delete_bucket(bucket, objv_tracker);
+    ret = rgw_bucket_delete_bucket_obj(store, entry, objv_tracker);
+    if (ret < 0) {
+      lderr(store->ctx()) << "could not delete bucket=" << entry << dendl;
+    }
+    /* idempotent */
+    return 0;
   }
 
   void get_pool_and_oid(RGWRados *store, string& key, rgw_bucket& bucket, string& oid) {
index 2a87e9b097b357f07ce05afaffae23a522f4159f..2e6ed69d7ca8030b4e907a7ba77266366c22fa0e 100644 (file)
@@ -100,7 +100,7 @@ extern int rgw_read_user_buckets(RGWRados *store, string user_id, RGWUserBuckets
                                  const string& marker, uint64_t max, bool need_stats);
 
 extern int rgw_add_bucket(RGWRados *store, string user_id, rgw_bucket& bucket, time_t creation_time);
-extern int rgw_remove_user_bucket_info(RGWRados *store, string user_id, rgw_bucket& bucket);
+extern int rgw_remove_user_bucket_info(RGWRados *store, string user_id, const string& bucket_name);
 
 extern int rgw_remove_object(RGWRados *store, rgw_bucket& bucket, std::string& object);
 extern int rgw_remove_bucket(RGWRados *store, rgw_bucket& bucket, bool delete_children);
index d4eaeccdbebb25f9bfff1079653917382276ce5d..43d2206eace613ef216388980c262f2b2f118668 100644 (file)
@@ -1033,7 +1033,7 @@ void RGWCreateBucket::execute()
 
   ret = rgw_add_bucket(store, s->user.user_id, s->bucket, info.creation_time);
   if (ret && !existed && ret != -EEXIST)   /* if it exists (or previously existed), don't remove it! */
-    rgw_remove_user_bucket_info(store, s->user.user_id, s->bucket);
+    rgw_remove_user_bucket_info(store, s->user.user_id, s->bucket.name);
 
   if (ret == -EEXIST)
     ret = -ERR_BUCKET_EXISTS;
@@ -1067,7 +1067,7 @@ void RGWDeleteBucket::execute()
   ret = store->delete_bucket(s->bucket, objv_tracker);
 
   if (ret == 0) {
-    ret = rgw_remove_user_bucket_info(store, s->user.user_id, s->bucket);
+    ret = rgw_remove_user_bucket_info(store, s->user.user_id, s->bucket.name);
     if (ret < 0) {
       ldout(s->cct, 0) << "WARNING: failed to remove bucket: ret=" << ret << dendl;
     }
index f54927c4fa2552483f7230227fe1088cbd34537b..ad49fc962f4b225cc6f7334ab7eb25aa04ed3742 100644 (file)
@@ -4701,7 +4701,7 @@ int RGWRados::omap_set(rgw_obj& obj, std::map<std::string, bufferlist>& m)
   return r;
 }
 
-int RGWRados::omap_del(rgw_obj& obj, std::string& key)
+int RGWRados::omap_del(rgw_obj& obj, const std::string& key)
 {
   rgw_bucket bucket;
   std::string oid, okey;
index b9a4a0944a3f072650f3323606444ca74c946667..3b3ab67f0e606ea6083daea94517120e6ee6d93f 100644 (file)
@@ -1234,7 +1234,7 @@ public:
   virtual int omap_get_all(rgw_obj& obj, bufferlist& header, std::map<string, bufferlist>& m);
   virtual int omap_set(rgw_obj& obj, std::string& key, bufferlist& bl);
   virtual int omap_set(rgw_obj& obj, map<std::string, bufferlist>& m);
-  virtual int omap_del(rgw_obj& obj, std::string& key);
+  virtual int omap_del(rgw_obj& obj, const std::string& key);
   virtual int update_containers_stats(map<string, RGWBucketEnt>& m);
   virtual int append_async(rgw_obj& obj, size_t size, bufferlist& bl);