From b3b835327165b582ff50c112adf67fee1826bb37 Mon Sep 17 00:00:00 2001 From: Jason Frey Date: Tue, 27 Feb 2024 17:21:40 -0500 Subject: [PATCH] Merge pull request #22915 from agrare/set_system_uid_for_systemd_and_process Set system_uid for systemd workers (cherry picked from commit b646694424f868291adc4338efdcca990e744aeb) --- .../miq_server/worker_management/systemd.rb | 8 ++++---- app/models/miq_worker.rb | 7 ++++++- app/models/miq_worker/systemd_common.rb | 16 ++++++++++++---- spec/models/miq_worker/systemd_common_spec.rb | 7 +------ 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/app/models/miq_server/worker_management/systemd.rb b/app/models/miq_server/worker_management/systemd.rb index 41cd20b6891..a9031bc6216 100644 --- a/app/models/miq_server/worker_management/systemd.rb +++ b/app/models/miq_server/worker_management/systemd.rb @@ -1,7 +1,7 @@ class MiqServer::WorkerManagement::Systemd < MiqServer::WorkerManagement def sync_from_system - self.miq_services = systemd_services.select { |unit| manageiq_service?(unit) } - self.miq_services_by_guid = miq_services.index_by { |w| w[:name].match(/^.+@(?.+)\.service$/).named_captures["guid"] } + self.miq_services = systemd_services.select { |unit| manageiq_service?(unit) } + self.miq_services_by_unit = miq_services.index_by { |w| w[:name] } end def sync_starting_workers @@ -10,7 +10,7 @@ def sync_starting_workers starting.each do |worker| next if worker.class.rails_worker? - systemd_worker = miq_services_by_guid[worker[:guid]] + systemd_worker = miq_services_by_unit[worker[:system_uid]] if systemd_worker[:load_state] == "loaded" && systemd_worker[:active_state] == "active" && systemd_worker[:sub_state] == "running" worker.update!(:status => "started") starting.delete(worker) @@ -36,7 +36,7 @@ def cleanup_failed_systemd_services private - attr_accessor :miq_services, :miq_services_by_guid + attr_accessor :miq_services, :miq_services_by_unit def systemd_manager @systemd_manager ||= begin diff --git a/app/models/miq_worker.rb b/app/models/miq_worker.rb index e6b1cc79d1a..be328ac4c43 100644 --- a/app/models/miq_worker.rb +++ b/app/models/miq_worker.rb @@ -5,7 +5,8 @@ class MiqWorker < ApplicationRecord include SystemdCommon include UuidMixin - before_destroy :error_out_tasks_with_active_queue_message, :log_destroy_of_worker_messages + after_initialize :set_system_uid + before_destroy :error_out_tasks_with_active_queue_message, :log_destroy_of_worker_messages belongs_to :miq_server has_many :messages, :as => :handler, :class_name => 'MiqQueue' @@ -483,6 +484,10 @@ def clean_active_messages end end + private def set_system_uid + self.system_uid = unit_name if systemd_worker? + end + private def error_out_tasks_with_active_queue_message message = "Task Handler: [#{friendly_name}] ID [#{id}] has been deleted!" processed_messages.includes(:miq_task).where.not(:miq_task_id => nil).each do |m| diff --git a/app/models/miq_worker/systemd_common.rb b/app/models/miq_worker/systemd_common.rb index 9ed26354871..5f518bd03b6 100644 --- a/app/models/miq_worker/systemd_common.rb +++ b/app/models/miq_worker/systemd_common.rb @@ -7,11 +7,23 @@ def service_base_name "manageiq-#{minimal_class_name.underscore.tr("/", "_")}" end + def service_file + "#{service_base_name}@.service" + end + + def target_file + "#{service_base_name}.target" + end + def systemd_unit_dir Pathname.new("/lib/systemd/system") end end + def unit_name + "#{service_base_name}#{unit_instance}.service" + end + def start_systemd_worker enable_systemd_unit write_unit_settings_file @@ -77,10 +89,6 @@ def service_base_name self.class.service_base_name end - def unit_name - "#{service_base_name}#{unit_instance}.service" - end - def unit_instance "@#{guid}" end diff --git a/spec/models/miq_worker/systemd_common_spec.rb b/spec/models/miq_worker/systemd_common_spec.rb index 945afba4483..6b095d22ad4 100644 --- a/spec/models/miq_worker/systemd_common_spec.rb +++ b/spec/models/miq_worker/systemd_common_spec.rb @@ -8,12 +8,7 @@ expected_units -= %w[manageiq-db-ready.service manageiq-messaging-ready.service evmserverd.service manageiq.target] found_units = MiqWorkerType.worker_classes.flat_map do |worker_class| - service_base_name = worker_class.service_base_name - - service_file = "#{service_base_name}@.service" - target_file = "#{service_base_name}.target" - - [service_file, target_file] + [worker_class.service_file, worker_class.target_file] end expect(found_units).to match_array(expected_units)