From c85f9a1031da6eeda4960b9abdb70438de095286 Mon Sep 17 00:00:00 2001 From: Angel Luis Moya Gonzalez Date: Tue, 28 Apr 2020 17:32:03 +0200 Subject: [PATCH] F #4302: create one status db per host. (#4622) Change to allow one status database per host avoiding locks --- .../az-probes.d/vm/status/probe_vm_status.rb | 4 +++- .../ec2-probes.d/vm/status/probe_vm_status.rb | 4 +++- .../firecracker-probes.d/vm/status/state.rb | 4 +++- .../remotes/kvm-probes.d/vm/status/state.rb | 4 +++- src/im_mad/remotes/lib/probe_db.rb | 18 +++++++++++------- .../remotes/lxd-probes.d/vm/status/state.rb | 4 +++- .../one-probes.d/vm/status/probe_vm_status.rb | 4 +++- .../vm/status/probe_vm_status.rb | 4 +++- .../vcenter-probes.d/vms/status/state.rb | 4 +++- 9 files changed, 35 insertions(+), 15 deletions(-) diff --git a/src/im_mad/remotes/az-probes.d/vm/status/probe_vm_status.rb b/src/im_mad/remotes/az-probes.d/vm/status/probe_vm_status.rb index e02e896eaa..9aa02fe396 100755 --- a/src/im_mad/remotes/az-probes.d/vm/status/probe_vm_status.rb +++ b/src/im_mad/remotes/az-probes.d/vm/status/probe_vm_status.rb @@ -41,10 +41,12 @@ host_id = ARGV[-2] begin vmdb = VirtualMachineDB.new('az', + host, + host_id, :missing_state => 'UNKNOWN', :sync => 180) vmdb.purge - puts vmdb.to_status(host, host_id) + puts vmdb.to_status rescue StandardError => e OpenNebula.handle_driver_exception('im probe_vm_status', e, host) end diff --git a/src/im_mad/remotes/ec2-probes.d/vm/status/probe_vm_status.rb b/src/im_mad/remotes/ec2-probes.d/vm/status/probe_vm_status.rb index 813c107ca5..0ab533b3a9 100755 --- a/src/im_mad/remotes/ec2-probes.d/vm/status/probe_vm_status.rb +++ b/src/im_mad/remotes/ec2-probes.d/vm/status/probe_vm_status.rb @@ -41,10 +41,12 @@ host_id = ARGV[-2] begin vmdb = VirtualMachineDB.new('ec2', + host, + host_id, :missing_state => 'UNKNOWN', :sync => 180) vmdb.purge - puts vmdb.to_status(host, host_id) + puts vmdb.to_status rescue StandardError => e OpenNebula.handle_driver_exception('im probe_vm_status', e, host) end diff --git a/src/im_mad/remotes/firecracker-probes.d/vm/status/state.rb b/src/im_mad/remotes/firecracker-probes.d/vm/status/state.rb index b9c19d40b9..1a3df11955 100755 --- a/src/im_mad/remotes/firecracker-probes.d/vm/status/state.rb +++ b/src/im_mad/remotes/firecracker-probes.d/vm/status/state.rb @@ -16,11 +16,13 @@ end begin vmdb = VirtualMachineDB.new('firecracker', + host, + host_id, :missing_state => 'POWEROFF', :sync => sync) vmdb.purge - puts vmdb.to_status(host, host_id) + puts vmdb.to_status rescue StandardError => e puts e end diff --git a/src/im_mad/remotes/kvm-probes.d/vm/status/state.rb b/src/im_mad/remotes/kvm-probes.d/vm/status/state.rb index 138042bd26..77a19af5b0 100755 --- a/src/im_mad/remotes/kvm-probes.d/vm/status/state.rb +++ b/src/im_mad/remotes/kvm-probes.d/vm/status/state.rb @@ -18,11 +18,13 @@ KVM.load_conf begin vmdb = VirtualMachineDB.new('kvm', + host, + host_id, :missing_state => 'POWEROFF', :sync => sync) vmdb.purge - puts vmdb.to_status(host, host_id) + puts vmdb.to_status rescue StandardError => e puts e end diff --git a/src/im_mad/remotes/lib/probe_db.rb b/src/im_mad/remotes/lib/probe_db.rb index 0a60bea478..633578176e 100644 --- a/src/im_mad/remotes/lib/probe_db.rb +++ b/src/im_mad/remotes/lib/probe_db.rb @@ -51,7 +51,7 @@ class VirtualMachineDB DEFAULT_CONFIGURATION = { :times_missing => 3, :obsolete => 720, - :db_path => "#{__dir__}/../status.db", + :base_path => "#{__dir__}/../", :sync => 180, :missing_state => "POWEROFF" } @@ -73,8 +73,10 @@ class VirtualMachineDB File.unlink(conf[:db_path]) end - def initialize(hyperv, opts = {}) - @conf = VirtualMachineDB.load_conf(hyperv, opts) + def initialize(hyperv, host, host_id, opts = {}) + @host = host + @host_id = host_id + @conf = VirtualMachineDB.load_conf(hyperv, @host_id, opts) @mtime = 0 @mtime = File.mtime(@conf[:db_path]) if File.exist?(@conf[:db_path]) @@ -95,17 +97,17 @@ class VirtualMachineDB # Returns the VM status that changed compared to the DB info as well # as VMs that have been reported as missing more than missing_times - def to_status(host, host_id) + def to_status time = Time.now.to_i last = @db.execute("SELECT MAX(timestamp) from #{@dataset}").flatten![0] last ||= @mtime.to_i - return sync_status(host, host_id) if last == 0 || time > (last + @conf[:sync]) + return sync_status(@host, @host_id) if last == 0 || time > (last + @conf[:sync]) status_str = '' monitor_ids = [] - vms = DomainList.state_info(host, host_id) + vms = DomainList.state_info(@host, @host_id) # ---------------------------------------------------------------------- # report state changes in vms @@ -239,7 +241,7 @@ class VirtualMachineDB end # Load configuration file and parse user provided options - def self.load_conf(hyperv, opts) + def self.load_conf(hyperv, host_id, opts) conf_path = "#{__dir__}/../../etc/im/#{hyperv}-probes.d/probe_db.conf" etc_conf = YAML.load_file(conf_path) rescue nil @@ -250,6 +252,8 @@ class VirtualMachineDB conf.merge! opts conf[:hyperv] = hyperv + conf[:db_path] = File.join(conf[:base_path], + "status_#{hyperv}_#{host_id}.db") conf end diff --git a/src/im_mad/remotes/lxd-probes.d/vm/status/state.rb b/src/im_mad/remotes/lxd-probes.d/vm/status/state.rb index 4b854372ee..426f425510 100755 --- a/src/im_mad/remotes/lxd-probes.d/vm/status/state.rb +++ b/src/im_mad/remotes/lxd-probes.d/vm/status/state.rb @@ -78,11 +78,13 @@ end begin vmdb = VirtualMachineDB.new('lxd', + host, + host_id, :missing_state => 'POWEROFF', :sync => sync) vmdb.purge - puts vmdb.to_status(host, host_id) + puts vmdb.to_status rescue StandardError => e puts e end diff --git a/src/im_mad/remotes/one-probes.d/vm/status/probe_vm_status.rb b/src/im_mad/remotes/one-probes.d/vm/status/probe_vm_status.rb index 9916154a80..3ac2de6f2b 100755 --- a/src/im_mad/remotes/one-probes.d/vm/status/probe_vm_status.rb +++ b/src/im_mad/remotes/one-probes.d/vm/status/probe_vm_status.rb @@ -41,10 +41,12 @@ host_id = ARGV[-2] begin vmdb = VirtualMachineDB.new('one2one', + host, + host_id, :missing_state => 'UNKNOWN', :sync => 180) vmdb.purge - puts vmdb.to_status(host, host_id) + puts vmdb.to_status rescue StandardError => e OpenNebula.handle_driver_exception('im probe_vm_status', e, host) end diff --git a/src/im_mad/remotes/packet-probes.d/vm/status/probe_vm_status.rb b/src/im_mad/remotes/packet-probes.d/vm/status/probe_vm_status.rb index 60de7751de..0cd9224283 100755 --- a/src/im_mad/remotes/packet-probes.d/vm/status/probe_vm_status.rb +++ b/src/im_mad/remotes/packet-probes.d/vm/status/probe_vm_status.rb @@ -41,10 +41,12 @@ host_id = ARGV[-2] begin vmdb = VirtualMachineDB.new('packet', + host, + host_id, :missing_state => 'UNKNOWN', :sync => 180) vmdb.purge - puts vmdb.to_status(host, host_id) + puts vmdb.to_status rescue StandardError => e OpenNebula.handle_driver_exception('im probe_vm_status', e, host) end diff --git a/src/im_mad/remotes/vcenter-probes.d/vms/status/state.rb b/src/im_mad/remotes/vcenter-probes.d/vms/status/state.rb index 0a6ad7c789..807728194b 100755 --- a/src/im_mad/remotes/vcenter-probes.d/vms/status/state.rb +++ b/src/im_mad/remotes/vcenter-probes.d/vms/status/state.rb @@ -41,10 +41,12 @@ host_id = ARGV[-2] begin vmdb = VirtualMachineDB.new('vcenter', + host, + host_id, :missing_state => 'UNKNOWN', :sync => 180) vmdb.purge - puts vmdb.to_status(host, host_id) + puts vmdb.to_status rescue StandardError => e OpenNebula.handle_driver_exception('im probe_vm_status', e, host) end \ No newline at end of file