Am 28/03/2023 um 14:49 schrieb Matthias Heiserer:
> Signed-off-by: Matthias Heiserer <m.heise...@proxmox.com>
> ---
> Changes from v1:
> None
> 
>  src/PVE/ProcFSTools.pm | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/src/PVE/ProcFSTools.pm b/src/PVE/ProcFSTools.pm
> index eb4b0f5..0686c34 100644
> --- a/src/PVE/ProcFSTools.pm
> +++ b/src/PVE/ProcFSTools.pm
> @@ -283,6 +283,7 @@ sub read_meminfo {
>       swaptotal => 0,
>       swapfree => 0,
>       swapused => 0,
> +     arcsize => 0,
>      };
>  
>      my $fh = IO::File->new ("/proc/meminfo", "r");
> @@ -307,6 +308,11 @@ sub read_meminfo {
>      my $spages = 
> PVE::Tools::file_read_firstline("/sys/kernel/mm/ksm/pages_sharing") // 0 ;
>      $res->{memshared} = int($spages) * 4096;
>  
> +    my $arcstats = 
> PVE::Tools::file_get_contents("/proc/spl/kstat/zfs/arcstats");

file_get_contents dies if the file isn't there, which might happen e.g., on PMG 
or if
one disables ZFS – why ever that would be.

so rather do:

my $arcstats = eval { 
PVE::Tools::file_get_contents("/proc/spl/kstat/zfs/arcstats") };

(just ignore the error, alternatively we could set a flag on ENOENT to avoid 
querying that
the next time, but that would be just an optimization).

> +    if ($arcstats && $arcstats =~ m/size\s+\d+\s+(\d+)/m) {

this match is rather brittle as there are multiple lines with size, e.g:

grep -P 'size\s+\d+\s+(\d+)' /proc/spl/kstat/zfs/arcstats
size                            4    5356816
compressed_size                 4    221696
uncompressed_size               4    5079552
overhead_size                   4    4947968
hdr_size                        4    29520
data_size                       4    0
metadata_size                   4    5169664
dbuf_size                       4    38016
dnode_size                      4    93248
bonus_size                      4    14080
anon_size                       4    0
mru_size                        4    2696704
mru_ghost_size                  4    0
mfu_size                        4    2472960
mfu_ghost_size                  4    0
l2_prefetch_asize               4    0
l2_mru_asize                    4    0
l2_mfu_asize                    4    0
l2_bufc_data_asize              4    0
l2_bufc_metadata_asize          4    0
l2_size                         4    0
l2_asize                        4    0
l2_hdr_size                     4    0
l2_log_blk_avg_asize            4    0
l2_log_blk_asize                4    0
l2_rebuild_size                 4    0
l2_rebuild_asize                4    0
arc_raw_size                    4    0
abd_chunk_waste_size            4    12288

so it hard depends on ZFS never changing the existing order or adding another 
field that
matches before the actual size one. So please add start/end anchors, e.g.:

if ($arcstats && $arcstats =~ m/^size\s+\d+\s+(\d+)$/m) {


> +     $res->{arcsize} = int ($1);

nit: extra whitespace after `int` and before the parenthesis.

> +    }
> +
>      return $res;
>  }
>  



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to