Skip to content

Commit

Permalink
Merge pull request #22655 from agrare/prevent_more_than_one_event_han…
Browse files Browse the repository at this point in the history
…dler_from_running

Prevent more than 1 event_handler from running
  • Loading branch information
kbrock committed Aug 16, 2023
2 parents 9ca5701 + 33c1dc3 commit cd1594a
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 0 deletions.
1 change: 1 addition & 0 deletions app/models/miq_event_handler.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ class MiqEventHandler < MiqQueueWorkerBase
self.required_roles = ["event"]
self.default_queue_name = "ems"
self.miq_messaging_subscribe_mode = "topic"
self.maximum_workers_count = 1

def self.kill_priority
MiqWorkerType::KILL_PRIORITY_EVENT_HANDLERS
Expand Down
22 changes: 22 additions & 0 deletions lib/vmdb/settings/validator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,12 @@ def workers(data)
valid = false
errors += new_errors
end

result, new_errors = validate_worker_count(worker_class, data)
if result == false
valid = false
errors += new_errors
end
end

return valid, errors
Expand Down Expand Up @@ -238,6 +244,22 @@ def validate_worker_request_limit(worker_class, data)
end
return valid, errors
end

def validate_worker_count(worker_class, data)
valid = true
errors = []

worker_settings = worker_class.fetch_worker_settings_from_options_hash(data[:config])

count = worker_settings[:count]
maximum_workers_count = worker_class.maximum_workers_count

if maximum_workers_count.kind_of?(Integer) && count > maximum_workers_count
valid = false
errors << [:count, "#{worker_class.settings_name}: count: #{count} exceeds maximum worker count: #{maximum_workers_count}"]
end
return valid, errors
end
end
end
end
14 changes: 14 additions & 0 deletions spec/lib/vmdb/settings/validator_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -156,5 +156,19 @@
expect(result).to eql(true)
expect(errors.empty?).to eql(true)
end

it "changing count is valid for a scalable worker" do
stub_settings_merge(:workers => {:worker_base => {:queue_worker_base => {:generic_worker => {:count => 4}}}})
result, errors = subject.validate
expect(result).to be_truthy
expect(errors.empty?).to eql(true)
end

it "changing count is invalid for a non-scalable worker" do
stub_settings_merge(:workers => {:worker_base => {:queue_worker_base => {:event_handler => {:count => 2}}}})
result, errors = subject.validate
expect(result).to be_falsey
expect(errors).to include("workers-count" => "event_handler: count: 2 exceeds maximum worker count: 1")
end
end
end

0 comments on commit cd1594a

Please sign in to comment.