From 654336b0393b10c899f10b9a40d050625e1dadc6 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Fri, 23 Jun 2017 09:30:26 -0400 Subject: [PATCH] rgw: auto-tag created pools as owned by rgw Signed-off-by: Jason Dillaman --- src/rgw/rgw_rados.cc | 74 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 052ed7e0c2b5e..966ab475d4b1b 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -41,6 +41,7 @@ #include "cls/timeindex/cls_timeindex_client.h" #include "cls/lock/cls_lock_client.h" #include "cls/user/cls_user_client.h" +#include "osd/osd_types.h" #include "rgw_tools.h" #include "rgw_coroutine.h" @@ -175,8 +176,15 @@ int rgw_init_ioctx(librados::Rados *rados, const rgw_pool& pool, IoCtx& ioctx, b } r = rados->ioctx_create(pool.name.c_str(), ioctx); - } - if (r < 0) { + if (r < 0) { + return r; + } + + r = ioctx.application_enable(pg_pool_t::APPLICATION_NAME_RGW, false); + if (r < 0 && r != -EOPNOTSUPP) { + return r; + } + } else if (r < 0) { return r; } if (!pool.ns.empty()) { @@ -4811,7 +4819,14 @@ int RGWRados::open_pool_ctx(const rgw_pool& pool, librados::IoCtx& io_ctx) if (r < 0 && r != -EEXIST) return r; - return rgw_init_ioctx(rad, pool, io_ctx); + r = rgw_init_ioctx(rad, pool, io_ctx); + if (r < 0) + return r; + + r = io_ctx.application_enable(pg_pool_t::APPLICATION_NAME_RGW, false); + if (r < 0 && r != -EOPNOTSUPP) + return r; + return 0; } void RGWRados::build_bucket_index_marker(const string& shard_id_str, const string& shard_marker, @@ -5713,6 +5728,14 @@ int RGWRados::create_pool(const rgw_pool& pool) if (ret < 0) return ret; + librados::IoCtx io_ctx; + ret = rad->ioctx_create(pool.name.c_str(), io_ctx); + if (ret < 0) + return ret; + + ret = io_ctx.application_enable(pg_pool_t::APPLICATION_NAME_RGW, false); + if (ret < 0 && ret != -EOPNOTSUPP) + return ret; return 0; } @@ -6129,6 +6152,7 @@ int RGWRados::create_pools(vector& pools, vector& retcodes) vector::iterator riter; vector::iterator citer; + bool error = false; assert(rets.size() == completions.size()); for (riter = rets.begin(), citer = completions.begin(); riter != rets.end(); ++riter, ++citer) { int r = *riter; @@ -6138,11 +6162,55 @@ int RGWRados::create_pools(vector& pools, vector& retcodes) r = c->get_return_value(); if (r < 0) { ldout(cct, 0) << "WARNING: async pool_create returned " << r << dendl; + error = true; } } c->release(); retcodes.push_back(r); } + if (error) { + return 0; + } + + std::vector io_ctxs; + retcodes.clear(); + for (auto pool : pools) { + io_ctxs.emplace_back(); + int ret = rad->ioctx_create(pool.name.c_str(), io_ctxs.back()); + if (ret < 0) { + ldout(cct, 0) << "WARNING: ioctx_create returned " << ret << dendl; + error = true; + } + retcodes.push_back(ret); + } + if (error) { + return 0; + } + + completions.clear(); + for (auto &io_ctx : io_ctxs) { + librados::PoolAsyncCompletion *c = + librados::Rados::pool_async_create_completion(); + completions.push_back(c); + int ret = io_ctx.application_enable_async(pg_pool_t::APPLICATION_NAME_RGW, + false, c); + assert(ret == 0); + } + + retcodes.clear(); + for (auto c : completions) { + c->wait(); + int ret = c->get_return_value(); + if (ret == -EOPNOTSUPP) { + ret = 0; + } else if (ret < 0) { + ldout(cct, 0) << "WARNING: async application_enable returned " << ret + << dendl; + error = true; + } + c->release(); + retcodes.push_back(ret); + } return 0; } -- 2.39.5