]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: remove required indexes when modifying user info
authorYehuda Sadeh <yehuda@hq.newdream.net>
Fri, 10 Jun 2011 17:07:55 +0000 (10:07 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Fri, 10 Jun 2011 17:23:39 +0000 (10:23 -0700)
Conflicts:

src/rgw/rgw_admin.cc

src/rgw/rgw_admin.cc
src/rgw/rgw_user.cc
src/rgw/rgw_user.h

index 0199d301161c1aed1763829695b220ff2e3d0e28..0972d20474575910757b44ecd934ae8b6ced5d68 100644 (file)
@@ -317,6 +317,44 @@ done:
   return ret;
 }
 
+static void remove_old_indexes(RGWUserInfo& old_info, RGWUserInfo new_info)
+{
+  int ret;
+  bool success = true;
+
+  if (!old_info.user_id.empty() && old_info.user_id.compare(new_info.user_id) != 0) {
+    ret = rgw_remove_uid_index(old_info.user_id);
+    if (ret < 0 && ret != -ENOENT) {
+      cerr << "ERROR: could not remove index for uid " << old_info.user_id << " return code: " << ret << std::endl;
+      success = false;
+    }
+  }
+
+  if (!old_info.user_email.empty() &&
+      old_info.user_email.compare(new_info.user_email) != 0) {
+    ret = rgw_remove_email_index(new_info.user_id, old_info.user_email);
+    if (ret < 0 && ret != -ENOENT) {
+      cerr << "ERROR: could not remove index for email " << old_info.user_email << " return code: " << ret << std::endl;
+      success = false;
+    }
+  }
+
+  if (!old_info.openstack_name.empty() &&
+      old_info.openstack_name.compare(new_info.openstack_name) != 0) {
+    ret = rgw_remove_openstack_name_index(new_info.user_id, old_info.openstack_name);
+    if (ret < 0 && ret != -ENOENT) {
+      cerr << "ERROR: could not remove index for openstack_name " << old_info.openstack_name << " return code: " << ret << std::endl;
+      success = false;
+    }
+  }
+
+  /* we're not removing access keys here.. keys are removed explicitly using the key rm command and removing the old key
+     index is handled there */
+
+  if (!success)
+    cerr << "ERROR: this should be fixed manually!" << std::endl;
+}
+
 int main(int argc, char **argv) 
 {
   DEFINE_CONF_VARS(usage);
@@ -546,6 +584,8 @@ int main(int argc, char **argv)
 
   map<string, RGWAccessKey>::iterator kiter;
   map<string, RGWSubUser>::iterator uiter;
+  RGWUserInfo old_info = info;
+
   int err;
   switch (opt_cmd) {
   case OPT_USER_CREATE:
@@ -588,6 +628,8 @@ int main(int argc, char **argv)
       break;
     }
 
+    remove_old_indexes(old_info, info);
+
     show_user_info(info);
     break;
 
@@ -607,7 +649,7 @@ int main(int argc, char **argv)
     if (kiter == info.access_keys.end()) {
       cerr << "key not found" << std::endl;
     } else {
-      rgw_remove_key_storage(kiter->second);
+      rgw_remove_key_index(kiter->second);
       info.access_keys.erase(kiter);
       if ((err = rgw_store_user_info(info)) < 0) {
         cerr << "error storing user info: " << cpp_strerror(-err) << std::endl;
index 85c690265d8116c5c9b04a942df75f7c525549b5..6fcb34adb27658d10c0cef20bce6c54cb13182b2 100644 (file)
@@ -384,10 +384,24 @@ int rgw_remove_bucket(string user_id, string bucket_name)
   return ret;
 }
 
-int rgw_remove_key_storage(RGWAccessKey& access_key)
+int rgw_remove_key_index(RGWAccessKey& access_key)
 {
-  rgwstore->delete_obj(access_key.id, ui_key_bucket, access_key.id);
-  return 0;
+  return rgwstore->delete_obj(access_key.id, ui_key_bucket, access_key.id);
+}
+
+int rgw_remove_uid_index(string& uid)
+{
+  return rgwstore->delete_obj(uid, ui_uid_bucket, uid);
+}
+
+int rgw_remove_email_index(string& uid, string& email)
+{
+  return rgwstore->delete_obj(uid, ui_email_bucket, email);
+}
+
+int rgw_remove_openstack_name_index(string& uid, string& openstack_name)
+{
+  return rgwstore->delete_obj(uid, ui_openstack_bucket, openstack_name);
 }
 
 /**
@@ -408,7 +422,7 @@ int rgw_delete_user(RGWUserInfo& info) {
   }
   map<string, RGWAccessKey>::iterator kiter = info.access_keys.begin();
   for (; kiter != info.access_keys.end(); ++kiter)
-    rgw_remove_key_storage(kiter->second);
+    rgw_remove_key_index(kiter->second);
 
   rgwstore->delete_obj(info.user_id, ui_uid_bucket, info.user_id);
   rgwstore->delete_obj(info.user_id, ui_email_bucket, info.user_email);
index d0aa14fc0c5449789c9e71f99d5b2f6fd69fcb2c..75f93c8508105691a4ec17bfc67244b3acf5b5a6 100644 (file)
@@ -133,6 +133,13 @@ extern int rgw_write_buckets_attr(string user_id, RGWUserBuckets& buckets);
 extern int rgw_add_bucket(string user_id, string bucket_name);
 extern int rgw_remove_bucket(string user_id, string bucket_name);
 
-extern int rgw_remove_key_storage(RGWAccessKey& access_key);
+
+/*
+ * remove the different indexes
+  */
+extern int rgw_remove_key_index(RGWAccessKey& access_key);
+extern int rgw_remove_uid_index(string& uid);
+extern int rgw_remove_email_index(string& uid, string& email);
+extern int rgw_remove_openstack_name_index(string& uid, string& openstack_name);
 
 #endif