]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: tie bucket/user removal to mdlog differently
authorYehuda Sadeh <yehuda@inktank.com>
Mon, 13 May 2013 23:58:28 +0000 (16:58 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Mon, 13 May 2013 23:58:28 +0000 (16:58 -0700)
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/rgw/rgw_bucket.cc
src/rgw/rgw_bucket.h
src/rgw/rgw_metadata.cc
src/rgw/rgw_metadata.h
src/rgw/rgw_rados.cc
src/rgw/rgw_user.cc
src/rgw/rgw_user.h

index 4690afdc68f368a0d8ba755266bce63556e9d958..be59ec5362362679101c979df1e980c6ecae1281 100644 (file)
@@ -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())
index e302de9baafae3f4031df5015b091fed13fe6edb..7f5fa31724497c2ee21831002946813b56490db5 100644 (file)
@@ -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.
  */
index 8312da6b3ccedde91ef058804529d0f124a3c76d..d3e39daab19ba2778bf6a8aaca25f442f215c87e 100644 (file)
@@ -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;
 
index 21a37e27cab172c5167cda4cb4d85ddb370fd96e..46a90b826e8bb7b0d33fe3cb8e2d136b6b665749 100644 (file)
@@ -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);
index ce778d661e3b49211dac2f5f72a04b000e2634f5..d4a5488dcd0458d3bb5f640c3e3d2dc92715b23e 100644 (file)
@@ -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;
 
index 4bb4369c2d4f18be16d756b35621f42fe0ef2a91..219c8f96ba4a38a5fea5ae9f690a8e463a9f950b 100644 (file)
@@ -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) {
index aca835bbb0f7ef6e790a590e6b2b2db0f40ff3a7..3fe632599b57aeb143e957d5285b1af623ec3bee 100644 (file)
@@ -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.
  */