public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Lukas Wagner <l.wagner@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [RFC pve-storage 7/7] stats: api: cache storage plugin status
Date: Mon, 21 Aug 2023 15:44:44 +0200	[thread overview]
Message-ID: <20230821134444.620021-8-l.wagner@proxmox.com> (raw)
In-Reply-To: <20230821134444.620021-1-l.wagner@proxmox.com>

Cache storage plugin status so that pvestatd and API calls can use the
cached results, without having to query all storage plugins again.

Signed-off-by: Lukas Wagner <l.wagner@proxmox.com>
---
 src/PVE/API2/Storage/Config.pm | 10 +++++++++
 src/PVE/Storage.pm             | 40 ++++++++++++++++++++++++----------
 2 files changed, 39 insertions(+), 11 deletions(-)

diff --git a/src/PVE/API2/Storage/Config.pm b/src/PVE/API2/Storage/Config.pm
index e04b6ab..8c3df99 100755
--- a/src/PVE/API2/Storage/Config.pm
+++ b/src/PVE/API2/Storage/Config.pm
@@ -16,6 +16,7 @@ use PVE::JSONSchema qw(get_standard_option);
 use PVE::RPCEnvironment;
 
 use PVE::RESTHandler;
+use PVE::RS::Cache;
 
 use base qw(PVE::RESTHandler);
 
@@ -274,6 +275,9 @@ __PACKAGE__->register_method ({
 		die $err;
 	    }
 
+	    # Remove cached plugin status on configuration changes.
+	    PVE::RS::Cache->pvestatd_cache()->delete("storage_plugin_status");
+
 	    PVE::Storage::write_config($cfg);
 
 	}, "create storage failed");
@@ -373,6 +377,9 @@ __PACKAGE__->register_method ({
 		    ." in Proxmox VE 9. Use 'create-base-path' or 'create-subdirs' instead.\n"
 	    }
 
+	    # Remove cached plugin status on configuration changes.
+	    PVE::RS::Cache->pvestatd_cache()->delete("storage_plugin_status");
+
 	    PVE::Storage::write_config($cfg);
 
 	}, "update storage failed");
@@ -422,6 +429,9 @@ __PACKAGE__->register_method ({
 
 	    delete $cfg->{ids}->{$storeid};
 
+	    # Remove cached plugin status on configuration changes.
+	    PVE::RS::Cache->pvestatd_cache()->delete("storage_plugin_status");
+
 	    PVE::Storage::write_config($cfg);
 
 	}, "delete storage failed");
diff --git a/src/PVE/Storage.pm b/src/PVE/Storage.pm
index a4d85e1..7aa3b2e 100755
--- a/src/PVE/Storage.pm
+++ b/src/PVE/Storage.pm
@@ -23,6 +23,7 @@ use PVE::INotify;
 use PVE::RPCEnvironment;
 use PVE::SSHInfo;
 use PVE::RESTEnvironment qw(log_warn);
+use PVE::RS::Cache;
 
 use PVE::Storage::Plugin;
 use PVE::Storage::DirPlugin;
@@ -1276,6 +1277,10 @@ sub storage_info {
 
     my $cache = {};
 
+    my $status_cache = PVE::RS::Cache->pvestatd_cache();
+    my $cached_status = $status_cache->get("storage_plugin_status");
+    my $refresh_status = !$cached_status;
+
     foreach my $storeid (keys %$ids) {
 	my $scfg = $ids->{$storeid};
 
@@ -1291,21 +1296,34 @@ sub storage_info {
 		if $pd->{select_existing};
 	}
 
-	eval { activate_storage($cfg, $storeid, $cache); };
-	if (my $err = $@) {
-	    warn $err;
-	    next;
+	if ($refresh_status) {
+	    eval { activate_storage($cfg, $storeid, $cache); };
+	    if (my $err = $@) {
+		warn $err;
+		next;
+	    }
+	    $cached_status->{$storeid} = eval { $plugin->status($storeid, $scfg, $cache); };
+
+	    my ($total, $avail, $used, $active) = eval { $plugin->status($storeid, $scfg, $cache); };
+	    warn $@ if $@;
+	    $cached_status->{$storeid} = {};
+
+	    $cached_status->{$storeid}->{total} = int($total);
+	    $cached_status->{$storeid}->{avail} = int($avail);
+	    $cached_status->{$storeid}->{used} = int($used);
+	    $cached_status->{$storeid}->{active} = $active;
+	    next if !$active;
 	}
 
-	my ($total, $avail, $used, $active) = eval { $plugin->status($storeid, $scfg, $cache); };
-	warn $@ if $@;
-	next if !$active;
-	$info->{$storeid}->{total} = int($total);
-	$info->{$storeid}->{avail} = int($avail);
-	$info->{$storeid}->{used} = int($used);
-	$info->{$storeid}->{active} = $active;
+	$info->{$storeid}->{total} = $cached_status->{$storeid}->{total};
+	$info->{$storeid}->{avail} = $cached_status->{$storeid}->{avail};
+	$info->{$storeid}->{used} = $cached_status->{$storeid}->{used};
+	$info->{$storeid}->{active} = $cached_status->{$storeid}->{active};
     }
 
+    # TODO: How long should status results be valid?
+    $status_cache->set('storage_plugin_status', $cached_status, 30) if $refresh_status;
+
     return $info;
 }
 
-- 
2.39.2





  parent reply	other threads:[~2023-08-21 13:45 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-21 13:44 [pve-devel] [RFC storage/proxmox{, -perl-rs} 0/7] cache storage plugin status for pvestatd/API status update calls Lukas Wagner
2023-08-21 13:44 ` [pve-devel] [RFC proxmox 1/7] sys: fs: move tests to a sub-module Lukas Wagner
2023-08-30 15:38   ` [pve-devel] applied: " Thomas Lamprecht
2023-08-21 13:44 ` [pve-devel] [RFC proxmox 2/7] sys: add make_tmp_dir Lukas Wagner
2023-08-22  8:39   ` Wolfgang Bumiller
2023-08-21 13:44 ` [pve-devel] [RFC proxmox 3/7] sys: fs: remove unnecessary clippy allow directive Lukas Wagner
2023-08-21 13:44 ` [pve-devel] [RFC proxmox 4/7] cache: add new crate 'proxmox-cache' Lukas Wagner
2023-08-22 10:08   ` Max Carrara
2023-08-22 11:33     ` Lukas Wagner
2023-08-22 12:01       ` Wolfgang Bumiller
2023-08-22 11:56     ` Wolfgang Bumiller
2023-08-22 13:52       ` Max Carrara
2023-08-21 13:44 ` [pve-devel] [RFC proxmox 5/7] cache: add debian packaging Lukas Wagner
2023-08-21 13:44 ` [pve-devel] [RFC proxmox-perl-rs 6/7] cache: add bindings for `SharedCache` from `proxmox-cache` Lukas Wagner
2023-08-21 13:44 ` Lukas Wagner [this message]
2023-08-22  8:51   ` [pve-devel] [RFC pve-storage 7/7] stats: api: cache storage plugin status Lukas Wagner
2023-08-22  9:17 ` [pve-devel] [RFC storage/proxmox{, -perl-rs} 0/7] cache storage plugin status for pvestatd/API status update calls Fiona Ebner
2023-08-22 11:25   ` Wolfgang Bumiller
2023-08-30 17:07   ` Wolf Noble

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230821134444.620021-8-l.wagner@proxmox.com \
    --to=l.wagner@proxmox.com \
    --cc=pve-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal