summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2013-06-25 14:59:49 -0700
committerYehuda Sadeh <yehuda@inktank.com>2013-06-25 14:59:49 -0700
commitd4e39a7676349607b41445102394409e2eb9ffb4 (patch)
tree55dd24e719b178bd8d7603e7d53f8edcd3a96d13
parent6673b2d3aaf52910858b1d9c57951d4f6c111f4c (diff)
downloadceph-d4e39a7676349607b41445102394409e2eb9ffb4.tar.gz
rgw: unlink/link don't always update entry point
Some operations already update the entry point, so no need to do it again. Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r--src/rgw/rgw_bucket.cc32
-rw-r--r--src/rgw/rgw_bucket.h4
-rw-r--r--src/rgw/rgw_op.cc4
3 files changed, 26 insertions, 14 deletions
diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc
index dd8d06694ee..0426bede76c 100644
--- a/src/rgw/rgw_bucket.cc
+++ b/src/rgw/rgw_bucket.cc
@@ -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;
diff --git a/src/rgw/rgw_bucket.h b/src/rgw/rgw_bucket.h
index 92076cd05f6..c2280815928 100644
--- a/src/rgw/rgw_bucket.h
+++ b/src/rgw/rgw_bucket.h
@@ -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);
diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc
index fce62494566..4d10d838066 100644
--- a/src/rgw/rgw_op.cc
+++ b/src/rgw/rgw_op.cc
@@ -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;
}