pvestatd will read supported CPU flags once on startup (since these
never change during runtime, and QEMU updates trigger a service
restart), then broadcasts them as a key-value pair to the cluster.

Signed-off-by: Stefan Reiter <s.rei...@proxmox.com>
---

Changes from RFC:

* Cache joined value
* Add eval around QEMU query
* Detect value regression (e.g. "better" value available in cluster kv) and
  handle accordingly


 PVE/Service/pvestatd.pm | 28 ++++++++++++++++++++++++++--
 1 file changed, 26 insertions(+), 2 deletions(-)

diff --git a/PVE/Service/pvestatd.pm b/PVE/Service/pvestatd.pm
index e138b2e8..84258daf 100755
--- a/PVE/Service/pvestatd.pm
+++ b/PVE/Service/pvestatd.pm
@@ -47,12 +47,15 @@ my $cmdline = [$0, @ARGV];
 my %daemon_options = (restart_on_error => 5, stop_wait_time => 5);
 my $daemon = __PACKAGE__->new('pvestatd', $cmdline, %daemon_options);
 
+my $supported_cpuflags;
+
 sub init {
     my ($self) = @_;
 
     $opt_debug = $self->{debug};
 
     PVE::Cluster::cfs_update();
+    update_supported_cpuflags();
 }
 
 sub shutdown {
@@ -72,6 +75,25 @@ sub hup {
     $restart_request = 1;
 }
 
+sub update_supported_cpuflags {
+    eval {
+       $supported_cpuflags = join(" ", 
@{PVE::QemuServer::query_supported_cpu_flags()});
+    };
+    warn $@ if $@;
+
+    # detect regression
+    if (!$supported_cpuflags || $supported_cpuflags eq '') {
+       my $prev_cpuflags = PVE::Cluster::get_node_kv('cpuflags', 
$nodename)->{$nodename};
+       if ($prev_cpuflags && $prev_cpuflags ne '') {
+           $supported_cpuflags = $prev_cpuflags;
+           warn "CPU flag detection failed, using old values\n";
+       } else {
+           $supported_cpuflags = '';
+           warn "CPU flag detection failed and no previous values found\n";
+       }
+    }
+}
+
 my $generate_rrd_string = sub {
     my ($data) = @_;
 
@@ -91,7 +113,9 @@ sub update_node_status {
 
     my $cpuinfo = PVE::ProcFSTools::read_cpuinfo();
 
-    my $maxcpu = $cpuinfo->{cpus}; 
+    my $maxcpu = $cpuinfo->{cpus};
+
+    PVE::Cluster::broadcast_node_kv('cpuflags', $supported_cpuflags);
 
     my $subinfo = PVE::INotify::read_file('subscription');
     my $sublevel = $subinfo->{level} || '';
@@ -104,7 +128,7 @@ sub update_node_status {
        $netin += $netdev->{$dev}->{receive};
        $netout += $netdev->{$dev}->{transmit};
     }
- 
+
     my $meminfo = PVE::ProcFSTools::read_meminfo();
 
     my $dinfo = df('/', 1);     # output is bytes
-- 
2.20.1


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

Reply via email to