From 6d7ac66ae2e0cfd326cfbecb6c2c9ff953b74600 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Tue, 20 Jun 2017 09:59:20 -0400 Subject: [PATCH] mon: heuristics for auto-enabling pool applications upon upgrade Signed-off-by: Jason Dillaman --- src/mon/OSDMonitor.cc | 64 +++++++++++++++++++++++++++++++++++++++++++ src/osd/osd_types.cc | 4 +++ src/osd/osd_types.h | 4 +++ 3 files changed, 72 insertions(+) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index f01c69f5f28..1c0caa7bfcb 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -1009,6 +1009,70 @@ void OSDMonitor::encode_pending(MonitorDBStore::TransactionRef t) pending_inc.new_erasure_code_profiles[p.first] = newprofile; } } + + // auto-enable pool applications upon upgrade + // NOTE: this can be removed post-Luminous assuming upgrades need to + // proceed through Luminous + for (auto &pool_pair : tmp.pools) { + int64_t pool_id = pool_pair.first; + pg_pool_t pg_pool = pool_pair.second; + std::string pool_name = tmp.get_pool_name(pool_id); + uint32_t match_count = 0; + + // CephFS + FSMap const &pending_fsmap = mon->mdsmon()->get_pending(); + if (pending_fsmap.pool_in_use(pool_id)) { + dout(10) << __func__ << " auto-enabling CephFS on pool '" + << pool_name << "'" << dendl; + pg_pool.application_metadata.insert( + {pg_pool_t::APPLICATION_NAME_CEPHFS, {}}); + ++match_count; + } + + // RBD heuristics (default OpenStack pool names from docs and + // ceph-ansible) + if (boost::algorithm::contains(pool_name, "rbd") || + pool_name == "images" || pool_name == "volumes" || + pool_name == "backups" || pool_name == "vms") { + dout(10) << __func__ << " auto-enabling RBD on pool '" + << pool_name << "'" << dendl; + pg_pool.application_metadata.insert( + {pg_pool_t::APPLICATION_NAME_RBD, {}}); + ++match_count; + } + + // RGW heuristics + if (boost::algorithm::contains(pool_name, ".rgw") || + boost::algorithm::contains(pool_name, ".log") || + boost::algorithm::contains(pool_name, ".intent-log") || + boost::algorithm::contains(pool_name, ".usage") || + boost::algorithm::contains(pool_name, ".users")) { + dout(10) << __func__ << " auto-enabling RGW on pool '" + << pool_name << "'" << dendl; + pg_pool.application_metadata.insert( + {pg_pool_t::APPLICATION_NAME_RGW, {}}); + ++match_count; + } + + // OpenStack gnocchi (from ceph-ansible) + if (pool_name == "metrics" && match_count == 0) { + dout(10) << __func__ << " auto-enabling OpenStack Gnocchi on pool '" + << pool_name << "'" << dendl; + pg_pool.application_metadata.insert({"openstack_gnocchi", {}}); + ++match_count; + } + + if (match_count == 1) { + pg_pool.last_change = pending_inc.epoch; + pending_inc.new_pools[pool_id] = pg_pool; + } else if (match_count > 1) { + auto pstat = mon->pgservice->get_pool_stat(pool_id); + if (pstat != nullptr && pstat->stats.sum.num_objects > 0) { + mon->clog->info() << "unable to auto-enable application for pool " + << "'" << pool_name << "'"; + } + } + } } } } diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index cda9e67f3be..eb7dd221113 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -1137,6 +1137,10 @@ ostream& operator<<(ostream& out, const pool_opts_t& opts) // -- pg_pool_t -- +const char *pg_pool_t::APPLICATION_NAME_CEPHFS("cephfs"); +const char *pg_pool_t::APPLICATION_NAME_RBD("rbd"); +const char *pg_pool_t::APPLICATION_NAME_RGW("rgw"); + void pg_pool_t::dump(Formatter *f) const { f->dump_unsigned("flags", get_flags()); diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 1f4a032f826..b80ff489565 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -1099,6 +1099,10 @@ WRITE_CLASS_ENCODER(pool_opts_t) * pg_pool */ struct pg_pool_t { + static const char *APPLICATION_NAME_CEPHFS; + static const char *APPLICATION_NAME_RBD; + static const char *APPLICATION_NAME_RGW; + enum { TYPE_REPLICATED = 1, // replication //TYPE_RAID4 = 2, // raid4 (never implemented) -- 2.39.5