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 <[email protected]> --- 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 _______________________________________________ pve-devel mailing list [email protected] https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
