From 842f3ac683b09d3e5bb30bb64c028e6824c8643d 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 --- src/rgw/rgw_admin.cc | 44 +++++++++++++++++++++++++++++++++++++++++++- src/rgw/rgw_user.cc | 29 +++++++++++++++++++++++++---- src/rgw/rgw_user.h | 9 ++++++++- 3 files changed, 76 insertions(+), 6 deletions(-) diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index 410fc4daac592..595e69885eb01 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -236,6 +236,44 @@ static void show_user_info( RGWUserInfo& info) cout << "OpenStack Key: " << (info.openstack_key.size() ? info.openstack_key : "")<< std::endl; } +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); @@ -465,6 +503,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: @@ -507,6 +547,8 @@ int main(int argc, char **argv) break; } + remove_old_indexes(old_info, info); + show_user_info(info); break; @@ -526,7 +568,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 0704b407e768d..ac03fd4482223 100644 --- a/src/rgw/rgw_user.cc +++ b/src/rgw/rgw_user.cc @@ -393,11 +393,32 @@ 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) { rgw_obj obj(ui_key_bucket, access_key.id); - rgwstore->delete_obj(access_key.id, obj); - return 0; + int ret = rgwstore->delete_obj(access_key.id, obj); + return ret; +} + +int rgw_remove_uid_index(string& uid) +{ + rgw_obj obj(ui_uid_bucket, uid); + int ret = rgwstore->delete_obj(uid, obj); + return ret; +} + +int rgw_remove_email_index(string& uid, string& email) +{ + rgw_obj obj(ui_email_bucket, email); + int ret = rgwstore->delete_obj(uid, obj); + return ret; +} + +int rgw_remove_openstack_name_index(string& uid, string& openstack_name) +{ + rgw_obj obj(ui_openstack_bucket, openstack_name); + int ret = rgwstore->delete_obj(uid, obj); + return ret; } /** @@ -419,7 +440,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); rgw_obj uid_obj(ui_uid_bucket, info.user_id); rgwstore->delete_obj(info.user_id, uid_obj); 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