app/services/katello/event_daemon.rb in katello-3.14.0.rc2 vs app/services/katello/event_daemon.rb in katello-3.14.0

- old
+ new

@@ -1,7 +1,47 @@ module Katello class EventDaemon + class Monitor + def initialize(service_classes) + @service_classes = service_classes + end + + def start + error = nil + status = nil + loop do + check_services(error, status) + sleep 15 + end + end + + def check_services(error, status) + @service_classes.each do |service_class| + begin + status = service_class.status + rescue => error + Rails.logger.error("Error occurred while pinging #{service_class}") + Rails.logger.error(error.message) + Rails.logger.error(error.backtrace.join('\n')) + ensure + if error || !status&.dig(:running) + begin + service_class.close + service_class.run + rescue => error + Rails.logger.error("Error occurred while starting #{service_class}") + Rails.logger.error(error.message) + Rails.logger.error(error.backtrace.join('\n')) + ensure + error = nil + end + end + end + end + end + end + class << self def initialize FileUtils.touch(lock_file) @cache = ActiveSupport::Cache::MemoryStore.new end @@ -35,10 +75,11 @@ File.open(pid_file, 'w') { |f| f.puts Process.pid } end def stop return unless pid == Process.pid + @monitor_thread.kill services.values.each(&:close) File.unlink(pid_file) if pid_file && File.exist?(pid_file) end def start @@ -47,11 +88,11 @@ lockfile = File.open(lock_file, 'r') begin lockfile.flock(File::LOCK_EX) return if started? # ensure it wasn't started while we waited for the lock - start_services + start_monitor_thread write_pid_file at_exit do stop end @@ -67,11 +108,13 @@ true rescue Errno::ESRCH, TypeError # process no longer exists or we had no PID cached false end - def start_services - services.values.each(&:run) + def start_monitor_thread + @monitor_thread = Thread.new do + Monitor.new(services.values).start + end end def runnable? # avoid accessing the disk on each request @cache.fetch('katello_event_daemon_runnable', expires_in: 1.minute) do