From 18ffca974186192cb60015bcb1a03db2d71d6b0f Mon Sep 17 00:00:00 2001 From: Joe Rafaniello Date: Thu, 9 Mar 2017 15:00:44 -0500 Subject: [PATCH] Move the thread knowledge to where we start the runner --- app/models/embedded_ansible_worker.rb | 14 ++++++- app/models/embedded_ansible_worker/runner.rb | 43 +++++++++----------- 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/app/models/embedded_ansible_worker.rb b/app/models/embedded_ansible_worker.rb index fc267f25429..54fa385a6f0 100644 --- a/app/models/embedded_ansible_worker.rb +++ b/app/models/embedded_ansible_worker.rb @@ -4,8 +4,18 @@ class EmbeddedAnsibleWorker < MiqWorker self.required_roles = ['embedded_ansible'] def start_runner - self.class::Runner.start_worker(worker_options) - # TODO: return supervisord pid + Thread.new do + begin + self.class::Runner.start_worker(worker_options) + # TODO: return supervisord pid + rescue SystemExit + # Because we're running in a thread on the Server + # we need to intercept SystemExit and exit our thread, + # not the main server thread! + log.info("#{log_prefix} SystemExit received, exiting monitoring Thread") + Thread.exit + end + end end def kill diff --git a/app/models/embedded_ansible_worker/runner.rb b/app/models/embedded_ansible_worker/runner.rb index ecbf4cb3014..30447770979 100644 --- a/app/models/embedded_ansible_worker/runner.rb +++ b/app/models/embedded_ansible_worker/runner.rb @@ -2,29 +2,30 @@ class EmbeddedAnsibleWorker::Runner < MiqWorker::Runner self.wait_for_worker_monitor = false def prepare - # Override prepare so we don't get set as started + ObjectSpace.garbage_collect + # Overriding prepare so we can set started when we're ready + do_before_work_loop + started_worker_record self end - # This thread runs forever until a stop request is received, which with send us to do_exit to exit our thread def do_work_loop - Thread.new do - begin - setup_ansible - started_worker_record - - update_embedded_ansible_provider - - _log.info("entering ansible monitor loop") - loop do - do_work - send(poll_method) - end - rescue => err - _log.log_backtrace(err) - do_exit - end + _log.info("entering ansible monitor loop") + loop do + do_work + send(poll_method) end + rescue => err + _log.log_backtrace(err) + do_exit + end + + def do_before_work_loop + setup_ansible + update_embedded_ansible_provider + rescue => err + _log.log_backtrace(err) + do_exit end def setup_ansible @@ -44,16 +45,10 @@ def do_work end end - # Because we're running in a thread on the Server - # we need to intercept SystemExit and exit our thread, - # not the main server thread! def do_exit(*args) # ensure this doesn't fail or that we can still get to the super call EmbeddedAnsible.disable super - rescue SystemExit - _log.info("#{log_prefix} SystemExit received, exiting monitoring Thread") - Thread.exit end def update_embedded_ansible_provider