From a6afb0519b2b4e79370fff0991a110f8ef930129 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Fri, 10 Jun 2011 10:07:55 -0700 Subject: [PATCH] rgw: remove required indexes when modifying user info Conflicts: src/rgw/rgw_admin.cc --- src/rgw/rgw_admin.cc | 44 +++++++++++++++++++++++++++++++++++++++++++- src/rgw/rgw_user.cc | 22 ++++++++++++++++++---- src/rgw/rgw_user.h | 9 ++++++++- 3 files changed, 69 insertions(+), 6 deletions(-) diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index 0199d301161c1..0972d20474575 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -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::iterator kiter; map::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; diff --git a/src/rgw/rgw_user.cc b/src/rgw/rgw_user.cc index 85c690265d811..6fcb34adb2765 100644 --- a/src/rgw/rgw_user.cc +++ b/src/rgw/rgw_user.cc @@ -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::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); diff --git a/src/rgw/rgw_user.h b/src/rgw/rgw_user.h index d0aa14fc0c544..75f93c8508105 100644 --- a/src/rgw/rgw_user.h +++ b/src/rgw/rgw_user.h @@ -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 -- 2.39.5