From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id A2EF41FF146 for ; Tue, 28 Apr 2026 04:46:27 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 4D7BB2600; Tue, 28 Apr 2026 04:46:27 +0200 (CEST) From: Kefu Chai To: pve-devel@lists.proxmox.com Subject: [PATCH manager 3/5] ceph: add require_osd_release upgrade check Date: Tue, 28 Apr 2026 10:45:36 +0800 Message-ID: <20260428024538.3559017-4-k.chai@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260428024538.3559017-1-k.chai@proxmox.com> References: <20260428024538.3559017-1-k.chai@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1777344256336 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.312 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: J4UCOWYKCGPBDHIQBVX4SESV7HFTVOO5 X-Message-ID-Hash: J4UCOWYKCGPBDHIQBVX4SESV7HFTVOO5 X-MailFrom: k.chai@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Add a get_osd_dump() helper in PVE::Ceph::Tools that wraps the 'osd dump' mon command, and use it to implement a new advisory check in PVE::Ceph::UpgradeCheck: require_osd_release. The check warns if require_osd_release is unset or older than the currently installed Ceph release on the node, and suggests running 'ceph osd require-osd-release ' once all OSDs are upgraded. Not setting this flag blocks a number of features that the OSDs would otherwise support. See https://docs.ceph.com/en/latest/rados/operations/require-osd-release/ Signed-off-by: Kefu Chai --- PVE/Ceph/Releases.pm | 14 ++++++++++ PVE/Ceph/Tools.pm | 6 +++++ PVE/Ceph/UpgradeCheck.pm | 57 +++++++++++++++++++++++++++++++++++++++- 3 files changed, 76 insertions(+), 1 deletion(-) diff --git a/PVE/Ceph/Releases.pm b/PVE/Ceph/Releases.pm index 324fcfaf..7eabda60 100644 --- a/PVE/Ceph/Releases.pm +++ b/PVE/Ceph/Releases.pm @@ -131,6 +131,20 @@ sub get_available_ceph_release_codenames($include_unstable_releases = 0) { my $_default_ceph_release_codename; +# Return the codename (e.g. 'squid') whose major release matches $major, +# searching all Ceph releases tracked in this module (i.e., not restricted +# to releases available on the current PVE version). Returns undef if no +# release matches. The inverse of looking up the major from +# get_ceph_release_info($codename). +sub get_codename_for_major_release($major) { + my $releases = get_ceph_release_def(); + for my $codename (keys $releases->%*) { + my ($release_major) = split(/\./, $releases->{$codename}->{release}); + return $codename if $release_major == $major; + } + return undef; +} + sub get_default_ceph_release_codename { if (!defined($_default_ceph_release_codename)) { my $ceph_releases = get_all_available_ceph_releases(); diff --git a/PVE/Ceph/Tools.pm b/PVE/Ceph/Tools.pm index c731ac14..4edc967b 100644 --- a/PVE/Ceph/Tools.pm +++ b/PVE/Ceph/Tools.pm @@ -112,6 +112,12 @@ sub get_cluster_versions { return $rados->mon_command({ prefix => $cmd }); } +sub get_osd_dump { + my ($rados) = @_; + $rados = PVE::RADOS->new() if !$rados; + return $rados->mon_command({ prefix => 'osd dump', format => 'json' }); +} + sub get_config { my $key = shift; diff --git a/PVE/Ceph/UpgradeCheck.pm b/PVE/Ceph/UpgradeCheck.pm index 6998caf2..5c454fd1 100644 --- a/PVE/Ceph/UpgradeCheck.pm +++ b/PVE/Ceph/UpgradeCheck.pm @@ -13,6 +13,7 @@ use warnings; use PVE::API2::Ceph; use PVE::API2::Cluster::Ceph; +use PVE::Ceph::Releases; use PVE::Ceph::Tools; use PVE::Cluster; @@ -50,7 +51,7 @@ sub run_checks { my ($health_msgs, $noout) = check_health($nodename); push @messages, $health_msgs->@*; - # TODO: check OSD min-required version, if to low it breaks stuff! + push @messages, check_require_osd_release($supported_release)->@*; my ($version_msgs, $noout_wanted) = check_versions($supported_release, $upgraded); push @messages, $version_msgs->@*; @@ -339,4 +340,58 @@ sub check_local_version_minimum { return \@out; } +# returns the numeric release value (e.g. 19.2) for a given codename, or undef +# if the codename is not known to PVE::Ceph::Releases. +my sub release_number { + my ($codename) = @_; + return undef if !$codename; + my $info = PVE::Ceph::Releases::get_ceph_release_info($codename); + return $info ? $info->{release} : undef; +} + +sub check_require_osd_release { + my ($supported_release) = @_; + + my @out; + + my $osdmap = eval { PVE::Ceph::Tools::get_osd_dump() }; + if ($@ || !$osdmap) { + my $err = $@ || 'empty osd dump'; + push @out, { level => 'warn', msg => "could not query osd dump: $err" }; + return \@out; + } + + my $current = $osdmap->{require_osd_release} // ''; + if (!$current) { + push @out, + { + level => 'warn', + msg => "require_osd_release is not set. Run" + . " 'ceph osd require-osd-release ' after all OSDs are upgraded to" + . " the new release.", + }; + return \@out; + } + + my $expected_codename = PVE::Ceph::Releases::get_codename_for_major_release($supported_release) + // PVE::Ceph::Releases::get_default_ceph_release_codename(); + my $expected_release = release_number($expected_codename); + my $current_release = release_number($current); + + if (!defined($current_release) || $current_release < $expected_release) { + push @out, + { + level => 'warn', + msg => "require_osd_release is '$current', older than '$expected_codename'." + . " Once all OSDs are upgraded, run" + . " 'ceph osd require-osd-release $expected_codename' to unlock features" + . " that depend on the newer release.", + }; + } else { + push @out, { level => 'pass', msg => "require_osd_release is at '$current'." }; + } + + return \@out; +} + 1; -- 2.47.3