From b9c367299a1cd209a7f8930d1f593528de667b05 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Fri, 17 Jun 2011 15:30:41 -0700 Subject: [PATCH] rgw: suspend/enable buckets through pool async api --- src/rgw/rgw_access.h | 4 ++-- src/rgw/rgw_admin.cc | 22 ++++++++++------------ src/rgw/rgw_op.cc | 1 + src/rgw/rgw_rados.cc | 38 ++++++++++++++++++++++++++------------ src/rgw/rgw_rados.h | 6 ++++-- 5 files changed, 43 insertions(+), 28 deletions(-) diff --git a/src/rgw/rgw_access.h b/src/rgw/rgw_access.h index d6838c9595986..47e3b53c3096b 100644 --- a/src/rgw/rgw_access.h +++ b/src/rgw/rgw_access.h @@ -96,8 +96,8 @@ public: */ virtual int delete_bucket(std::string& id, std::string& bucket) = 0; - virtual int disable_bucket(std::string& bucket) { return -ENOTSUP; } - virtual int enable_bucket(std::string& bucket, uint64_t auid) { return -ENOTSUP; } + virtual int disable_buckets(std::vector& buckets) { return -ENOTSUP; } + virtual int enable_buckets(std::vector& buckets, uint64_t auid) { return -ENOTSUP; } virtual int bucket_suspended(std::string& bucket, bool *suspended) { *suspended = false; return 0; diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index 3fc07a6277a47..80557d353f142 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -939,21 +939,19 @@ int main(int argc, char **argv) else RGW_LOG(0) << "enabling user buckets" << dendl; - bool fail = false; - + vector bucket_names; for (iter = m.begin(); iter != m.end(); ++iter) { RGWBucketEnt obj = iter->second; - if (disable) - ret = rgwstore->disable_bucket(obj.name); - else - ret = rgwstore->enable_bucket(obj.name, info.auid); - if (ret < 0) { - cerr << "ERROR: could not disable bucket " << obj.name << " ret=" << ret << std::endl; - fail = true; - } + bucket_names.push_back(obj.name); + } + if (disable) + ret = rgwstore->disable_buckets(bucket_names); + else + ret = rgwstore->enable_buckets(bucket_names, info.auid); + if (ret < 0) { + cerr << "ERROR: failed to change pool" << std::endl; + exit(1); } - if (fail) - return 1; } return 0; diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 40d648924aa39..9f8bff0bc994f 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -143,6 +143,7 @@ int read_acls(struct req_state *s, RGWAccessControlPolicy *policy, string& bucke int ret = rgwstore->bucket_suspended(bucket, &suspended); if (ret < 0) return ret; + if (suspended) return -ERR_USER_SUSPENDED; } diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 3fe68e367fc59..816187a84c9f7 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -486,27 +486,41 @@ int RGWRados::delete_bucket(std::string& id, std::string& bucket) return 0; } -int RGWRados::disable_bucket(std::string& bucket) +int RGWRados::set_buckets_auid(vector& buckets, uint64_t auid) { librados::IoCtx ctx; - int r = open_bucket_ctx(bucket, ctx); - if (r < 0) - return r; + vector completions; + + vector::iterator iter; + for (iter = buckets.begin(); iter != buckets.end(); ++iter) { + string& bucket = *iter; + int r = open_bucket_ctx(bucket, ctx); + if (r < 0) + return r; + + librados::PoolAsyncCompletion *c = librados::Rados::pool_async_create_completion(); + completions.push_back(c); + ctx.set_auid_async(auid, c); + } - ctx.set_auid(RGW_SUSPENDED_USER_AUID); + vector::iterator citer; + for (citer = completions.begin(); citer != completions.end(); ++citer) { + PoolAsyncCompletion *c = *citer; + c->wait(); + c->release(); + } return 0; } -int RGWRados::enable_bucket(std::string& bucket, uint64_t auid) +int RGWRados::disable_buckets(vector& buckets) { - librados::IoCtx ctx; - int r = open_bucket_ctx(bucket, ctx); - if (r < 0) - return r; + return set_buckets_auid(buckets, RGW_SUSPENDED_USER_AUID); +} - ctx.set_auid(auid); - return 0; +int RGWRados::enable_buckets(vector& buckets, uint64_t auid) +{ + return set_buckets_auid(buckets, auid); } int RGWRados::bucket_suspended(std::string& bucket, bool *suspended) diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 89f6a4937379c..0e30e2553de94 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -19,6 +19,8 @@ class RGWRados : public RGWAccess GetObjState() : sent_data(false) {} }; + int set_buckets_auid(vector& buckets, uint64_t auid); + public: /** Initialize the RADOS instance and prepare to do other ops */ virtual int initialize(CephContext *cct); @@ -61,8 +63,8 @@ public: /** delete a bucket*/ virtual int delete_bucket(std::string& id, std::string& bucket); - virtual int disable_bucket(std::string& bucket); - virtual int enable_bucket(std::string& bucket, uint64_t auid); + virtual int disable_buckets(std::vector& buckets); + virtual int enable_buckets(std::vector& buckets, uint64_t auid); virtual int bucket_suspended(std::string& bucket, bool *suspended); /** Delete an object.*/ -- 2.39.5