summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2013-05-13 16:58:28 -0700
committerYehuda Sadeh <yehuda@inktank.com>2013-05-13 16:58:28 -0700
commit97a73091b47f06bf02d216949b38045bd8117016 (patch)
treea6f60057e7571278b9e6129f00b0610ed1bc7d0c
parentd06d0c3bc42c74f49728613b5389b2576571b0e1 (diff)
downloadceph-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.cc6
-rw-r--r--src/rgw/rgw_bucket.h2
-rw-r--r--src/rgw/rgw_metadata.cc85
-rw-r--r--src/rgw/rgw_metadata.h20
-rw-r--r--src/rgw/rgw_rados.cc3
-rw-r--r--src/rgw/rgw_user.cc29
-rw-r--r--src/rgw/rgw_user.h2
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.
*/