diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2013-05-13 16:58:28 -0700 |
---|---|---|
committer | Yehuda Sadeh <yehuda@inktank.com> | 2013-05-13 16:58:28 -0700 |
commit | 97a73091b47f06bf02d216949b38045bd8117016 (patch) | |
tree | a6f60057e7571278b9e6129f00b0610ed1bc7d0c | |
parent | d06d0c3bc42c74f49728613b5389b2576571b0e1 (diff) | |
download | ceph-97a73091b47f06bf02d216949b38045bd8117016.tar.gz |
rgw: tie bucket/user removal to mdlog differently
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r-- | src/rgw/rgw_bucket.cc | 6 | ||||
-rw-r--r-- | src/rgw/rgw_bucket.h | 2 | ||||
-rw-r--r-- | src/rgw/rgw_metadata.cc | 85 | ||||
-rw-r--r-- | src/rgw/rgw_metadata.h | 20 | ||||
-rw-r--r-- | src/rgw/rgw_rados.cc | 3 | ||||
-rw-r--r-- | src/rgw/rgw_user.cc | 29 | ||||
-rw-r--r-- | src/rgw/rgw_user.h | 2 |
7 files changed, 82 insertions, 65 deletions
diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index 4690afdc68f..be59ec53623 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -331,6 +331,12 @@ int rgw_remove_bucket(RGWRados *store, rgw_bucket& bucket, bool delete_children) return ret; } +int rgw_bucket_delete_bucket_obj(RGWRados *store, string& bucket_name) +{ + RGWObjVersionTracker objv_tracker; + return store->meta_mgr->remove_entry(bucket_meta_handler, bucket_name, &objv_tracker); +} + static void set_err_msg(std::string *sink, std::string msg) { if (sink && !msg.empty()) diff --git a/src/rgw/rgw_bucket.h b/src/rgw/rgw_bucket.h index e302de9baaf..7f5fa317244 100644 --- a/src/rgw/rgw_bucket.h +++ b/src/rgw/rgw_bucket.h @@ -25,6 +25,8 @@ extern void rgw_get_buckets_obj(string& user_id, string& buckets_obj_id); extern int rgw_bucket_store_info(RGWRados *store, string& bucket_name, bufferlist& bl, bool exclusive, map<string, bufferlist> *pattrs, RGWObjVersionTracker *objv_tracker); +extern int rgw_bucket_delete_bucket_obj(RGWRados *store, string& bucket_name); + /** * Store a list of the user's buckets, with associated functinos. */ diff --git a/src/rgw/rgw_metadata.cc b/src/rgw/rgw_metadata.cc index 8312da6b3cc..d3e39daab19 100644 --- a/src/rgw/rgw_metadata.cc +++ b/src/rgw/rgw_metadata.cc @@ -9,13 +9,6 @@ #define dout_subsys ceph_subsys_rgw -enum RGWMDLogStatus { - MDLOG_STATUS_UNKNOWN, - MDLOG_STATUS_WRITING, - MDLOG_STATUS_REMOVING, - MDLOG_STATUS_COMPLETE, -}; - struct LogStatusDump { RGWMDLogStatus status; @@ -23,11 +16,14 @@ struct LogStatusDump { void dump(Formatter *f) const { string s; switch (status) { - case MDLOG_STATUS_WRITING: - s = "writing"; + case MDLOG_STATUS_WRITE: + s = "write"; + break; + case MDLOG_STATUS_SETATTRS: + s = "set_attrs"; break; - case MDLOG_STATUS_REMOVING: - s = "removing"; + case MDLOG_STATUS_REMOVE: + s = "remove"; break; case MDLOG_STATUS_COMPLETE: s = "complete"; @@ -363,37 +359,7 @@ int RGWMetadataManager::remove(string& metadata_key) objv_tracker.read_version = obj->get_version(); - - RGWMetadataLogData log_data; - bufferlist logbl; - - log_data.read_version = objv_tracker.read_version; - log_data.write_version = objv_tracker.write_version; - - log_data.status = MDLOG_STATUS_REMOVING; - - ::encode(log_data, logbl); - - string section, key; - parse_metadata_key(entry, section, key); - - ret = md_log->add_entry(store, section, key, logbl); - if (ret < 0) - return ret; - - ret = handler->remove(store, entry, objv_tracker); - if (ret < 0) { - return ret; - } - - logbl.clear(); - log_data.status = MDLOG_STATUS_COMPLETE; - - ret = md_log->add_entry(store, section, key, logbl); - if (ret < 0) - return ret; - - return 0; + return handler->remove(store, entry, objv_tracker); } @@ -475,7 +441,8 @@ void RGWMetadataManager::get_sections(list<string>& sections) } int RGWMetadataManager::pre_modify(RGWMetadataHandler *handler, string& section, string& key, - RGWMetadataLogData& log_data, RGWObjVersionTracker *objv_tracker) + RGWMetadataLogData& log_data, RGWObjVersionTracker *objv_tracker, + RGWMDLogStatus op_type) { section = handler->get_type(); @@ -491,7 +458,7 @@ int RGWMetadataManager::pre_modify(RGWMetadataHandler *handler, string& section, log_data.read_version = objv_tracker->read_version; log_data.write_version = objv_tracker->write_version; - log_data.status = MDLOG_STATUS_WRITING; + log_data.status = op_type; bufferlist logbl; ::encode(log_data, logbl); @@ -523,7 +490,7 @@ int RGWMetadataManager::put_entry(RGWMetadataHandler *handler, string& key, buff { string section; RGWMetadataLogData log_data; - int ret = pre_modify(handler, section, key, log_data, objv_tracker); + int ret = pre_modify(handler, section, key, log_data, objv_tracker, MDLOG_STATUS_WRITE); if (ret < 0) return ret; @@ -545,6 +512,32 @@ int RGWMetadataManager::put_entry(RGWMetadataHandler *handler, string& key, buff return 0; } +int RGWMetadataManager::remove_entry(RGWMetadataHandler *handler, string& key, RGWObjVersionTracker *objv_tracker) +{ + string section; + RGWMetadataLogData log_data; + int ret = pre_modify(handler, section, key, log_data, objv_tracker, MDLOG_STATUS_REMOVE); + if (ret < 0) + return ret; + + string oid; + rgw_bucket bucket; + + handler->get_pool_and_oid(store, key, bucket, oid); + + rgw_obj obj(bucket, oid); + + ret = store->delete_obj(NULL, obj); + if (ret < 0) + return ret; + + ret = post_modify(section, key, log_data, objv_tracker); + if (ret < 0) + return ret; + + return 0; +} + int RGWMetadataManager::set_attrs(RGWMetadataHandler *handler, string& key, rgw_obj& obj, map<string, bufferlist>& attrs, map<string, bufferlist>* rmattrs, @@ -552,7 +545,7 @@ int RGWMetadataManager::set_attrs(RGWMetadataHandler *handler, string& key, { string section; RGWMetadataLogData log_data; - int ret = pre_modify(handler, section, key, log_data, objv_tracker); + int ret = pre_modify(handler, section, key, log_data, objv_tracker, MDLOG_STATUS_SETATTRS); if (ret < 0) return ret; diff --git a/src/rgw/rgw_metadata.h b/src/rgw/rgw_metadata.h index 21a37e27cab..46a90b826e8 100644 --- a/src/rgw/rgw_metadata.h +++ b/src/rgw/rgw_metadata.h @@ -16,6 +16,14 @@ class RGWObjVersionTracker; struct obj_version; +enum RGWMDLogStatus { + MDLOG_STATUS_UNKNOWN, + MDLOG_STATUS_WRITE, + MDLOG_STATUS_SETATTRS, + MDLOG_STATUS_REMOVE, + MDLOG_STATUS_COMPLETE, +}; + class RGWMetadataObject { protected: obj_version objv; @@ -103,7 +111,8 @@ class RGWMetadataManager { int find_handler(const string& metadata_key, RGWMetadataHandler **handler, string& entry); int pre_modify(RGWMetadataHandler *handler, string& section, string& key, - RGWMetadataLogData& log_data, RGWObjVersionTracker *objv_tracker); + RGWMetadataLogData& log_data, RGWObjVersionTracker *objv_tracker, + RGWMDLogStatus op_type); int post_modify(string& section, string& key, RGWMetadataLogData& log_data, RGWObjVersionTracker *objv_tracker); @@ -117,12 +126,13 @@ public: int put_entry(RGWMetadataHandler *handler, string& key, bufferlist& bl, bool exclusive, RGWObjVersionTracker *objv_tracker, map<string, bufferlist> *pattrs = NULL); + int remove_entry(RGWMetadataHandler *handler, string& key, RGWObjVersionTracker *objv_tracker); int set_attr(RGWMetadataHandler *handler, string& key, rgw_obj& obj, string& attr, bufferlist& bl, RGWObjVersionTracker *objv_tracker); - int set_attrs(RGWMetadataHandler *handler, string& key, - rgw_obj& obj, map<string, bufferlist>& attrs, - map<string, bufferlist>* rmattrs, - RGWObjVersionTracker *objv_tracker); + int set_attrs(RGWMetadataHandler *handler, string& key, + rgw_obj& obj, map<string, bufferlist>& attrs, + map<string, bufferlist>* rmattrs, + RGWObjVersionTracker *objv_tracker); int get(string& metadata_key, Formatter *f); int put(string& metadata_key, bufferlist& bl); int remove(string& metadata_key); diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index ce778d661e3..d4a5488dcd0 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -2076,8 +2076,7 @@ int RGWRados::delete_bucket(rgw_bucket& bucket) } } while (is_truncated); - rgw_obj obj(zone.domain_root, bucket.name); - r = delete_obj(NULL, obj); + r = rgw_bucket_delete_bucket_obj(this, bucket.name); if (r < 0) return r; diff --git a/src/rgw/rgw_user.cc b/src/rgw/rgw_user.cc index 4bb4369c2d4..219c8f96ba4 100644 --- a/src/rgw/rgw_user.cc +++ b/src/rgw/rgw_user.cc @@ -224,9 +224,17 @@ int rgw_remove_key_index(RGWRados *store, RGWAccessKey& access_key) int rgw_remove_uid_index(RGWRados *store, string& uid) { - rgw_obj obj(store->zone.user_uid_pool, uid); - int ret = store->delete_obj(NULL, obj); - return ret; + RGWObjVersionTracker objv_tracker; + RGWUserInfo info; + int ret = rgw_get_user_info_by_uid(store, uid, info, &objv_tracker); + if (ret < 0) + return ret; + + ret = store->meta_mgr->remove_entry(user_meta_handler, uid, &objv_tracker); + if (ret < 0) + return ret; + + return 0; } int rgw_remove_email_index(RGWRados *store, string& email) @@ -249,7 +257,7 @@ int rgw_remove_swift_name_index(RGWRados *store, string& swift_name) * from the user and user email pools. This leaves the pools * themselves alone, as well as any ACLs embedded in object xattrs. */ -int rgw_delete_user(RGWRados *store, RGWUserInfo& info) { +int rgw_delete_user(RGWRados *store, RGWUserInfo& info, RGWObjVersionTracker& objv_tracker) { string marker; vector<rgw_bucket> buckets_vec; @@ -319,7 +327,7 @@ int rgw_delete_user(RGWRados *store, RGWUserInfo& info) { rgw_obj uid_obj(store->zone.user_uid_pool, info.user_id); ldout(store->ctx(), 10) << "removing user index: " << info.user_id << dendl; - ret = store->delete_obj(NULL, uid_obj); + ret = store->meta_mgr->remove_entry(user_meta_handler, info.user_id, &objv_tracker); if (ret < 0 && ret != -ENOENT) { ldout(store->ctx(), 0) << "ERROR: could not remove " << info.user_id << ":" << uid_obj << ", should be fixed (err=" << ret << ")" << dendl; return ret; @@ -1748,7 +1756,9 @@ int RGWUser::execute_remove(RGWUserAdminOpState& op_state, std::string *err_msg) done = (m.size() < max_buckets); } while (!done); - ret = rgw_delete_user(store, user_info); + RGWObjVersionTracker objv_tracker; + + ret = rgw_delete_user(store, user_info, objv_tracker); if (ret < 0) { set_err_msg(err_msg, "unable to remove user from RADOS"); return ret; @@ -2276,15 +2286,12 @@ public: }; int remove(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker) { -#warning FIXME: use objv_tracker - RGWUserInfo info; - RGWObjVersionTracker ot; - int ret = rgw_get_user_info_by_uid(store, entry, info, &ot); + int ret = rgw_get_user_info_by_uid(store, entry, info, &objv_tracker); if (ret < 0) return ret; - return rgw_delete_user(store, info); + return rgw_delete_user(store, info, objv_tracker); } void get_pool_and_oid(RGWRados *store, string& key, rgw_bucket& bucket, string& oid) { diff --git a/src/rgw/rgw_user.h b/src/rgw/rgw_user.h index aca835bbb0f..3fe632599b5 100644 --- a/src/rgw/rgw_user.h +++ b/src/rgw/rgw_user.h @@ -75,7 +75,7 @@ extern int rgw_get_user_info_by_access_key(RGWRados *store, string& access_key, /** * Given an RGWUserInfo, deletes the user and its bucket ACLs. */ -extern int rgw_delete_user(RGWRados *store, RGWUserInfo& user); +extern int rgw_delete_user(RGWRados *store, RGWUserInfo& user, RGWObjVersionTracker& objv_tracker); /** * Store a list of the user's buckets, with associated functinos. */ |