From 9596e2414c1b6b385bfc52d6149b703815c0a6bb Mon Sep 17 00:00:00 2001 From: Kotresh HR Date: Fri, 7 Mar 2025 16:06:42 +0530 Subject: [PATCH] mds: Add fs option use_global_snaprealm The fs option use_global_snaprealm is introduced to handle upgrade scenario of referent inode feature [1] This option is enabled be default which exhibits the existing behaviour i.e. snapshots will use global snaprealm. This option is used along with 'allow_referent_inodes' on the new filesystems to disable global snaprealm. [1] https://tracker.ceph.com/issues/54205 Fixes: https://tracker.ceph.com/issues/69336 Signed-off-by: Kotresh HR --- src/include/ceph_fs.h | 4 +++- src/mds/MDSMap.cc | 3 +++ src/mds/MDSMap.h | 12 +++++++++++- src/mon/FSCommands.cc | 22 ++++++++++++++++++++++ src/mon/MonCommands.h | 1 + 5 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/include/ceph_fs.h b/src/include/ceph_fs.h index a5c53be61515f..0b61ec3b76cbf 100644 --- a/src/include/ceph_fs.h +++ b/src/include/ceph_fs.h @@ -294,8 +294,10 @@ struct ceph_mon_subscribe_ack { for another fs */ #define CEPH_MDSMAP_BALANCE_AUTOMATE (1<<8) /* automate metadata balancing */ #define CEPH_MDSMAP_REFERENT_INODES (1<<9) /* create referent inode for hardlinks to store backtrace */ +#define CEPH_MDSMAP_GLOBAL_SNAPREALM (1<<10) /* use global snaprealm for hardlink snapshots */ #define CEPH_MDSMAP_DEFAULTS (CEPH_MDSMAP_ALLOW_SNAPS | \ - CEPH_MDSMAP_ALLOW_MULTIMDS_SNAPS) + CEPH_MDSMAP_ALLOW_MULTIMDS_SNAPS | \ + CEPH_MDSMAP_GLOBAL_SNAPREALM) /* * mds states diff --git a/src/mds/MDSMap.cc b/src/mds/MDSMap.cc index 4376fe9313fa3..b7d82b7df88b1 100644 --- a/src/mds/MDSMap.cc +++ b/src/mds/MDSMap.cc @@ -252,6 +252,7 @@ void MDSMap::dump_flags_state(Formatter *f) const f->dump_bool(flag_display.at(CEPH_MDSMAP_REFUSE_STANDBY_FOR_ANOTHER_FS), test_flag(CEPH_MDSMAP_REFUSE_STANDBY_FOR_ANOTHER_FS)); f->dump_bool(flag_display.at(CEPH_MDSMAP_BALANCE_AUTOMATE), test_flag(CEPH_MDSMAP_BALANCE_AUTOMATE)); f->dump_bool(flag_display.at(CEPH_MDSMAP_REFERENT_INODES), allow_referent_inodes()); + f->dump_bool(flag_display.at(CEPH_MDSMAP_GLOBAL_SNAPREALM), use_global_snaprealm()); f->close_section(); } @@ -401,6 +402,8 @@ void MDSMap::print_flags(std::ostream& out) const { out << " " << flag_display.at(CEPH_MDSMAP_BALANCE_AUTOMATE); if (allow_referent_inodes()) out << " " << flag_display.at(CEPH_MDSMAP_REFERENT_INODES); + if (use_global_snaprealm()) + out << " " << flag_display.at(CEPH_MDSMAP_GLOBAL_SNAPREALM); } void MDSMap::get_health(list >& summary, diff --git a/src/mds/MDSMap.h b/src/mds/MDSMap.h index 05c2a5f67af86..11e272264b998 100644 --- a/src/mds/MDSMap.h +++ b/src/mds/MDSMap.h @@ -247,6 +247,15 @@ public: bool allow_referent_inodes() const { return test_flag(CEPH_MDSMAP_REFERENT_INODES); } bool was_referent_inodes_ever_used() const { return ever_allowed_features & CEPH_MDSMAP_REFERENT_INODES; } + void set_global_snaprealm() { + set_flag(CEPH_MDSMAP_GLOBAL_SNAPREALM); + ever_allowed_features |= CEPH_MDSMAP_GLOBAL_SNAPREALM; + explicitly_allowed_features |= CEPH_MDSMAP_GLOBAL_SNAPREALM; + } + void clear_global_snaprealm() { clear_flag(CEPH_MDSMAP_GLOBAL_SNAPREALM); } + bool use_global_snaprealm() const { return test_flag(CEPH_MDSMAP_GLOBAL_SNAPREALM); } + bool was_global_snaprealm_ever_used() const { return ever_allowed_features & CEPH_MDSMAP_GLOBAL_SNAPREALM; } + void set_standby_replay_allowed() { set_flag(CEPH_MDSMAP_ALLOW_STANDBY_REPLAY); ever_allowed_features |= CEPH_MDSMAP_ALLOW_STANDBY_REPLAY; @@ -729,7 +738,8 @@ private: {CEPH_MDSMAP_REFUSE_CLIENT_SESSION, "refuse_client_session"}, {CEPH_MDSMAP_REFUSE_STANDBY_FOR_ANOTHER_FS, "refuse_standby_for_another_fs"}, {CEPH_MDSMAP_BALANCE_AUTOMATE, "balance_automate"}, - {CEPH_MDSMAP_REFERENT_INODES, "allow_referent_inodes"} + {CEPH_MDSMAP_REFERENT_INODES, "allow_referent_inodes"}, + {CEPH_MDSMAP_GLOBAL_SNAPREALM, "use_global_snaprealm"} }; }; WRITE_CLASS_ENCODER_FEATURES(MDSMap::mds_info_t) diff --git a/src/mon/FSCommands.cc b/src/mon/FSCommands.cc index ac5b87a3c715a..7f795235a4ff7 100644 --- a/src/mon/FSCommands.cc +++ b/src/mon/FSCommands.cc @@ -620,6 +620,28 @@ int FileSystemCommandHandler::set_val(Monitor *mon, FSMap& fsmap, MonOpRequestRe }); ss << "Enabled creation of referent inodes for hardlinks to store backtrace"; } + } else if (var == "use_global_snaprealm") { + bool use_global_snaprealm = false; + int r = parse_bool(val, &use_global_snaprealm, ss); + if (r != 0) { + return r; + } + + if (!use_global_snaprealm) { + modify_filesystem(fsmap, fsv, + [](auto&& fs) + { + fs.get_mds_map().clear_global_snaprealm(); + }); + ss << "Disable global snaprealm for hardlink snapshot"; + } else { + modify_filesystem(fsmap, fsv, + [](auto&& fs) + { + fs.get_mds_map().set_global_snaprealm(); + }); + ss << "Use global snaprealm for hardlink snapshot"; + } } else if (var == "allow_dirfrags") { ss << "Directory fragmentation is now permanently enabled." << " This command is DEPRECATED and will be REMOVED from future releases."; diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index a53d1adce9e2a..cdb4258c3db98 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -408,6 +408,7 @@ COMMAND("fs set " "|session_timeout" "|standby_count_wanted" "|allow_referent_inodes" + "|use_global_snaprealm" " " "name=val,type=CephString " "name=yes_i_really_mean_it,type=CephBool,req=false " -- 2.39.5