From 5c32ee424fa83e61d944c59c8655e1c9f527176b Mon Sep 17 00:00:00 2001 From: Yuri Rudman Date: Wed, 14 Feb 2018 14:49:09 -0500 Subject: [PATCH 1/7] miq_task: added associattion with miq_queue and passeed miq_task_id to be saved as attribute of queued item --- app/models/miq_task.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/models/miq_task.rb b/app/models/miq_task.rb index e23528ff155..5f5eb0e2491 100644 --- a/app/models/miq_task.rb +++ b/app/models/miq_task.rb @@ -21,6 +21,7 @@ class MiqTask < ApplicationRecord has_one :binary_blob, :as => :resource, :dependent => :destroy has_one :miq_report_result has_one :job, :dependent => :destroy + has_one :miq_queue belongs_to :miq_server @@ -271,6 +272,7 @@ def self.generic_action_with_callback(options, queue_options) # Set the callback for this task to set the status based on the results of the actions queue_options[:miq_callback] = {:class_name => task.class.name, :instance_id => task.id, :method_name => :queue_callback, :args => ['Finished']} + queue_options[:miq_task_id] = task.id method_opts = queue_options[:args].first method_opts[:task_id] = task.id if method_opts.kind_of?(Hash) MiqQueue.put(queue_options) From 5c071f22c0b28c50523cc5a7e36df1f3b422958c Mon Sep 17 00:00:00 2001 From: Yuri Rudman Date: Thu, 15 Feb 2018 14:24:02 -0500 Subject: [PATCH 2/7] testing that .generic_action_with_callback store miq_task_id as attribute of queued item --- spec/models/miq_task_spec.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/models/miq_task_spec.rb b/spec/models/miq_task_spec.rb index 49416664a55..73e7644052d 100644 --- a/spec/models/miq_task_spec.rb +++ b/spec/models/miq_task_spec.rb @@ -202,6 +202,7 @@ expect(message.method_name).to eq("my_method") expect(message.args).to eq([1, 2, 3]) expect(message.zone).to eq(zone) + expect(message.miq_task_id).to eq(tid) end end From 88adbec85c3ec6fae0703a4f8fef2062ed15fefa Mon Sep 17 00:00:00 2001 From: Yuri Rudman Date: Wed, 14 Feb 2018 14:59:14 -0500 Subject: [PATCH 3/7] miq_queue: link to miq_task and added miq_task_id to debugging output --- app/models/miq_queue.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/models/miq_queue.rb b/app/models/miq_queue.rb index 33c7d2f53ca..cab02838888 100644 --- a/app/models/miq_queue.rb +++ b/app/models/miq_queue.rb @@ -19,6 +19,7 @@ # class MiqQueue < ApplicationRecord belongs_to :handler, :polymorphic => true + belongs_to :miq_task attr_accessor :last_exception @@ -524,7 +525,7 @@ def unfinished? end def self.format_full_log_msg(msg) - "Message id: [#{msg.id}], #{msg.handler_type} id: [#{msg.handler_id}], Zone: [#{msg.zone}], Role: [#{msg.role}], Server: [#{msg.server_guid}], Ident: [#{msg.queue_name}], Target id: [#{msg.target_id}], Instance id: [#{msg.instance_id}], Task id: [#{msg.task_id}], Command: [#{msg.class_name}.#{msg.method_name}], Timeout: [#{msg.msg_timeout}], Priority: [#{msg.priority}], State: [#{msg.state}], Deliver On: [#{msg.deliver_on}], Data: [#{msg.data.nil? ? "" : "#{msg.data.length} bytes"}], Args: #{MiqPassword.sanitize_string(msg.args.inspect)}" + "Message id: [#{msg.id}], #{msg.handler_type} id: [#{msg.handler_id}], Zone: [#{msg.zone}], Role: [#{msg.role}], Server: [#{msg.server_guid}], MiqTask id: [#{msg.miq_task_id}], Ident: [#{msg.queue_name}], Target id: [#{msg.target_id}], Instance id: [#{msg.instance_id}], Task id: [#{msg.task_id}], Command: [#{msg.class_name}.#{msg.method_name}], Timeout: [#{msg.msg_timeout}], Priority: [#{msg.priority}], State: [#{msg.state}], Deliver On: [#{msg.deliver_on}], Data: [#{msg.data.nil? ? "" : "#{msg.data.length} bytes"}], Args: #{MiqPassword.sanitize_string(msg.args.inspect)}" end def self.format_short_log_msg(msg) From 3338044287e7e7d89fa0098ce16783bdc941456b Mon Sep 17 00:00:00 2001 From: Yuri Rudman Date: Thu, 15 Feb 2018 14:08:49 -0500 Subject: [PATCH 4/7] adjust miq_queue_spec after adding miq_task_id to debugging output --- spec/models/miq_queue_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/models/miq_queue_spec.rb b/spec/models/miq_queue_spec.rb index b6ecc061f2b..26a31392d6c 100644 --- a/spec/models/miq_queue_spec.rb +++ b/spec/models/miq_queue_spec.rb @@ -205,7 +205,7 @@ msg = FactoryGirl.create(:miq_queue) mparms.each { |k, v| msg.send("#{k}=", v) } expect(MiqQueue.format_short_log_msg(msg)).to eq("Message id: [#{msg.id}]") - expect(MiqQueue.format_full_log_msg(msg)).to eq("Message id: [#{msg.id}], #{msg.handler_type} id: [#{msg.handler_id}], Zone: [#{msg.zone}], Role: [#{msg.role}], Server: [#{msg.server_guid}], Ident: [#{msg.queue_name}], Target id: [#{msg.target_id}], Instance id: [#{msg.instance_id}], Task id: [#{msg.task_id}], Command: [#{msg.class_name}.#{msg.method_name}], Timeout: [#{msg.msg_timeout}], Priority: [#{msg.priority}], State: [#{msg.state}], Deliver On: [#{msg.deliver_on}], Data: [#{msg.data.nil? ? "" : "#{msg.data.length} bytes"}], Args: #{msg.args.inspect}") + expect(MiqQueue.format_full_log_msg(msg)).to eq("Message id: [#{msg.id}], #{msg.handler_type} id: [#{msg.handler_id}], Zone: [#{msg.zone}], Role: [#{msg.role}], Server: [#{msg.server_guid}], MiqTask id: [#{msg.miq_task_id}], Ident: [#{msg.queue_name}], Target id: [#{msg.target_id}], Instance id: [#{msg.instance_id}], Task id: [#{msg.task_id}], Command: [#{msg.class_name}.#{msg.method_name}], Timeout: [#{msg.msg_timeout}], Priority: [#{msg.priority}], State: [#{msg.state}], Deliver On: [#{msg.deliver_on}], Data: [#{msg.data.nil? ? "" : "#{msg.data.length} bytes"}], Args: #{msg.args.inspect}") end end @@ -242,7 +242,7 @@ message_parms.each do |mparms| msg = FactoryGirl.create(:miq_queue, mparms) expect(MiqQueue.format_short_log_msg(msg)).to eq("Message id: [#{msg.id}]") - expect(MiqQueue.format_full_log_msg(msg)).to eq("Message id: [#{msg.id}], #{msg.handler_type} id: [#{msg.handler_id}], Zone: [#{msg.zone}], Role: [#{msg.role}], Server: [#{msg.server_guid}], Ident: [#{msg.queue_name}], Target id: [#{msg.target_id}], Instance id: [#{msg.instance_id}], Task id: [#{msg.task_id}], Command: [#{msg.class_name}.#{msg.method_name}], Timeout: [#{msg.msg_timeout}], Priority: [#{msg.priority}], State: [#{msg.state}], Deliver On: [#{msg.deliver_on}], Data: [#{msg.data.nil? ? "" : "#{msg.data.length} bytes"}], Args: #{args_cleaned_password.inspect}") + expect(MiqQueue.format_full_log_msg(msg)).to eq("Message id: [#{msg.id}], #{msg.handler_type} id: [#{msg.handler_id}], Zone: [#{msg.zone}], Role: [#{msg.role}], Server: [#{msg.server_guid}], MiqTask id: [#{msg.miq_task_id}], Ident: [#{msg.queue_name}], Target id: [#{msg.target_id}], Instance id: [#{msg.instance_id}], Task id: [#{msg.task_id}], Command: [#{msg.class_name}.#{msg.method_name}], Timeout: [#{msg.msg_timeout}], Priority: [#{msg.priority}], State: [#{msg.state}], Deliver On: [#{msg.deliver_on}], Data: [#{msg.data.nil? ? "" : "#{msg.data.length} bytes"}], Args: #{args_cleaned_password.inspect}") end end From e4307b70401e12b480ed1d0bce8b59623134958e Mon Sep 17 00:00:00 2001 From: Yuri Rudman Date: Fri, 16 Feb 2018 15:44:25 -0500 Subject: [PATCH 5/7] if there is task linked to queue item than make this task ACTIVE when deliver --- app/models/miq_queue.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/models/miq_queue.rb b/app/models/miq_queue.rb index cab02838888..4b9f4cb16b7 100644 --- a/app/models/miq_queue.rb +++ b/app/models/miq_queue.rb @@ -447,6 +447,7 @@ def deliver(requester = nil) def dispatch_method(obj, args) Timeout.timeout(msg_timeout) do + args = activate_miq_task(args) obj.send(method_name, *args) end end @@ -542,6 +543,13 @@ def self.get_worker(task_id) private + def activate_miq_task(args) + MiqTask.update_status(miq_task_id, MiqTask::STATE_ACTIVE, MiqTask::STATUS_OK, "Task starting") if miq_task + pars = args.first + pars[:miq_task_id] = miq_task_id if pars.kind_of?(Hash) + args + end + # default values for get operations def self.default_get_options(options) options.reverse_merge( From 079d10c20c45eb2e4d4c0fa62428410a091fd8f9 Mon Sep 17 00:00:00 2001 From: Yuri Rudman Date: Mon, 19 Feb 2018 07:55:24 -0500 Subject: [PATCH 6/7] use 'miq_task_id' instead of miq_task when checking if there is task linked to queue item --- app/models/miq_queue.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/models/miq_queue.rb b/app/models/miq_queue.rb index 4b9f4cb16b7..cfac74ac202 100644 --- a/app/models/miq_queue.rb +++ b/app/models/miq_queue.rb @@ -544,9 +544,9 @@ def self.get_worker(task_id) private def activate_miq_task(args) - MiqTask.update_status(miq_task_id, MiqTask::STATE_ACTIVE, MiqTask::STATUS_OK, "Task starting") if miq_task - pars = args.first - pars[:miq_task_id] = miq_task_id if pars.kind_of?(Hash) + MiqTask.update_status(miq_task_id, MiqTask::STATE_ACTIVE, MiqTask::STATUS_OK, "Task starting") if miq_task_id + params = args.first + params[:miq_task_id] = miq_task_id if params.kind_of?(Hash) args end From f7653b0a6c2dd61b535f52132afa8d90d003c935 Mon Sep 17 00:00:00 2001 From: Yuri Rudman Date: Fri, 16 Mar 2018 09:00:49 -0400 Subject: [PATCH 7/7] changed log_file_spec: after linking miq_tasks and miq_queue tables there is extra parameter added to the hash when message delivered - miq_task_id --- spec/models/log_file_spec.rb | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/spec/models/log_file_spec.rb b/spec/models/log_file_spec.rb index 17a78eed5ae..66d61b09b00 100644 --- a/spec/models/log_file_spec.rb +++ b/spec/models/log_file_spec.rb @@ -75,7 +75,10 @@ end it "delivering MiqServer._request_logs message should call _post_my_logs with correct args" do - expected_options = {:timeout => described_class::LOG_REQUEST_TIMEOUT, :taskid => @task.id, :callback => {:instance_id => @task.id, :class_name => 'MiqTask', :method_name => :queue_callback_on_exceptions, :args => ['Finished']}} + expected_options = {:timeout => described_class::LOG_REQUEST_TIMEOUT, + :taskid => @task.id, :miq_task_id => nil, + :callback => {:instance_id => @task.id, :class_name => 'MiqTask', + :method_name => :queue_callback_on_exceptions, :args => ['Finished']}} expect_any_instance_of(MiqServer).to receive(:_post_my_logs).with(expected_options) @message.delivered(*@message.deliver) @@ -88,7 +91,7 @@ end it "MiqServer#post_logs message should have correct args" do - expect(message.args).to eq([{:taskid => @task.id}]) + expect(message.args).to eq([{:taskid => @task.id, :miq_task_id => nil}]) expect(message.priority).to eq(MiqQueue::HIGH_PRIORITY) expect(message.miq_callback).to eq(:instance_id => @task.id, :class_name => 'MiqTask', :method_name => :queue_callback_on_exceptions, :args => ['Finished']) expect(message.msg_timeout).to eq(described_class::LOG_REQUEST_TIMEOUT)