[pve-devel] [PATCH v2 storage] lvm: improve warning in case vgs output contains unexpected lines
Friedrich Weber
f.weber at proxmox.com
Thu Jan 18 12:11:47 CET 2024
If the metadata archive under /etc/lvm/archive for a particular VG has
a lot of files or is overly large, `vgs` occasionally prints a message
to stdout [1]. Currently, the LVM plugin tries to parse this message
and thus produces the following confusing warnings in the output of
`pvesm status` or the journal (via pvestatd):
Use of uninitialized value $size in int at [...]/LVMPlugin.pm line 133
Use of uninitialized value $free in int at [...]/LVMPlugin.pm line 133
Use of uninitialized value $lvcount in int [...]/LVMPlugin.pm line 133
Reported in enterprise support where LVM picked up on VGs on VM disks
(due to a missing KRBD device filter in the LVM config), and since
several VM disks had VGs with the same name, LVM quickly produced a
lot of files in /etc/lvm/archive.
Reproducible as follows with a VG named `spam`:
for i in $(seq 8192);
do vgrename spam spam2; vgrename spam2 spam; done
rm /etc/lvm/backup/spam; vgs -o vg_name
Output (linebreak for readability):
Consider pruning spam VG archive with more then 8 MiB in 8268\n
files (check archiving is needed in lvm.conf).
VG
spam
With this patch, the LVM plugin instead prints a human-readable
warning about the unexpected line.
[1] https://sourceware.org/git/?p=lvm2.git;a=blob;f=lib/format_text/archive.c;h=5acf0c04a;hb=38e0c7a1#l222
Signed-off-by: Friedrich Weber <f.weber at proxmox.com>
---
Notes:
changes from v1 [2]:
* warn about the unexpected line instead of simply ignoring it
[2] https://lists.proxmox.com/pipermail/pve-devel/2024-January/061333.html
src/PVE/Storage/LVMPlugin.pm | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/PVE/Storage/LVMPlugin.pm b/src/PVE/Storage/LVMPlugin.pm
index 4b951e7..5377823 100644
--- a/src/PVE/Storage/LVMPlugin.pm
+++ b/src/PVE/Storage/LVMPlugin.pm
@@ -130,6 +130,11 @@ sub lvm_vgs {
my ($name, $size, $free, $lvcount, $pvname, $pvsize, $pvfree) = split (':', $line);
+ if (!defined($size) || !defined($free) || !defined($lvcount)) {
+ warn "unexpected output from vgs: $line\n";
+ return;
+ }
+
$vgs->{$name} //= {
size => int ($size),
free => int ($free),
--
2.39.2
More information about the pve-devel
mailing list