Skip to content

Commit

Permalink
Merge pull request #23117 from agrare/non_rails_worker_process_starting
Browse files Browse the repository at this point in the history
Fix MiqServer WorkerManager Process with Non Rails workers
  • Loading branch information
jrafanie authored Aug 16, 2024
2 parents 9343b8b + 217068b commit cffb072
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 24 deletions.
8 changes: 8 additions & 0 deletions app/models/miq_server/worker_management.rb
Original file line number Diff line number Diff line change
Expand Up @@ -90,4 +90,12 @@ def remove_workers(workers)
end
miq_workers.reload
end

private

def sync_starting_rails_workers
end

def sync_stopping_rails_workers
end
end
27 changes: 25 additions & 2 deletions app/models/miq_server/worker_management/process.rb
Original file line number Diff line number Diff line change
@@ -1,14 +1,23 @@
class MiqServer::WorkerManagement::Process < MiqServer::WorkerManagement
def sync_from_system
require "sys/proctable"
self.miq_processes = Sys::ProcTable.ps.select { |proc| proc.ppid == my_server.pid }
self.miq_processes = Sys::ProcTable.ps.select { |proc| proc.ppid == my_server.pid }
self.miq_processes_by_pid = miq_processes.index_by(&:pid)
end

def sync_starting_workers
sync_from_system
sync_starting_rails_workers
sync_starting_non_rails_workers

MiqWorker.find_all_starting.to_a
end

def sync_stopping_workers
sync_from_system
sync_stopping_rails_workers
sync_stopping_non_rails_workers

MiqWorker.find_all_stopping.to_a
end

Expand Down Expand Up @@ -74,5 +83,19 @@ def validate_worker(worker)

private

attr_accessor :miq_processes
attr_accessor :miq_processes, :miq_processes_by_pid

def sync_starting_non_rails_workers
starting = MiqWorker.find_all_starting
starting.where(:pid => miq_processes_by_pid.keys)
.reject(&:rails_worker?)
.each { |w| w.update!(:status => MiqWorker::STATUS_STARTED) }
end

def sync_stopping_non_rails_workers
stopping = MiqWorker.find_all_stopping
stopping.where(:pid => miq_processes_by_pid.keys)
.reject(&:rails_worker?)
.each { |w| w.update!(:status => MiqWorker::STATUS_STOPPED) }
end
end
42 changes: 29 additions & 13 deletions app/models/miq_server/worker_management/systemd.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,18 @@ def sync_from_system

def sync_starting_workers
sync_from_system
MiqWorker.find_all_starting.reject(&:rails_worker?).each do |worker|
systemd_worker = miq_services_by_unit[worker[:system_uid]]
next if systemd_worker.nil?
sync_starting_rails_workers
sync_starting_non_rails_workers

if systemd_worker[:load_state] == "loaded" && systemd_worker[:active_state] == "active" && systemd_worker[:sub_state] == "running"
worker.update!(:status => MiqWorker::STATUS_STARTED)
end
end
MiqWorker.find_all_starting.to_a
end

def sync_stopping_workers
sync_from_system
MiqWorker.find_all_stopping.reject(&:rails_worker?).each do |worker|
# If the worker record is "stopping" and the systemd unit is gone then the
# worker has successfully exited.
next if miq_services_by_unit[worker[:system_uid]].present?
sync_stopping_rails_workers
sync_stopping_non_rails_workers

worker.update!(:status => MiqWorker::STATUS_STOPPED)
end
MiqWorker.find_all_stopping.to_a
end

def cleanup_failed_workers
Expand All @@ -45,6 +38,29 @@ def cleanup_failed_systemd_services

attr_accessor :miq_services, :miq_services_by_unit

def sync_stopping_non_rails_workers
stopping = MiqWorker.find_all_stopping
stopping.reject(&:rails_worker?).each do |worker|
# If the worker record is "stopping" and the systemd unit is gone then the
# worker has successfully exited.
next if miq_services_by_unit[worker[:system_uid]].present?

worker.update!(:status => MiqWorker::STATUS_STOPPED)
end
end

def sync_starting_non_rails_workers
starting = MiqWorker.find_all_starting
starting.reject(&:rails_worker?).each do |worker|
systemd_worker = miq_services_by_unit[worker[:system_uid]]
next if systemd_worker.nil?

if systemd_worker[:load_state] == "loaded" && systemd_worker[:active_state] == "active" && systemd_worker[:sub_state] == "running"
worker.update!(:status => MiqWorker::STATUS_STARTED)
end
end
end

def systemd_manager
@systemd_manager ||= begin
require "dbus/systemd"
Expand Down
18 changes: 9 additions & 9 deletions spec/models/miq_server/worker_management/systemd_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
it "doesn't update the worker record" do
expect(worker).not_to receive(:update!)

server.worker_manager.sync_starting_workers
expect(server.worker_manager.sync_starting_workers).to be_empty
end
end

Expand All @@ -77,7 +77,7 @@
it "doesn't update the worker record" do
expect(worker).not_to receive(:update!)

server.worker_manager.sync_starting_workers
expect(server.worker_manager.sync_starting_workers).to include(worker)
end
end

Expand All @@ -88,7 +88,7 @@
it "doesn't update the worker record" do
expect(worker).not_to receive(:update!)

server.worker_manager.sync_starting_workers
expect(server.worker_manager.sync_starting_workers).to include(worker)
end
end

Expand All @@ -106,7 +106,7 @@
end

it "doesn't update the worker record" do
server.worker_manager.sync_starting_workers
expect(server.worker_manager.sync_starting_workers).to include(worker)

expect(worker.reload.status).to eq(MiqWorker::STATUS_STARTING)
end
Expand All @@ -125,7 +125,7 @@
end

it "sets the worker record to started" do
server.worker_manager.sync_starting_workers
expect(server.worker_manager.sync_starting_workers).to be_empty

expect(worker.reload.status).to eq(MiqWorker::STATUS_STARTED)
end
Expand All @@ -144,7 +144,7 @@
it "doesn't update the worker record" do
expect(worker).not_to receive(:update!)

server.worker_manager.sync_stopping_workers
expect(server.worker_manager.sync_stopping_workers).to be_empty
end
end

Expand All @@ -159,7 +159,7 @@
it "doesn't update the worker record" do
expect(worker).not_to receive(:update!)

server.worker_manager.sync_stopping_workers
expect(server.worker_manager.sync_stopping_workers).to include(worker)
end
end

Expand All @@ -181,13 +181,13 @@
it "doesn't update the worker record" do
expect(worker).not_to receive(:update!)

server.worker_manager.sync_stopping_workers
expect(server.worker_manager.sync_stopping_workers).to include(worker)
end
end

context "with a systemd unit that has exited" do
it "sets the worker record to stopped" do
server.worker_manager.sync_stopping_workers
expect(server.worker_manager.sync_stopping_workers).to be_empty

expect(worker.reload.status).to eq(MiqWorker::STATUS_STOPPED)
end
Expand Down

0 comments on commit cffb072

Please sign in to comment.