]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: unlink/link don't always update entry point
authorYehuda Sadeh <yehuda@inktank.com>
Tue, 25 Jun 2013 21:59:49 +0000 (14:59 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Tue, 25 Jun 2013 21:59:49 +0000 (14:59 -0700)
Some operations already update the entry point, so no
need to do it again.

Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/rgw/rgw_bucket.cc
src/rgw/rgw_bucket.h
src/rgw/rgw_op.cc

index dd8d06694eeef2372d60bc7070283d3843e03b8e..0426bede76c1ffe1ea7883046f662c75633408b5 100644 (file)
@@ -73,7 +73,7 @@ int rgw_read_user_buckets(RGWRados *store, string user_id, RGWUserBuckets& bucke
   return 0;
 }
 
-int rgw_link_bucket(RGWRados *store, string user_id, rgw_bucket& bucket, time_t creation_time)
+int rgw_link_bucket(RGWRados *store, string user_id, rgw_bucket& bucket, time_t creation_time, bool update_entrypoint)
 {
   int ret;
   string& bucket_name = bucket.name;
@@ -93,12 +93,14 @@ int rgw_link_bucket(RGWRados *store, string user_id, rgw_bucket& bucket, time_t
     new_bucket.creation_time = creation_time;
   ::encode(new_bucket, bl);
 
-  ret = store->get_bucket_entrypoint_info(NULL, bucket_name, ep, &ot, NULL);
-  if (ret < 0 && ret != -ENOENT) {
-    ldout(store->ctx(), 0) << "ERROR: store->get_bucket_entrypoint_info() returned " << ret << dendl;
-  } else if (ret >= 0 && ep.linked && ep.owner != user_id) {
-    ldout(store->ctx(), 0) << "can't link bucket, already linked to a different user: " << ep.owner << dendl;
-    return -EINVAL;
+  if (update_entrypoint) {
+    ret = store->get_bucket_entrypoint_info(NULL, bucket_name, ep, &ot, NULL);
+    if (ret < 0 && ret != -ENOENT) {
+      ldout(store->ctx(), 0) << "ERROR: store->get_bucket_entrypoint_info() returned " << ret << dendl;
+    } else if (ret >= 0 && ep.linked && ep.owner != user_id) {
+      ldout(store->ctx(), 0) << "can't link bucket, already linked to a different user: " << ep.owner << dendl;
+      return -EINVAL;
+    }
   }
 
   string buckets_obj_id;
@@ -112,6 +114,9 @@ int rgw_link_bucket(RGWRados *store, string user_id, rgw_bucket& bucket, time_t
     goto done_err;
   }
 
+  if (!update_entrypoint)
+    return false;
+
   ep.linked = true;
   ep.owner = user_id;
   ret = store->put_bucket_entrypoint_info(bucket_name, ep, false, ot, 0);
@@ -127,7 +132,7 @@ done_err:
   return ret;
 }
 
-int rgw_unlink_bucket(RGWRados *store, string user_id, const string& bucket_name)
+int rgw_unlink_bucket(RGWRados *store, string user_id, const string& bucket_name, bool update_entrypoint)
 {
   int ret;
 
@@ -143,9 +148,14 @@ int rgw_unlink_bucket(RGWRados *store, string user_id, const string& bucket_name
         << cpp_strerror(-ret)<< dendl;
   }
 
+  if (!update_entrypoint)
+    return false;
+
   RGWBucketEntryPoint ep;
   RGWObjVersionTracker ot;
   ret = store->get_bucket_entrypoint_info(NULL, bucket_name, ep, &ot, NULL);
+  if (ret == -ENOENT)
+    return 0;
   if (ret < 0)
     return ret;
 
@@ -1354,15 +1364,17 @@ public:
     if (ret < 0 && ret != -ENOENT)
       return ret;
 
+    objv_tracker.read_version = old_ot.read_version; /* maintain the obj version we just read */
+
     ret = store->put_bucket_entrypoint_info(entry, be, false, objv_tracker, mtime);
     if (ret < 0)
       return ret;
 
     /* link bucket */
     if (be.linked) {
-      ret = rgw_link_bucket(store, be.owner, be.bucket, be.creation_time);
+      ret = rgw_link_bucket(store, be.owner, be.bucket, be.creation_time, false);
     } else {
-      ret = rgw_unlink_bucket(store, be.owner, be.bucket.name);
+      ret = rgw_unlink_bucket(store, be.owner, be.bucket.name, false);
     }
 
     return 0;
index 92076cd05f66a154d7d608e9159fe750dbc5be5d..c2280815928ad852ddb3edd79c4cd7e803f17dda 100644 (file)
@@ -99,8 +99,8 @@ extern void rgw_bucket_init(RGWMetadataManager *mm);
 extern int rgw_read_user_buckets(RGWRados *store, string user_id, RGWUserBuckets& buckets,
                                  const string& marker, uint64_t max, bool need_stats);
 
-extern int rgw_link_bucket(RGWRados *store, string user_id, rgw_bucket& bucket, time_t creation_time);
-extern int rgw_unlink_bucket(RGWRados *store, string user_id, const string& bucket_name);
+extern int rgw_link_bucket(RGWRados *store, string user_id, rgw_bucket& bucket, time_t creation_time, bool update_entrypoint = true);
+extern int rgw_unlink_bucket(RGWRados *store, string user_id, const string& bucket_name, bool update_entrypoint = true);
 
 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 fce6249456639a7cb32d1304d8625c602c6c9516..4d10d838066d60eba9beff01684c225f51e497e5 100644 (file)
@@ -1031,7 +1031,7 @@ void RGWCreateBucket::execute()
     s->bucket = info.bucket;
   }
 
-  ret = rgw_link_bucket(store, s->user.user_id, s->bucket, info.creation_time);
+  ret = rgw_link_bucket(store, s->user.user_id, s->bucket, info.creation_time, false);
   if (ret && !existed && ret != -EEXIST)   /* if it exists (or previously existed), don't remove it! */
     rgw_unlink_bucket(store, s->user.user_id, s->bucket.name);
 
@@ -1067,7 +1067,7 @@ void RGWDeleteBucket::execute()
   ret = store->delete_bucket(s->bucket, objv_tracker);
 
   if (ret == 0) {
-    ret = rgw_unlink_bucket(store, s->user.user_id, s->bucket.name);
+    ret = rgw_unlink_bucket(store, s->user.user_id, s->bucket.name, false);
     if (ret < 0) {
       ldout(s->cct, 0) << "WARNING: failed to remove bucket: ret=" << ret << dendl;
     }