From a5f8cc7ec9ec8bef4fbc656066b4d3a08e5b215b Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Mon, 6 Jan 2014 18:32:42 -0800 Subject: [PATCH] rgw: convert bucket info if needed Fixes: #7110 In dumpling, the bucket info was separated into bucket entry point and bucket instance objects. When setting bucket attrs we only ended up updating the bucket instance object. However, pre-dumpling buckets still keep everything at the entry-point object, so acl changes didn't affect anything (because we never updated the entry point). This change just converts the bucket info into the new format. Signed-off-by: Yehuda Sadeh --- src/rgw/rgw_bucket.cc | 12 +++++++++++- src/rgw/rgw_bucket.h | 2 +- src/rgw/rgw_op.cc | 4 ++-- src/rgw/rgw_rados.cc | 35 +++++++++++++++++++++++++++++++++++ src/rgw/rgw_rados.h | 1 + 5 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index 5481b67ba4527..d0e9627cededa 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -194,11 +194,21 @@ int rgw_bucket_instance_remove_entry(RGWRados *store, string& entry, RGWObjVersi return store->meta_mgr->remove_entry(bucket_instance_meta_handler, entry, objv_tracker); } -int rgw_bucket_set_attrs(RGWRados *store, rgw_bucket& bucket, +int rgw_bucket_set_attrs(RGWRados *store, RGWBucketInfo& bucket_info, map& attrs, map* rmattrs, RGWObjVersionTracker *objv_tracker) { + rgw_bucket& bucket = bucket_info.bucket; + + if (!bucket_info.has_instance_obj) { + /* an old bucket object, need to convert it */ + int ret = store->convert_old_bucket_info(NULL, bucket.name); + if (ret < 0) { + ldout(store->ctx(), 0) << "ERROR: failed converting old bucket info: " << ret << dendl; + return ret; + } + } string oid; store->get_bucket_meta_oid(bucket, oid); rgw_obj obj(store->zone.domain_root, oid); diff --git a/src/rgw/rgw_bucket.h b/src/rgw/rgw_bucket.h index 47795403dc6c0..d84a8a13fe2ea 100644 --- a/src/rgw/rgw_bucket.h +++ b/src/rgw/rgw_bucket.h @@ -105,7 +105,7 @@ extern int rgw_unlink_bucket(RGWRados *store, string user_id, const string& buck 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); -extern int rgw_bucket_set_attrs(RGWRados *store, rgw_bucket& obj, +extern int rgw_bucket_set_attrs(RGWRados *store, RGWBucketInfo& bucket_info, map& attrs, map* rmattrs, RGWObjVersionTracker *objv_tracker); diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index dbc30a9c5f45f..25c6b339878ee 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -1702,7 +1702,7 @@ void RGWPutMetadata::execute() if (s->object) { ret = store->set_attrs(s->obj_ctx, obj, attrs, &rmattrs, ptracker); } else { - ret = rgw_bucket_set_attrs(store, obj.bucket, attrs, &rmattrs, ptracker); + ret = rgw_bucket_set_attrs(store, s->bucket_info, attrs, &rmattrs, ptracker); } } @@ -2021,7 +2021,7 @@ void RGWPutACLs::execute() if (s->object) { ret = store->set_attrs(s->obj_ctx, obj, attrs, NULL, ptracker); } else { - ret = rgw_bucket_set_attrs(store, obj.bucket, attrs, NULL, ptracker); + ret = rgw_bucket_set_attrs(store, s->bucket_info, attrs, NULL, ptracker); } } diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index ac9503a306f47..a2515b587b32f 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -4819,6 +4819,41 @@ int RGWRados::get_bucket_entrypoint_info(void *ctx, const string& bucket_name, return 0; } +int RGWRados::convert_old_bucket_info(void *ctx, string& bucket_name) +{ + RGWBucketEntryPoint entry_point; + time_t ep_mtime; + RGWObjVersionTracker ot; + map attrs; + RGWBucketInfo info; + + ldout(cct, 10) << "RGWRados::convert_old_bucket_info(): bucket=" << bucket_name << dendl; + + int ret = get_bucket_entrypoint_info(ctx, bucket_name, entry_point, &ot, &ep_mtime, &attrs); + if (ret < 0) { + ldout(cct, 0) << "ERROR: get_bucket_entrypont_info() returned " << ret << " bucket=" << bucket_name << dendl; + return ret; + } + + if (!entry_point.has_bucket_info) { + /* already converted! */ + return 0; + } + + info = entry_point.old_bucket_info; + info.bucket.oid = bucket_name; + info.ep_objv = ot.read_version; + + ot.generate_new_write_ver(cct); + + ret = put_linked_bucket_info(info, false, ep_mtime, &ot.write_version, &attrs, true); + if (ret < 0) { + ldout(cct, 0) << "ERROR: failed to put_linked_bucket_info(): " << ret << dendl; + } + + return 0; +} + int RGWRados::get_bucket_info(void *ctx, string& bucket_name, RGWBucketInfo& info, time_t *pmtime, map *pattrs) { diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index b0b39ecc2fd80..67c540eb5d3a3 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -1337,6 +1337,7 @@ public: int get_bucket_instance_info(void *ctx, rgw_bucket& bucket, RGWBucketInfo& info, time_t *pmtime, map *pattrs); int get_bucket_instance_from_oid(void *ctx, string& oid, RGWBucketInfo& info, time_t *pmtime, map *pattrs); + int convert_old_bucket_info(void *ctx, string& bucket_name); virtual int get_bucket_info(void *ctx, string& bucket_name, RGWBucketInfo& info, time_t *pmtime, map *pattrs = NULL); virtual int put_linked_bucket_info(RGWBucketInfo& info, bool exclusive, time_t mtime, obj_version *pep_objv, -- 2.39.5