summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2013-02-06 16:43:48 -0800
committerYehuda Sadeh <yehuda@inktank.com>2013-02-07 13:55:17 -0800
commita00c77abe2b11bbcf41b73f30cc39a41c6e71ca6 (patch)
treeddb5087e90e8f56ffdc7fb51546becbca290634f
parent784547943bf0b118d1f6e9da81aad2c405fcb770 (diff)
downloadceph-a00c77abe2b11bbcf41b73f30cc39a41c6e71ca6.tar.gz
rgw: bucket recreation should not clobber bucket info
Fixes: #4039 User's list of buckets is getting modified even if bucket already exists. This fix removes the newly created directory object, and makes sure that user info's data points at the correct bucket. Signed-off-by: Yehuda Sadeh <yehuda@inktank.com> Reviewed-by: Greg Farnum <greg@inktank.com> (cherry picked from commit 9d006ec40ced9d97b590ee07ca9171f0c9bec6e9) Conflicts: src/rgw/rgw_op.cc src/rgw/rgw_rados.cc
-rw-r--r--src/rgw/rgw_op.cc21
-rw-r--r--src/rgw/rgw_rados.cc3
2 files changed, 24 insertions, 0 deletions
diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc
index cfb7d177926..eb22223a442 100644
--- a/src/rgw/rgw_op.cc
+++ b/src/rgw/rgw_op.cc
@@ -834,6 +834,27 @@ void RGWCreateBucket::execute()
existed = (ret == -EEXIST);
+ if (existed) {
+ /* bucket already existed, might have raced with another bucket creation, or
+ * might be partial bucket creation that never completed. Read existing bucket
+ * info, verify that the reported bucket owner is the current user.
+ * If all is ok then update the user's list of buckets
+ */
+ RGWBucketInfo info;
+ map<string, bufferlist> attrs;
+ int r = store->get_bucket_info(NULL, s->bucket.name, info, &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;
+ return;
+ }
+ if (info.owner.compare(s->user.user_id) != 0) {
+ ret = -ERR_BUCKET_EXISTS;
+ return;
+ }
+ s->bucket = info.bucket;
+ }
+
ret = rgw_add_bucket(store, s->user.user_id, s->bucket);
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);
diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc
index dfec5387fea..80f0cd8c4e0 100644
--- a/src/rgw/rgw_rados.cc
+++ b/src/rgw/rgw_rados.cc
@@ -805,6 +805,9 @@ int RGWRados::create_bucket(string& owner, rgw_bucket& bucket,
info.bucket = bucket;
info.owner = owner;
ret = store_bucket_info(info, &attrs, exclusive);
+ if (ret == -EEXIST) {
+ io_ctx.remove(dir_oid);
+ }
return ret;
}