From c3cbaad2a1a4df68fe39394e07c2f3ac9818b9c8 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 29 Aug 2017 00:01:19 -0400 Subject: [PATCH] mon: set purged_snapdirs OSDMap flag once snapsets have all converted This makes it easier to test whether the upgrade + conversion has completed. In particular, mimic+ will be able to simply test for this flag without waiting for complete PG stats to know whether it is safe to upgrade beyond luminous. Signed-off-by: Sage Weil --- src/include/rados.h | 4 +++- src/mon/MgrStatMonitor.h | 4 ++++ src/mon/OSDMonitor.cc | 13 ++++++++++++- src/mon/PGMap.h | 9 +++++++++ src/osd/OSDMap.cc | 2 ++ 5 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/include/rados.h b/src/include/rados.h index d8bce989172a4..a5dcbfaa76d2c 100644 --- a/src/include/rados.h +++ b/src/include/rados.h @@ -156,13 +156,15 @@ extern const char *ceph_osd_state_name(int s); #define CEPH_OSDMAP_REQUIRE_KRAKEN (1<<17) /* require kraken for booting osds */ #define CEPH_OSDMAP_REQUIRE_LUMINOUS (1<<18) /* require l for booting osds */ #define CEPH_OSDMAP_RECOVERY_DELETES (1<<19) /* deletes performed during recovery instead of peering */ +#define CEPH_OSDMAP_PURGED_SNAPDIRS (1<<20) /* osds have converted snapsets */ /* these are hidden in 'ceph status' view */ #define CEPH_OSDMAP_SEMIHIDDEN_FLAGS (CEPH_OSDMAP_REQUIRE_JEWEL| \ CEPH_OSDMAP_REQUIRE_KRAKEN | \ CEPH_OSDMAP_REQUIRE_LUMINOUS | \ CEPH_OSDMAP_RECOVERY_DELETES | \ - CEPH_OSDMAP_SORTBITWISE) + CEPH_OSDMAP_SORTBITWISE | \ + CEPH_OSDMAP_PURGED_SNAPDIRS) #define CEPH_OSDMAP_LEGACY_REQUIRE_FLAGS (CEPH_OSDMAP_REQUIRE_JEWEL | \ CEPH_OSDMAP_REQUIRE_KRAKEN | \ CEPH_OSDMAP_REQUIRE_LUMINOUS) diff --git a/src/mon/MgrStatMonitor.h b/src/mon/MgrStatMonitor.h index c1846a5447798..1dc264f86b6d0 100644 --- a/src/mon/MgrStatMonitor.h +++ b/src/mon/MgrStatMonitor.h @@ -37,6 +37,10 @@ public: void encode_pending(MonitorDBStore::TransactionRef t) override; version_t get_trim_to() override; + bool definitely_converted_snapsets() const { + return digest.definitely_converted_snapsets(); + } + bool preprocess_query(MonOpRequestRef op) override; bool prepare_update(MonOpRequestRef op) override; diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 8442a606b70cb..fdf004bfb65c7 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -240,7 +240,9 @@ void OSDMonitor::create_initial() derr << __func__ << " mon_debug_no_require_luminous=true" << dendl; } else { newmap.require_osd_release = CEPH_RELEASE_LUMINOUS; - newmap.flags |= CEPH_OSDMAP_RECOVERY_DELETES; + newmap.flags |= + CEPH_OSDMAP_RECOVERY_DELETES | + CEPH_OSDMAP_PURGED_SNAPDIRS; newmap.full_ratio = g_conf->mon_osd_full_ratio; if (newmap.full_ratio > 1.0) newmap.full_ratio /= 100; newmap.backfillfull_ratio = g_conf->mon_osd_backfillfull_ratio; @@ -3325,6 +3327,15 @@ void OSDMonitor::tick() do_propose = true; } } + if (!osdmap.test_flag(CEPH_OSDMAP_PURGED_SNAPDIRS) && + osdmap.require_osd_release >= CEPH_RELEASE_LUMINOUS && + mon->mgrstatmon()->is_readable() && + mon->mgrstatmon()->definitely_converted_snapsets()) { + dout(1) << __func__ << " all snapsets converted, setting purged_snapdirs" + << dendl; + add_flag(CEPH_OSDMAP_PURGED_SNAPDIRS); + do_propose = true; + } // mark osds down? if (check_failures(now)) diff --git a/src/mon/PGMap.h b/src/mon/PGMap.h index 3432f796633cf..257a9c75aaf83 100644 --- a/src/mon/PGMap.h +++ b/src/mon/PGMap.h @@ -188,6 +188,15 @@ public: return 0; } + // kill me post-mimic or -nautilus + bool definitely_converted_snapsets() const { + // false negative is okay; false positive is not! + return + num_pg && + num_pg_unknown == 0 && + pg_sum.stats.sum.num_legacy_snapsets == 0; + } + // kill me post-luminous: virtual float get_fallback_full_ratio() const { return .95; diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index 99a768897c142..dc78ab9a83f29 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -2947,6 +2947,8 @@ string OSDMap::get_flag_string(unsigned f) s += ",require_luminous_osds"; if (f & CEPH_OSDMAP_RECOVERY_DELETES) s += ",recovery_deletes"; + if (f & CEPH_OSDMAP_PURGED_SNAPDIRS) + s += ",purged_snapdirs"; if (s.length()) s.erase(0, 1); return s; -- 2.39.5