From a1c66468232002c9f36033226f5db0a5751e8d18 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 4 May 2017 12:04:19 -0500 Subject: [PATCH] osd/OSDmap: add require_min_compat_client field This is a persistent record of the compatibility for old clients that we will enforce. Once set, the mon will eventually prevent newer features of the OSDMap or CRUSH maps from being used if they violate this requirement. Signed-off-by: Sage Weil --- src/osd/OSDMap.cc | 18 ++++++++++++++++++ src/osd/OSDMap.h | 5 +++++ 2 files changed, 23 insertions(+) diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index e1cf4ff0957..8b3071beb8f 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -467,6 +467,9 @@ void OSDMap::Incremental::encode(bufferlist& bl, uint64_t features) const ::encode(new_full_ratio, bl); ::encode(new_backfillfull_ratio, bl); } + if (target_v >= 4) { + ::encode(new_require_min_compat_client, bl); + } ENCODE_FINISH(bl); // osd-only data } @@ -675,6 +678,7 @@ void OSDMap::Incremental::decode(bufferlist::iterator& bl) } if (struct_v >= 4) { ::decode(new_backfillfull_ratio, bl); + ::decode(new_require_min_compat_client, bl); } else { new_backfillfull_ratio = -1; } @@ -722,6 +726,7 @@ void OSDMap::Incremental::dump(Formatter *f) const f->dump_float("new_full_ratio", new_full_ratio); f->dump_float("new_nearfull_ratio", new_nearfull_ratio); f->dump_float("new_backfillfull_ratio", new_backfillfull_ratio); + f->dump_string("new_require_min_compat_client", new_require_min_compat_client); if (fullmap.length()) { f->open_object_section("full_map"); @@ -1619,6 +1624,9 @@ int OSDMap::apply_incremental(const Incremental &inc) if (inc.new_full_ratio >= 0) { full_ratio = inc.new_full_ratio; } + if (inc.new_require_min_compat_client.length()) { + require_min_compat_client = inc.new_require_min_compat_client; + } // do new crush map last (after up/down stuff) if (inc.crush.length()) { @@ -2210,6 +2218,9 @@ void OSDMap::encode(bufferlist& bl, uint64_t features) const ::encode(full_ratio, bl); ::encode(backfillfull_ratio, bl); } + if (target_v >= 3) { + ::encode(require_min_compat_client, bl); + } ENCODE_FINISH(bl); // osd-only data } @@ -2445,6 +2456,7 @@ void OSDMap::decode(bufferlist::iterator& bl) } if (struct_v >= 3) { ::decode(backfillfull_ratio, bl); + ::decode(require_min_compat_client, bl); } else { backfillfull_ratio = 0; } @@ -2522,6 +2534,7 @@ void OSDMap::dump(Formatter *f) const f->dump_string("cluster_snapshot", get_cluster_snapshot()); f->dump_int("pool_max", get_pool_max()); f->dump_int("max_osd", get_max_osd()); + f->dump_string("require_min_compat_client", require_min_compat_client); auto mv = get_min_compat_client(); f->dump_string("min_compat_client", mv.first); f->dump_string("min_compat_client_version", mv.second); @@ -2738,6 +2751,11 @@ void OSDMap::print(ostream& out) const out << "full_ratio " << full_ratio << "\n"; out << "backfillfull_ratio " << backfillfull_ratio << "\n"; out << "nearfull_ratio " << nearfull_ratio << "\n"; + if (require_min_compat_client.length()) { + out << "require_min_compat_client " << require_min_compat_client << "\n"; + } + auto mv = get_min_compat_client(); + out << "min_compat_client " << mv.first << " " << mv.second << "\n"; if (get_cluster_snapshot().length()) out << "cluster_snapshot " << get_cluster_snapshot() << "\n"; out << "\n"; diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h index 1cc8f1cc0c0..1dc67090d44 100644 --- a/src/osd/OSDMap.h +++ b/src/osd/OSDMap.h @@ -172,6 +172,8 @@ public: float new_backfillfull_ratio = -1; float new_full_ratio = -1; + string new_require_min_compat_client; + mutable bool have_crc; ///< crc values are defined uint32_t full_crc; ///< crc of the resulting OSDMap mutable uint32_t inc_crc; ///< crc of this incremental @@ -270,6 +272,9 @@ private: float full_ratio = 0, backfillfull_ratio = 0, nearfull_ratio = 0; + /// min compat client we want to support + string require_min_compat_client; + mutable uint64_t cached_up_osd_features; mutable bool crc_defined; -- 2.39.5