From 2d757ac056d4fd8f75c352bff6e754f4b6d00825 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Wed, 13 Jul 2011 15:56:05 -0700 Subject: [PATCH] rgw: unwatch cache sync object before exiting --- src/rgw/rgw_access.cc | 9 +++++++ src/rgw/rgw_access.h | 17 ++++++++++++ src/rgw/rgw_admin.cc | 63 ++++++++++++++++++++++++------------------- src/rgw/rgw_main.cc | 4 ++- src/rgw/rgw_rados.cc | 5 ++++ src/rgw/rgw_rados.h | 1 + 6 files changed, 70 insertions(+), 29 deletions(-) diff --git a/src/rgw/rgw_access.cc b/src/rgw/rgw_access.cc index 60a7dea3ca4fc..b27613acd083f 100644 --- a/src/rgw/rgw_access.cc +++ b/src/rgw/rgw_access.cc @@ -33,3 +33,12 @@ RGWAccess *RGWAccess::init_storage_provider(const char *type, CephContext *cct) return store; } + +void RGWAccess::close_storage() +{ + if (!store) + return; + + store->finalize(); + store = NULL; +} diff --git a/src/rgw/rgw_access.h b/src/rgw/rgw_access.h index 6d5dd20296faf..ecc994c0951ed 100644 --- a/src/rgw/rgw_access.h +++ b/src/rgw/rgw_access.h @@ -32,6 +32,7 @@ public: virtual ~RGWAccess(); /** do all necessary setup of the storage device */ virtual int initialize(CephContext *cct) = 0; + virtual void finalize() {} /** prepare a listing of all buckets. */ virtual int list_buckets_init(std::string& id, RGWAccessHandle *handle) = 0; /** get the next bucket in the provided listing context. */ @@ -234,9 +235,25 @@ public: * with the given arguments. */ static RGWAccess *init_storage_provider(const char *type, CephContext *cct); + static void close_storage(); static RGWAccess *store; }; +class RGWStoreManager { + RGWAccess *store; +public: + RGWStoreManager() : store(NULL) {} + ~RGWStoreManager() { + if (store) + RGWAccess::close_storage(); + } + RGWAccess *init(const char *type, CephContext *cct) { + store = RGWAccess::init_storage_provider(type, cct); + return store; + } + +}; + #define rgwstore RGWAccess::store diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index 3402aeb4f5468..913607eb14e02 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -26,7 +26,7 @@ using namespace std; static RGWFormatter_XML formatter_xml; static RGWFormatter_JSON formatter_json; -void usage() +void _usage() { cerr << "usage: radosgw_admin [options...]" << std::endl; cerr << "commands:\n"; @@ -74,9 +74,15 @@ void usage() generic_client_usage(); } +int usage() +{ + _usage(); + return 1; +} + void usage_exit() { - usage(); + _usage(); exit(1); } @@ -349,7 +355,7 @@ static void remove_old_indexes(RGWUserInfo& old_info, RGWUserInfo new_info) int main(int argc, char **argv) { - DEFINE_CONF_VARS(usage); + DEFINE_CONF_VARS(_usage); vector args; argv_to_vec(argc, (const char **)argv, args); env_to_vec(args); @@ -389,7 +395,7 @@ int main(int argc, char **argv) FOR_EACH_ARG(args) { if (CEPH_ARGPARSE_EQ("help", 'h')) { usage(); - exit(0); + return 0; } else if (CEPH_ARGPARSE_EQ("uid", 'i')) { CEPH_ARGPARSE_SET_ARG_VAL(&user_id, OPT_STR); } else if (CEPH_ARGPARSE_EQ("access-key", '\0')) { @@ -425,7 +431,7 @@ int main(int argc, char **argv) CEPH_ARGPARSE_SET_ARG_VAL(&pool_id, OPT_INT); if (pool_id < 0) { cerr << "bad pool-id: " << pool_id << std::endl; - usage_exit(); + return usage(); } } else if (CEPH_ARGPARSE_EQ("format", '\0')) { CEPH_ARGPARSE_SET_ARG_VAL(&format, OPT_STR); @@ -436,7 +442,7 @@ int main(int argc, char **argv) opt_cmd = get_cmd(CEPH_ARGPARSE_VAL, prev_cmd, &need_more); if (opt_cmd < 0) { cerr << "unrecognized arg " << args[i] << std::endl; - usage_exit(); + return usage(); } if (need_more) { prev_cmd = CEPH_ARGPARSE_VAL; @@ -444,13 +450,13 @@ int main(int argc, char **argv) } } else { cerr << "unrecognized arg " << args[i] << std::endl; - usage_exit(); + return usage(); } } } if (opt_cmd == OPT_NO_CMD) - usage_exit(); + return usage(); if (format) { if (strcmp(format, "xml") == 0) @@ -459,7 +465,7 @@ int main(int argc, char **argv) formatter = &formatter_json; else { cerr << "unrecognized format: " << format << std::endl; - usage_exit(); + return usage(); } } @@ -473,7 +479,7 @@ int main(int argc, char **argv) if (user_id) { if (strcmp(user_id, suser) != 0) { cerr << "bad subuser " << subuser << " for uid " << user_id << std::endl; - exit(1); + return 1; } } else user_id = suser; @@ -483,14 +489,15 @@ int main(int argc, char **argv) if (opt_cmd == OPT_KEY_RM && !access_key) { cerr << "error: access key was not specified" << std::endl; - usage_exit(); + return usage(); } user_modify_op = (opt_cmd == OPT_USER_MODIFY || opt_cmd == OPT_SUBUSER_MODIFY || opt_cmd == OPT_SUBUSER_CREATE || opt_cmd == OPT_SUBUSER_RM || opt_cmd == OPT_KEY_CREATE || opt_cmd == OPT_KEY_RM || opt_cmd == OPT_USER_RM); - store = RGWAccess::init_storage_provider("rados", g_ceph_context); + RGWStoreManager store_manager; + store = store_manager.init("rados", g_ceph_context); if (!store) { cerr << "couldn't init storage provider" << std::endl; return 5; //EIO @@ -532,7 +539,7 @@ int main(int argc, char **argv) opt_cmd == OPT_USER_SUSPEND || opt_cmd == OPT_USER_ENABLE) { if (!user_id) { cerr << "user_id was not specified, aborting" << std::endl; - usage_exit(); + return usage(); } string user_id_str = user_id; @@ -542,11 +549,11 @@ int main(int argc, char **argv) if (opt_cmd == OPT_USER_CREATE) { if (found) { cerr << "error: user already exists" << std::endl; - exit(1); + return 1; } } else if (!found) { cerr << "error reading user info, aborting" << std::endl; - exit(1); + return 1; } } @@ -554,18 +561,18 @@ int main(int argc, char **argv) opt_cmd == OPT_SUBUSER_RM) { if (!subuser) { cerr << "subuser creation was requires specifying subuser name" << std::endl; - exit(1); + return 1; } map::iterator iter = info.subusers.find(subuser); bool found = (iter != info.subusers.end()); if (opt_cmd == OPT_SUBUSER_CREATE) { if (found) { cerr << "error: subuser already exists" << std::endl; - exit(1); + return 1; } } else if (!found) { cerr << "error: subuser doesn't exist" << std::endl; - exit(1); + return 1; } } @@ -584,7 +591,7 @@ int main(int argc, char **argv) ret = gen_rand_base64(secret_key_buf, sizeof(secret_key_buf)); if (ret < 0) { cerr << "aborting" << std::endl; - exit(1); + return 1; } secret_key = secret_key_buf; } @@ -595,7 +602,7 @@ int main(int argc, char **argv) ret = gen_rand_alphanumeric_upper(public_id_buf, sizeof(public_id_buf)); if (ret < 0) { cerr << "aborting" << std::endl; - exit(1); + return 1; } access_key = public_id_buf; duplicate_check_id = access_key; @@ -625,7 +632,7 @@ int main(int argc, char **argv) info.access_keys[access_key] = k; } else if (access_key || secret_key) { cerr << "access key modification requires both access key and secret key" << std::endl; - exit(1); + return 1; } if (display_name) info.display_name = display_name; @@ -738,7 +745,7 @@ int main(int argc, char **argv) if (opt_cmd == OPT_BUCKET_LINK) { if (!bucket) { cerr << "bucket name was not specified" << std::endl; - usage_exit(); + return usage(); } string bucket_str(bucket); string uid_str(user_id); @@ -776,7 +783,7 @@ int main(int argc, char **argv) if (opt_cmd == OPT_BUCKET_UNLINK) { if (!bucket) { cerr << "bucket name was not specified" << std::endl; - usage_exit(); + return usage(); } string bucket_str(bucket); @@ -789,7 +796,7 @@ int main(int argc, char **argv) if (opt_cmd == OPT_LOG_SHOW) { if (!object && (!date || !bucket || pool_id < 0)) { cerr << "object or (at least one of date, bucket, pool-id) were not specified" << std::endl; - usage_exit(); + return usage(); } string log_bucket = RGW_LOG_BUCKET_NAME; @@ -896,7 +903,7 @@ int main(int argc, char **argv) if (opt_cmd == OPT_POOL_CREATE) { if (!bucket) - usage_exit(); + return usage(); string bucket_str(bucket); string no_object; int ret; @@ -930,7 +937,7 @@ int main(int argc, char **argv) if (!user_id) { cerr << "uid was not specified" << std::endl; - usage_exit(); + return usage(); } RGWUserBuckets buckets; if (rgw_read_user_buckets(user_id, buckets, false) < 0) { @@ -944,7 +951,7 @@ int main(int argc, char **argv) ret = rgw_store_user_info(info); if (ret < 0) { cerr << "ERROR: failed to store user info user=" << user_id << " ret=" << ret << std::endl; - exit(1); + return 1; } if (disable) @@ -963,7 +970,7 @@ int main(int argc, char **argv) ret = rgwstore->enable_buckets(bucket_names, info.auid); if (ret < 0) { cerr << "ERROR: failed to change pool" << std::endl; - exit(1); + return 1; } } diff --git a/src/rgw/rgw_main.cc b/src/rgw/rgw_main.cc index d378360b4d164..36b9d7c88daad 100644 --- a/src/rgw/rgw_main.cc +++ b/src/rgw/rgw_main.cc @@ -77,7 +77,9 @@ int main(int argc, const char **argv) global_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0); common_init_finish(g_ceph_context); - if (!RGWAccess::init_storage_provider("rados", g_ceph_context)) { + RGWStoreManager store_manager; + + if (!store_manager.init("rados", g_ceph_context)) { derr << "Couldn't init storage provider (RADOS)" << dendl; return EIO; } diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 3d42d69044819..3c994b2bc3906 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -59,6 +59,11 @@ int RGWRados::initialize(CephContext *cct) return ret; } +void RGWRados::finalize() +{ + control_pool_ctx.unwatch(notify_oid, watch_handle); +} + /** * Open the pool used as root for this gateway * Returns: 0 on success, -ERR# otherwise. diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 9b7697552a04f..59028893eee7d 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -33,6 +33,7 @@ public: /** Initialize the RADOS instance and prepare to do other ops */ virtual int initialize(CephContext *cct); + virtual void finalize(); /** set up a bucket listing. id is ignored, handle is filled in. */ virtual int list_buckets_init(std::string& id, RGWAccessHandle *handle); /** -- 2.39.5