diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2013-06-25 14:59:49 -0700 |
---|---|---|
committer | Yehuda Sadeh <yehuda@inktank.com> | 2013-06-25 14:59:49 -0700 |
commit | d4e39a7676349607b41445102394409e2eb9ffb4 (patch) | |
tree | 55dd24e719b178bd8d7603e7d53f8edcd3a96d13 | |
parent | 6673b2d3aaf52910858b1d9c57951d4f6c111f4c (diff) | |
download | ceph-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.cc | 32 | ||||
-rw-r--r-- | src/rgw/rgw_bucket.h | 4 | ||||
-rw-r--r-- | src/rgw/rgw_op.cc | 4 |
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; } |