From cc661a7d212091ec9b0c676813b61d2421c80936 Mon Sep 17 00:00:00 2001 From: Vikhyat Umrao Date: Thu, 3 Sep 2015 12:02:05 +0530 Subject: [PATCH] rgw : setting max number of buckets for users via ceph.conf option This patch adds a new option "rgw_user_max_buckets" for setting max number of buckets for users via ceph.conf. This patch also fixes merge conflicts of src/rgw/rgw_admin.cc of _usage() function from cerr to cout changes. Fixes Upstream #12714 Fixes Downstream #1254343 Reviewed-by: Yehuda Sadeh Signed-off-by: Vikhyat Umrao (cherry picked from commit f65267c96cbd4cd25036b6bf399692e77bbb9436) Signed-off-by: Vikhyat Umrao --- src/common/config_opts.h | 1 + src/rgw/rgw_admin.cc | 263 +++++++++++++++--------------- src/rgw/rgw_rest_user.cc | 5 +- src/rgw/rgw_user.cc | 15 +- src/test/cli/radosgw-admin/help.t | 1 + 5 files changed, 145 insertions(+), 140 deletions(-) diff --git a/src/common/config_opts.h b/src/common/config_opts.h index f2c34fe8a4a14..6e7d34410be11 100644 --- a/src/common/config_opts.h +++ b/src/common/config_opts.h @@ -1043,6 +1043,7 @@ OPTION(rgw_user_quota_sync_wait_time, OPT_INT, 3600 * 24) // min time between tw OPTION(rgw_multipart_min_part_size, OPT_INT, 5 * 1024 * 1024) // min size for each part (except for last one) in multipart upload OPTION(rgw_olh_pending_timeout_sec, OPT_INT, 3600) // time until we retire a pending olh change +OPTION(rgw_user_max_buckets, OPT_U32, 1000) // global option to set max buckets count for all user OPTION(mutex_perf_counter, OPT_BOOL, false) // enable/disable mutex perf counter OPTION(throttler_perf_counter, OPT_BOOL, true) // enable/disable throttler perf counter diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index 5debefb4e5725..7fcd6d5a4db8a 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -41,137 +41,138 @@ static RGWRados *store = NULL; void _usage() { - cerr << "usage: radosgw-admin [options...]" << std::endl; - cerr << "commands:\n"; - cerr << " user create create a new user\n" ; - cerr << " user modify modify user\n"; - cerr << " user info get user info\n"; - cerr << " user rm remove user\n"; - cerr << " user suspend suspend a user\n"; - cerr << " user enable re-enable user after suspension\n"; - cerr << " user check check user info\n"; - cerr << " user stats show user stats as accounted by quota subsystem\n"; - cerr << " caps add add user capabilities\n"; - cerr << " caps rm remove user capabilities\n"; - cerr << " subuser create create a new subuser\n" ; - cerr << " subuser modify modify subuser\n"; - cerr << " subuser rm remove subuser\n"; - cerr << " key create create access key\n"; - cerr << " key rm remove access key\n"; - cerr << " bucket list list buckets\n"; - cerr << " bucket link link bucket to specified user\n"; - cerr << " bucket unlink unlink bucket from specified user\n"; - cerr << " bucket stats returns bucket statistics\n"; - cerr << " bucket rm remove bucket\n"; - cerr << " bucket check check bucket index\n"; - cerr << " object rm remove object\n"; - cerr << " object unlink unlink object from bucket index\n"; - cerr << " quota set set quota params\n"; - cerr << " quota enable enable quota\n"; - cerr << " quota disable disable quota\n"; - cerr << " region get show region info\n"; - cerr << " regions list list all regions set on this cluster\n"; - cerr << " region set set region info (requires infile)\n"; - cerr << " region default set default region\n"; - cerr << " region-map get show region-map\n"; - cerr << " region-map set set region-map (requires infile)\n"; - cerr << " zone get show zone cluster params\n"; - cerr << " zone set set zone cluster params (requires infile)\n"; - cerr << " zone list list all zones set on this cluster\n"; - cerr << " pool add add an existing pool for data placement\n"; - cerr << " pool rm remove an existing pool from data placement set\n"; - cerr << " pools list list placement active set\n"; - cerr << " policy read bucket/object policy\n"; - cerr << " log list list log objects\n"; - cerr << " log show dump a log from specific object or (bucket + date\n"; - cerr << " + bucket-id)\n"; - cerr << " log rm remove log object\n"; - cerr << " usage show show usage (by user, date range)\n"; - cerr << " usage trim trim usage (by user, date range)\n"; - cerr << " temp remove remove temporary objects that were created up to\n"; - cerr << " specified date (and optional time)\n"; - cerr << " gc list dump expired garbage collection objects (specify\n"; - cerr << " --include-all to list all entries, including unexpired)\n"; - cerr << " gc process manually process garbage\n"; - cerr << " metadata get get metadata info\n"; - cerr << " metadata put put metadata info\n"; - cerr << " metadata rm remove metadata info\n"; - cerr << " metadata list list metadata info\n"; - cerr << " mdlog list list metadata log\n"; - cerr << " mdlog trim trim metadata log\n"; - cerr << " bilog list list bucket index log\n"; - cerr << " bilog trim trim bucket index log (use start-marker, end-marker)\n"; - cerr << " datalog list list data log\n"; - cerr << " datalog trim trim data log\n"; - cerr << " opstate list list stateful operations entries (use client_id,\n"; - cerr << " op_id, object)\n"; - cerr << " opstate set set state on an entry (use client_id, op_id, object, state)\n"; - cerr << " opstate renew renew state on an entry (use client_id, op_id, object)\n"; - cerr << " opstate rm remove entry (use client_id, op_id, object)\n"; - cerr << " replicalog get get replica metadata log entry\n"; - cerr << " replicalog update update replica metadata log entry\n"; - cerr << " replicalog delete delete replica metadata log entry\n"; - cerr << "options:\n"; - cerr << " --uid= user id\n"; - cerr << " --subuser= subuser name\n"; - cerr << " --access-key= S3 access key\n"; - cerr << " --email=\n"; - cerr << " --secret= specify secret key\n"; - cerr << " --gen-access-key generate random access key (for S3)\n"; - cerr << " --gen-secret generate random secret key\n"; - cerr << " --key-type= key type, options are: swift, s3\n"; - cerr << " --temp-url-key[-2]= temp url key\n"; - cerr << " --access= Set access permissions for sub-user, should be one\n"; - cerr << " of read, write, readwrite, full\n"; - cerr << " --display-name=\n"; - cerr << " --system set the system flag on the user\n"; - cerr << " --bucket=\n"; - cerr << " --pool=\n"; - cerr << " --object=\n"; - cerr << " --date=\n"; - cerr << " --start-date=\n"; - cerr << " --end-date=\n"; - cerr << " --bucket-id=\n"; - cerr << " --shard-id= optional for mdlog list\n"; - cerr << " required for: \n"; - cerr << " mdlog trim\n"; - cerr << " replica mdlog get/delete\n"; - cerr << " replica datalog get/delete\n"; - cerr << " --metadata-key= key to retrieve metadata from with metadata get\n"; - cerr << " --rgw-region= region in which radosgw is running\n"; - cerr << " --rgw-zone= zone in which radosgw is running\n"; - cerr << " --fix besides checking bucket index, will also fix it\n"; - cerr << " --check-objects bucket check: rebuilds bucket index according to\n"; - cerr << " actual objects state\n"; - cerr << " --format= specify output format for certain operations: xml,\n"; - cerr << " json\n"; - cerr << " --purge-data when specified, user removal will also purge all the\n"; - cerr << " user data\n"; - cerr << " --purge-keys when specified, subuser removal will also purge all the\n"; - cerr << " subuser keys\n"; - cerr << " --purge-objects remove a bucket's objects before deleting it\n"; - cerr << " (NOTE: required to delete a non-empty bucket)\n"; - cerr << " --sync-stats option to 'user stats', update user stats with current\n"; - cerr << " stats reported by user's buckets indexes\n"; - cerr << " --show-log-entries= enable/disable dump of log entries on log show\n"; - cerr << " --show-log-sum= enable/disable dump of log summation on log show\n"; - cerr << " --skip-zero-entries log show only dumps entries that don't have zero value\n"; - cerr << " in one of the numeric field\n"; - cerr << " --infile specify a file to read in when setting data\n"; - cerr << " --state= specify a state for the opstate set command\n"; - cerr << " --replica-log-type replica log type (metadata, data, bucket), required for\n"; - cerr << " replica log operations\n"; - cerr << " --categories= comma separated list of categories, used in usage show\n"; - cerr << " --caps= list of caps (e.g., \"usage=read, write; user=read\"\n"; - cerr << " --yes-i-really-mean-it required for certain operations\n"; - cerr << "\n"; - cerr << " := \"YYYY-MM-DD[ hh:mm:ss]\"\n"; - cerr << "\nQuota options:\n"; - cerr << " --bucket specified bucket for quota command\n"; - cerr << " --max-objects specify max objects (negative value to disable)\n"; - cerr << " --max-size specify max size (in bytes, negative value to disable)\n"; - cerr << " --quota-scope scope of quota (bucket, user)\n"; - cerr << "\n"; + cout << "usage: radosgw-admin [options...]" << std::endl; + cout << "commands:\n"; + cout << " user create create a new user\n" ; + cout << " user modify modify user\n"; + cout << " user info get user info\n"; + cout << " user rm remove user\n"; + cout << " user suspend suspend a user\n"; + cout << " user enable re-enable user after suspension\n"; + cout << " user check check user info\n"; + cout << " user stats show user stats as accounted by quota subsystem\n"; + cout << " caps add add user capabilities\n"; + cout << " caps rm remove user capabilities\n"; + cout << " subuser create create a new subuser\n" ; + cout << " subuser modify modify subuser\n"; + cout << " subuser rm remove subuser\n"; + cout << " key create create access key\n"; + cout << " key rm remove access key\n"; + cout << " bucket list list buckets\n"; + cout << " bucket link link bucket to specified user\n"; + cout << " bucket unlink unlink bucket from specified user\n"; + cout << " bucket stats returns bucket statistics\n"; + cout << " bucket rm remove bucket\n"; + cout << " bucket check check bucket index\n"; + cout << " object rm remove object\n"; + cout << " object unlink unlink object from bucket index\n"; + cout << " quota set set quota params\n"; + cout << " quota enable enable quota\n"; + cout << " quota disable disable quota\n"; + cout << " region get show region info\n"; + cout << " regions list list all regions set on this cluster\n"; + cout << " region set set region info (requires infile)\n"; + cout << " region default set default region\n"; + cout << " region-map get show region-map\n"; + cout << " region-map set set region-map (requires infile)\n"; + cout << " zone get show zone cluster params\n"; + cout << " zone set set zone cluster params (requires infile)\n"; + cout << " zone list list all zones set on this cluster\n"; + cout << " pool add add an existing pool for data placement\n"; + cout << " pool rm remove an existing pool from data placement set\n"; + cout << " pools list list placement active set\n"; + cout << " policy read bucket/object policy\n"; + cout << " log list list log objects\n"; + cout << " log show dump a log from specific object or (bucket + date\n"; + cout << " + bucket-id)\n"; + cout << " log rm remove log object\n"; + cout << " usage show show usage (by user, date range)\n"; + cout << " usage trim trim usage (by user, date range)\n"; + cout << " temp remove remove temporary objects that were created up to\n"; + cout << " specified date (and optional time)\n"; + cout << " gc list dump expired garbage collection objects (specify\n"; + cout << " --include-all to list all entries, including unexpired)\n"; + cout << " gc process manually process garbage\n"; + cout << " metadata get get metadata info\n"; + cout << " metadata put put metadata info\n"; + cout << " metadata rm remove metadata info\n"; + cout << " metadata list list metadata info\n"; + cout << " mdlog list list metadata log\n"; + cout << " mdlog trim trim metadata log\n"; + cout << " bilog list list bucket index log\n"; + cout << " bilog trim trim bucket index log (use start-marker, end-marker)\n"; + cout << " datalog list list data log\n"; + cout << " datalog trim trim data log\n"; + cout << " opstate list list stateful operations entries (use client_id,\n"; + cout << " op_id, object)\n"; + cout << " opstate set set state on an entry (use client_id, op_id, object, state)\n"; + cout << " opstate renew renew state on an entry (use client_id, op_id, object)\n"; + cout << " opstate rm remove entry (use client_id, op_id, object)\n"; + cout << " replicalog get get replica metadata log entry\n"; + cout << " replicalog update update replica metadata log entry\n"; + cout << " replicalog delete delete replica metadata log entry\n"; + cout << "options:\n"; + cout << " --uid= user id\n"; + cout << " --subuser= subuser name\n"; + cout << " --access-key= S3 access key\n"; + cout << " --email=\n"; + cout << " --secret= specify secret key\n"; + cout << " --gen-access-key generate random access key (for S3)\n"; + cout << " --gen-secret generate random secret key\n"; + cout << " --key-type= key type, options are: swift, s3\n"; + cout << " --temp-url-key[-2]= temp url key\n"; + cout << " --access= Set access permissions for sub-user, should be one\n"; + cout << " of read, write, readwrite, full\n"; + cout << " --display-name=\n"; + cout << " --max_buckets max number of buckets for a user\n"; + cout << " --system set the system flag on the user\n"; + cout << " --bucket=\n"; + cout << " --pool=\n"; + cout << " --object=\n"; + cout << " --date=\n"; + cout << " --start-date=\n"; + cout << " --end-date=\n"; + cout << " --bucket-id=\n"; + cout << " --shard-id= optional for mdlog list\n"; + cout << " required for: \n"; + cout << " mdlog trim\n"; + cout << " replica mdlog get/delete\n"; + cout << " replica datalog get/delete\n"; + cout << " --metadata-key= key to retrieve metadata from with metadata get\n"; + cout << " --rgw-region= region in which radosgw is running\n"; + cout << " --rgw-zone= zone in which radosgw is running\n"; + cout << " --fix besides checking bucket index, will also fix it\n"; + cout << " --check-objects bucket check: rebuilds bucket index according to\n"; + cout << " actual objects state\n"; + cout << " --format= specify output format for certain operations: xml,\n"; + cout << " json\n"; + cout << " --purge-data when specified, user removal will also purge all the\n"; + cout << " user data\n"; + cout << " --purge-keys when specified, subuser removal will also purge all the\n"; + cout << " subuser keys\n"; + cout << " --purge-objects remove a bucket's objects before deleting it\n"; + cout << " (NOTE: required to delete a non-empty bucket)\n"; + cout << " --sync-stats option to 'user stats', update user stats with current\n"; + cout << " stats reported by user's buckets indexes\n"; + cout << " --show-log-entries= enable/disable dump of log entries on log show\n"; + cout << " --show-log-sum= enable/disable dump of log summation on log show\n"; + cout << " --skip-zero-entries log show only dumps entries that don't have zero value\n"; + cout << " in one of the numeric field\n"; + cout << " --infile specify a file to read in when setting data\n"; + cout << " --state= specify a state for the opstate set command\n"; + cout << " --replica-log-type replica log type (metadata, data, bucket), required for\n"; + cout << " replica log operations\n"; + cout << " --categories= comma separated list of categories, used in usage show\n"; + cout << " --caps= list of caps (e.g., \"usage=read, write; user=read\"\n"; + cout << " --yes-i-really-mean-it required for certain operations\n"; + cout << "\n"; + cout << " := \"YYYY-MM-DD[ hh:mm:ss]\"\n"; + cout << "\nQuota options:\n"; + cout << " --bucket specified bucket for quota command\n"; + cout << " --max-objects specify max objects (negative value to disable)\n"; + cout << " --max-size specify max size (in bytes, negative value to disable)\n"; + cout << " --quota-scope scope of quota (bucket, user)\n"; + cout << "\n"; generic_client_usage(); } diff --git a/src/rgw/rgw_rest_user.cc b/src/rgw/rgw_rest_user.cc index fc46ff6646fad..5e618c419a9c9 100644 --- a/src/rgw/rgw_rest_user.cc +++ b/src/rgw/rgw_rest_user.cc @@ -71,6 +71,7 @@ void RGWOp_User_Create::execute() bool exclusive; uint32_t max_buckets; + uint32_t default_max_buckets = s->cct->_conf->rgw_user_max_buckets; RGWUserAdminOpState op_state; @@ -83,7 +84,7 @@ void RGWOp_User_Create::execute() RESTArgs::get_string(s, "user-caps", caps, &caps); RESTArgs::get_bool(s, "generate-key", true, &gen_key); RESTArgs::get_bool(s, "suspended", false, &suspended); - RESTArgs::get_uint32(s, "max-buckets", RGW_DEFAULT_MAX_BUCKETS, &max_buckets); + RESTArgs::get_uint32(s, "max-buckets", default_max_buckets, &max_buckets); RESTArgs::get_bool(s, "system", false, &system); RESTArgs::get_bool(s, "exclusive", false, &exclusive); @@ -122,7 +123,7 @@ void RGWOp_User_Create::execute() op_state.set_key_type(key_type); } - if (max_buckets != RGW_DEFAULT_MAX_BUCKETS) + if (max_buckets != default_max_buckets) op_state.set_max_buckets(max_buckets); if (s->info.args.exists("suspended")) diff --git a/src/rgw/rgw_user.cc b/src/rgw/rgw_user.cc index 24b72fb8572cc..4156befd3f64f 100644 --- a/src/rgw/rgw_user.cc +++ b/src/rgw/rgw_user.cc @@ -1767,7 +1767,13 @@ int RGWUser::execute_add(RGWUserAdminOpState& op_state, std::string *err_msg) if (!user_email.empty()) user_info.user_email = user_email; - user_info.max_buckets = op_state.get_max_buckets(); + CephContext *cct = store->ctx(); + if (op_state.max_buckets_specified) { + user_info.max_buckets = op_state.get_max_buckets(); + } else { + user_info.max_buckets = cct->_conf->rgw_user_max_buckets; + } + user_info.suspended = op_state.get_suspension_status(); user_info.system = op_state.system; @@ -1973,13 +1979,8 @@ int RGWUser::execute_modify(RGWUserAdminOpState& op_state, std::string *err_msg) if (!display_name.empty()) user_info.display_name = display_name; - // will be set to RGW_DEFAULT_MAX_BUCKETS by default - uint32_t max_buckets = op_state.get_max_buckets(); - - ldout(store->ctx(), 0) << "max_buckets=" << max_buckets << " specified=" << op_state.max_buckets_specified << dendl; - if (op_state.max_buckets_specified) - user_info.max_buckets = max_buckets; + user_info.max_buckets = op_state.get_max_buckets(); if (op_state.system_specified) user_info.system = op_state.system; diff --git a/src/test/cli/radosgw-admin/help.t b/src/test/cli/radosgw-admin/help.t index 33aee1d5eb332..a79a53506713f 100644 --- a/src/test/cli/radosgw-admin/help.t +++ b/src/test/cli/radosgw-admin/help.t @@ -82,6 +82,7 @@ --access= Set access permissions for sub-user, should be one of read, write, readwrite, full --display-name= + --max_buckets max number of buckets for a user --system set the system flag on the user --bucket= --pool= -- 2.39.5