|
|
3f6cae |
From 45732498ed6d77ee783b6713a50190098b1678ac Mon Sep 17 00:00:00 2001
|
|
|
3f6cae |
From: Ivan Devat <idevat@redhat.com>
|
|
|
3f6cae |
Date: Thu, 7 Feb 2019 11:08:11 +0100
|
|
|
3f6cae |
Subject: [PATCH] squash, fix web UI dashboard data loading timeout
|
|
|
3f6cae |
|
|
|
3f6cae |
load systemctl/chkconfig services list only once
|
|
|
3f6cae |
|
|
|
3f6cae |
Systemctl/chkconfig services have been retrived repeatedly for each
|
|
|
3f6cae |
service (pacemaker, pacemaker_remote, corosync, pcsd, sbd). It had
|
|
|
3f6cae |
a performace impact on loading clusters overview.
|
|
|
3f6cae |
|
|
|
3f6cae |
clean up a check whether services are installed
|
|
|
3f6cae |
---
|
|
|
3f6cae |
pcsd/cluster_entity.rb | 3 +-
|
|
|
3f6cae |
pcsd/pcs.rb | 81 ++++++++++++++++++++++++++++++------------
|
|
|
3f6cae |
pcsd/remote.rb | 4 ++-
|
|
|
3f6cae |
3 files changed, 64 insertions(+), 24 deletions(-)
|
|
|
3f6cae |
|
|
|
3f6cae |
diff --git a/pcsd/cluster_entity.rb b/pcsd/cluster_entity.rb
|
|
|
3f6cae |
index 79f25450..861dd0c5 100644
|
|
|
3f6cae |
--- a/pcsd/cluster_entity.rb
|
|
|
3f6cae |
+++ b/pcsd/cluster_entity.rb
|
|
|
3f6cae |
@@ -1177,10 +1177,11 @@ module ClusterEntity
|
|
|
3f6cae |
|
|
|
3f6cae |
def self.load_current_node(crm_dom=nil)
|
|
|
3f6cae |
node = ClusterEntity::Node.new
|
|
|
3f6cae |
+ service_checker = get_service_installed_checker()
|
|
|
3f6cae |
node.services.each do |service, info|
|
|
|
3f6cae |
info[:running] = is_service_running?(service.to_s)
|
|
|
3f6cae |
info[:enabled] = is_service_enabled?(service.to_s)
|
|
|
3f6cae |
- info[:installed] = is_service_installed?(service.to_s)
|
|
|
3f6cae |
+ info[:installed] = service_checker.is_installed?(service.to_s)
|
|
|
3f6cae |
end
|
|
|
3f6cae |
node.corosync = node.services[:corosync][:running]
|
|
|
3f6cae |
node.corosync_enabled = node.services[:corosync][:enabled]
|
|
|
3f6cae |
diff --git a/pcsd/pcs.rb b/pcsd/pcs.rb
|
|
|
3f6cae |
index 1f86ae04..7035f4f2 100644
|
|
|
3f6cae |
--- a/pcsd/pcs.rb
|
|
|
3f6cae |
+++ b/pcsd/pcs.rb
|
|
|
3f6cae |
@@ -1728,35 +1728,72 @@ def is_service_running?(service)
|
|
|
3f6cae |
return (retcode == 0)
|
|
|
3f6cae |
end
|
|
|
3f6cae |
|
|
|
3f6cae |
-def is_service_installed?(service)
|
|
|
3f6cae |
- unless ISSYSTEMCTL
|
|
|
3f6cae |
- stdout, _, retcode = run_cmd(PCSAuth.getSuperuserAuth(), 'chkconfig')
|
|
|
3f6cae |
- if retcode != 0
|
|
|
3f6cae |
+class ServiceInstalledChecker
|
|
|
3f6cae |
+ def initialize()
|
|
|
3f6cae |
+ @list_unit_files_output = self.load_unit_files_list()
|
|
|
3f6cae |
+ end
|
|
|
3f6cae |
+
|
|
|
3f6cae |
+ def is_installed?(service)
|
|
|
3f6cae |
+ if @list_unit_files_output.nil?
|
|
|
3f6cae |
return nil
|
|
|
3f6cae |
end
|
|
|
3f6cae |
- stdout.each { |line|
|
|
|
3f6cae |
- if line.split(' ')[0] == service
|
|
|
3f6cae |
+
|
|
|
3f6cae |
+ @list_unit_files_output.each { |line|
|
|
|
3f6cae |
+ if self.contains_line_service?(line, service)
|
|
|
3f6cae |
return true
|
|
|
3f6cae |
end
|
|
|
3f6cae |
}
|
|
|
3f6cae |
return false
|
|
|
3f6cae |
end
|
|
|
3f6cae |
|
|
|
3f6cae |
- # currently we are not using systemd instances (service_name@instance) in pcsd
|
|
|
3f6cae |
- # for proper implementation of is_service_installed see
|
|
|
3f6cae |
- # pcs/lib/external.py:is_service_installed
|
|
|
3f6cae |
- stdout, _, retcode = run_cmd(
|
|
|
3f6cae |
- PCSAuth.getSuperuserAuth(), 'systemctl', 'list-unit-files', '--full'
|
|
|
3f6cae |
- )
|
|
|
3f6cae |
- if retcode != 0
|
|
|
3f6cae |
- return nil
|
|
|
3f6cae |
- end
|
|
|
3f6cae |
- stdout.each { |line|
|
|
|
3f6cae |
- if line.strip().start_with?("#{service}.service")
|
|
|
3f6cae |
- return true
|
|
|
3f6cae |
+ protected
|
|
|
3f6cae |
+ def load_unit_files_list()
|
|
|
3f6cae |
+ stdout, _, retcode = self.run_command()
|
|
|
3f6cae |
+ if retcode != 0
|
|
|
3f6cae |
+ return nil
|
|
|
3f6cae |
end
|
|
|
3f6cae |
- }
|
|
|
3f6cae |
- return false
|
|
|
3f6cae |
+ return stdout
|
|
|
3f6cae |
+ end
|
|
|
3f6cae |
+end
|
|
|
3f6cae |
+
|
|
|
3f6cae |
+class ServiceInstalledCheckerSystemctl < ServiceInstalledChecker
|
|
|
3f6cae |
+ protected
|
|
|
3f6cae |
+ def run_command
|
|
|
3f6cae |
+ # currently we are not using systemd instances (service_name@instance) in pcsd
|
|
|
3f6cae |
+ # for proper implementation of is_service_installed see
|
|
|
3f6cae |
+ # pcs/lib/external.py:is_service_installed
|
|
|
3f6cae |
+ return run_cmd(
|
|
|
3f6cae |
+ PCSAuth.getSuperuserAuth(), 'systemctl', 'list-unit-files', '--full'
|
|
|
3f6cae |
+ )
|
|
|
3f6cae |
+ end
|
|
|
3f6cae |
+
|
|
|
3f6cae |
+ def contains_line_service?(line, service)
|
|
|
3f6cae |
+ return line.strip().start_with?("#{service}.service")
|
|
|
3f6cae |
+ end
|
|
|
3f6cae |
+end
|
|
|
3f6cae |
+
|
|
|
3f6cae |
+class ServiceInstalledCheckerChkconfig < ServiceInstalledChecker
|
|
|
3f6cae |
+ protected
|
|
|
3f6cae |
+ def run_command
|
|
|
3f6cae |
+ return run_cmd(PCSAuth.getSuperuserAuth(), 'chkconfig')
|
|
|
3f6cae |
+ end
|
|
|
3f6cae |
+
|
|
|
3f6cae |
+ def contains_line_service?(line, service)
|
|
|
3f6cae |
+ return line.split(' ')[0] == service
|
|
|
3f6cae |
+ end
|
|
|
3f6cae |
+end
|
|
|
3f6cae |
+
|
|
|
3f6cae |
+def get_service_installed_checker
|
|
|
3f6cae |
+ if ISSYSTEMCTL
|
|
|
3f6cae |
+ return ServiceInstalledCheckerSystemctl.new
|
|
|
3f6cae |
+ else
|
|
|
3f6cae |
+ return ServiceInstalledCheckerChkconfig.new
|
|
|
3f6cae |
+ end
|
|
|
3f6cae |
+end
|
|
|
3f6cae |
+
|
|
|
3f6cae |
+
|
|
|
3f6cae |
+def is_service_installed?(service)
|
|
|
3f6cae |
+ return get_service_installed_checker().is_installed?(service)
|
|
|
3f6cae |
end
|
|
|
3f6cae |
|
|
|
3f6cae |
def enable_service(service)
|
|
|
3f6cae |
@@ -1888,9 +1925,9 @@ def get_alerts(auth_user)
|
|
|
3f6cae |
end
|
|
|
3f6cae |
end
|
|
|
3f6cae |
|
|
|
3f6cae |
-def get_service_info(service_name)
|
|
|
3f6cae |
+def get_service_info(service_name, service_checker)
|
|
|
3f6cae |
return {
|
|
|
3f6cae |
- :installed => is_service_installed?(service_name),
|
|
|
3f6cae |
+ :installed => service_checker.is_installed?(service_name),
|
|
|
3f6cae |
:enabled => is_service_enabled?(service_name),
|
|
|
3f6cae |
:running => is_service_running?(service_name),
|
|
|
3f6cae |
:version => nil,
|
|
|
3f6cae |
diff --git a/pcsd/remote.rb b/pcsd/remote.rb
|
|
|
3f6cae |
index 0154c78c..6f454681 100644
|
|
|
3f6cae |
--- a/pcsd/remote.rb
|
|
|
3f6cae |
+++ b/pcsd/remote.rb
|
|
|
3f6cae |
@@ -2911,8 +2911,10 @@ def check_host(params, request, auth_user)
|
|
|
3f6cae |
File.exist?(Cfgsync::CorosyncConf.file_path) or File.exist?(CIB_PATH)
|
|
|
3f6cae |
)
|
|
|
3f6cae |
}
|
|
|
3f6cae |
+
|
|
|
3f6cae |
+ service_checker = get_service_installed_checker
|
|
|
3f6cae |
service_list.each do |service|
|
|
|
3f6cae |
- output[:services][service] = get_service_info(service.to_s)
|
|
|
3f6cae |
+ output[:services][service] = get_service_info(service.to_s, service_checker)
|
|
|
3f6cae |
end
|
|
|
3f6cae |
service_version_getter.each do |service, version_getter|
|
|
|
3f6cae |
version = version_getter.call()
|
|
|
3f6cae |
--
|
|
|
3f6cae |
2.20.1
|
|
|
3f6cae |
|