[pve-devel] [PATCH v4 storage 1/2] Fix #1542: show storage utilization per pool

Alwin Antreich a.antreich at proxmox.com
Fri Apr 13 14:28:31 CEST 2018


 - get storage utilization per pool
 - use librados2-perl for pool status
 - add librados2-perl as build-depends and depends in debian/control

Signed-off-by: Alwin Antreich <a.antreich at proxmox.com>
---
 PVE/Storage.pm           |  3 +-
 PVE/Storage/RBDPlugin.pm | 72 +++++++++++++++++++++++++++++++++++-------------
 debian/control           |  2 ++
 3 files changed, 56 insertions(+), 21 deletions(-)

diff --git a/PVE/Storage.pm b/PVE/Storage.pm
index 4140a99..d733380 100755
--- a/PVE/Storage.pm
+++ b/PVE/Storage.pm
@@ -1065,8 +1065,7 @@ sub storage_info {
 	    next;
 	}
 
-	my ($total, $avail, $used, $active);
-	eval { ($total, $avail, $used, $active) = $plugin->status($storeid, $scfg, $cache); };
+	my ($total, $avail, $used, $active) = eval { $plugin->status($storeid, $scfg, $cache); };
 	warn $@ if $@;
 	next if !$active;
 	$info->{$storeid}->{total} = int($total);
diff --git a/PVE/Storage/RBDPlugin.pm b/PVE/Storage/RBDPlugin.pm
index fd5a2ef..e71494d 100644
--- a/PVE/Storage/RBDPlugin.pm
+++ b/PVE/Storage/RBDPlugin.pm
@@ -7,6 +7,7 @@ use Net::IP;
 use PVE::Tools qw(run_command trim);
 use PVE::Storage::Plugin;
 use PVE::JSONSchema qw(get_standard_option);
+use PVE::RADOS;
 
 use base qw(PVE::Storage::Plugin);
 
@@ -90,6 +91,50 @@ my $rados_cmd = sub {
     return $build_cmd->('/usr/bin/rados', $scfg, $storeid, $op, @options);
 };
 
+my $ceph_connect_option = sub {
+    my ($scfg, $storeid, %options) = @_;
+
+    my $cmd_option = {};
+    my $ceph_storeid_conf = "/etc/pve/priv/ceph/${storeid}.conf";
+    my $keyring = "/etc/pve/priv/ceph/${storeid}.keyring";
+    my $pveceph_managed = !defined($scfg->{monhost});
+
+    $cmd_option->{ceph_conf} = $pveceph_config if (-e $pveceph_config);
+
+    if (-e $ceph_storeid_conf) {
+	if ($pveceph_managed) {
+	    warn "ignoring custom ceph config for storage '$storeid', 'monhost' is not set (assuming pveceph managed cluster)!\n";
+	} else {
+	    $cmd_option->{ceph_conf} = $ceph_storeid_conf;
+	}
+    }
+
+    $cmd_option->{keyring} = $keyring if (-e $keyring);
+    $cmd_option->{auth_supported} = (defined $cmd_option->{keyring}) ? 'cephx' : 'none';
+    $cmd_option->{userid} =  $scfg->{username} ? $scfg->{username} : 'admin';
+    $cmd_option->{mon_host} = $hostlist->($scfg->{monhost}, ',') if (defined($scfg->{monhost}));
+
+    if (%options) {
+	foreach my $k (keys %options) {
+	    $cmd_option->{$k} = $options{$k};
+	}
+    }
+
+
+    return $cmd_option;
+
+};
+
+my $librados_connect = sub {
+    my ($scfg, $storeid, $options) = @_;
+
+    my $librados_config = $ceph_connect_option->($scfg, $storeid);
+
+    my $rados = PVE::RADOS->new(%$librados_config);
+
+    return $rados;
+};
+
 # needed for volumes created using ceph jewel (or higher)
 my $krbd_feature_disable = sub {
     my ($scfg, $storeid, $name) = @_;
@@ -539,28 +584,17 @@ sub list_images {
 sub status {
     my ($class, $storeid, $scfg, $cache) = @_;
 
-    my $cmd = &$rados_cmd($scfg, $storeid, 'df');
 
-    my $stats = {};
+    my $rados = &$librados_connect($scfg, $storeid);
+    my $df = $rados->mon_command({ prefix => 'df', format => 'json' });
 
-    my $parser = sub {
-	my $line = shift;
-	if ($line =~ m/^\s*total(?:\s|_)(\S+)\s+(\d+)(k|M|G|T)?/) {
-	    $stats->{$1} = $2;
-	    # luminous has units here..
-	    if ($3) {
-		$stats->{$1} *= $rbd_unittobytes->{$3}/1024;
-	    }
-	}
-    };
-
-    eval {
-	run_rbd_command($cmd, errmsg => "rados error", errfunc => sub {}, outfunc => $parser);
-    };
+    my ($d) = grep { $_->{name} eq $scfg->{pool} } @{$df->{pools}};
 
-    my $total = $stats->{space} ? $stats->{space}*1024 : 0;
-    my $free = $stats->{avail} ? $stats->{avail}*1024 : 0;
-    my $used = $stats->{used} ? $stats->{used}*1024: 0;
+    # max_avail -> max available space for data w/o replication in the pool
+    # bytes_used -> data w/o replication in the pool
+    my $free = $d->{stats}->{max_avail};
+    my $used = $d->{stats}->{bytes_used};
+    my $total = $used + $free;
     my $active = 1;
 
     return ($total, $free, $used, $active);
diff --git a/debian/control b/debian/control
index 3f39364..2cf585a 100644
--- a/debian/control
+++ b/debian/control
@@ -5,6 +5,7 @@ Maintainer: Proxmox Support Team <support at proxmox.com>
 Build-Depends: debhelper (>= 7.0.50~),
                libpve-common-perl (>= 5.0-28),
                libtest-mockmodule-perl,
+               librados2-perl,
                lintian,
                perl (>= 5.10.0-19),
                pve-doc-generator,
@@ -18,6 +19,7 @@ Depends: cstream,
          libfile-chdir-perl,
          libnet-dbus-perl,
          libpve-common-perl (>= 5.0-28),
+         librados2-perl,
          lvm2,
          nfs-common,
          perl (>= 5.6.0-16),
-- 
2.11.0




More information about the pve-devel mailing list