all lists on lists.proxmox.com
 help / color / mirror / Atom feed
* [PATCH manager 0/1] ceph: tools: fix local monitor detection in purge_all_ceph_files
@ 2026-03-31  1:27 Kefu Chai
  2026-03-31  1:27 ` [PATCH manager 1/1] " Kefu Chai
  0 siblings, 1 reply; 2+ messages in thread
From: Kefu Chai @ 2026-03-31  1:27 UTC (permalink / raw)
  To: pve-devel

While reading the code, the call 'grep($addr, @$monlist)' caught my
eye -- 'grep' made me think of grep(1), which takes a regular
expression as its first argument. But the first argument here is
clearly not a regex.

That led me to https://perldoc.perl.org/functions/grep, where I read
that grep(EXPR, LIST) evaluates EXPR for each element with $_ aliased
to the current element -- similar to a lambda that takes $_ as its
implicit parameter. The expression in our case, '$type->{$name}->{addr}',
does not reference $_ at all, making it a constant predicate. It
evaluates to the same value (the addr string) for every element in the
list, so the result is the full list length rather than a membership
test.

I then searched for a Perl operator like 'in' or 'contains' to express
membership directly, but found no such built-in. List::Util::any is the
closest equivalent -- it makes the per-element comparison explicit and
short-circuits on the first match.

Kefu Chai (1):
  ceph: tools: fix local monitor detection in purge_all_ceph_files

 PVE/Ceph/Tools.pm | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

-- 
2.47.3





^ permalink raw reply	[flat|nested] 2+ messages in thread

* [PATCH manager 1/1] ceph: tools: fix local monitor detection in purge_all_ceph_files
  2026-03-31  1:27 [PATCH manager 0/1] ceph: tools: fix local monitor detection in purge_all_ceph_files Kefu Chai
@ 2026-03-31  1:27 ` Kefu Chai
  0 siblings, 0 replies; 2+ messages in thread
From: Kefu Chai @ 2026-03-31  1:27 UTC (permalink / raw)
  To: pve-devel

The grep call checking whether a monitor's address is in the configured
mon list did not reference $_, so it never performed a membership test:

  $is_local_mon = grep($type->{$name}->{addr}, @$monlist)

In Perl, grep(EXPR, LIST) aliases $_ to each element, but EXPR here is
'$type->{$name}->{addr}', which ignores $_. This is analogous to the
following Python, where the filter predicate is a constant:

  # wrong: sum(bool(addr) for _ in monlist) -- always len(monlist)
  # right: sum(1 for x in monlist if x == addr)

Because addr is a non-empty string (truthy), the wrong form returns the
full list length regardless of whether addr is actually in the list.
In Python terms, any(x == addr for x in monlist) would return False,
but the Perl grep returned 3 for a 3-element list.

This meant the foreign-monitor guard -- which exists to preserve config
files and keyrings when the local node is not listed as a monitor --
never triggered, and 'pveceph purge' would always delete them.

Use List::Util::any with an explicit equality check, which both expresses
the intent clearly and short-circuits on the first match.

Signed-off-by: Kefu Chai <k.chai@proxmox.com>
---
 PVE/Ceph/Tools.pm | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/PVE/Ceph/Tools.pm b/PVE/Ceph/Tools.pm
index 97ff3bd5..c731ac14 100644
--- a/PVE/Ceph/Tools.pm
+++ b/PVE/Ceph/Tools.pm
@@ -7,6 +7,7 @@ use File::Path;
 use File::Basename;
 use IO::File;
 use JSON;
+use List::Util qw(any);
 
 use PVE::Tools qw(run_command dir_glob_foreach extract_param);
 use PVE::Cluster qw(cfs_read_file);
@@ -133,7 +134,7 @@ sub purge_all_ceph_files {
         foreach my $name (keys %$type) {
             my $dir_exists = $type->{$name}->{direxists};
 
-            $is_local_mon = grep($type->{$name}->{addr}, @$monlist)
+            $is_local_mon = any { $_ eq $type->{$name}->{addr} } @$monlist
                 if $service eq 'mon';
 
             my $path = "/var/lib/ceph/$service";
-- 
2.47.3





^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-03-31  1:27 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-03-31  1:27 [PATCH manager 0/1] ceph: tools: fix local monitor detection in purge_all_ceph_files Kefu Chai
2026-03-31  1:27 ` [PATCH manager 1/1] " Kefu Chai

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal