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