Blame SOURCES/fix-web-UI-dashboard-data-loading-timeout.patch

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