[Backgroundrb-devel] Bug report: delete_worker breaks begin...ensure (was Re: Canceling work...)

hemant gethemant at gmail.com
Sun Feb 24 13:37:42 EST 2008


Hi,

On Sun, Feb 24, 2008 at 6:51 AM, Yves-Eric Martin
<yem_backgroundrb-devel at filter.yve.net> wrote:
> Hi all, and welcome back John.
>
>
>  John, you may have missed my second reply to you:
>  http://rubyforge.org/pipermail/backgroundrb-devel/2008-February/001514.html
>
>  Anyway, the bad news is: I just tried it out and it does not seem to
>  work. delete_worker *is* the "kill -9" hemant suggested.
>
>  Hemant, this is breaking some basic Ruby functionality, namely
>  "begin...ensure". So can we please call this a bug? delete_worker should
>  be a "kill", not a "kill -9", or at least not by default. We could add
>  an argument to determine which behavior we want:
>
>  # normal "kill" behavior:
>  MiddleMan.delete_worker(:worker => :background_worker)
>
>  # brutal "kill -9" behavior:
>  MiddleMan.delete_worker(:worker => :background_worker, :kill => true)
>
>
>
>  Here is first some code I used in the console to demonstrate in plain
>  Ruby what should happen:
>
>  ##########################################################
>   def do_work(args=nil)
>     job_exit_status = 'FORCED_EXIT'
>     puts "#{Time.now} -- do_work entered"
>     begin
>       # Large batch job here
>       sleep 30
>     rescue
>       job_exit_status = 'ERRORED_OUT'
>       # Error processing here
>     else
>       job_exit_status = 'FINISHED_NORMALLY'
>     ensure
>       puts "#{Time.now} -- do_work exit status: #{job_exit_status}"
>     end
>   end
>  ##########################################################
>
>
>  If Ctrl-C is pressed before completion, here is what we get:
>
>   >> do_work
>  2008-02-24 10:12:03 -- do_work entered
>  2008-02-24 10:12:04 -- do_work exit status: FORCED_EXIT
>
>
>
>  Now here is the BackgrounDRb code used to show the bug:
>
>  ##########################################################
>  class BackgroundWorker < BackgrounDRb::MetaWorker
>   set_worker_name :background_worker
>   def create(args = nil); end
>   def do_work(args=nil)
>     job_exit_status = 'FORCEABLY_DELETED'
>     logger.info "#{Time.now} -- do_work entered"
>     begin
>       # Large batch job here
>       sleep 30
>     rescue
>       job_exit_status = 'ERRORED_OUT'
>       # Error processing here
>     else
>       job_exit_status = 'FINISHED_NORMALLY'
>     ensure
>       logger.info "#{Time.now} -- do_work exit status: #{job_exit_status}"
>     end
>   end
>  end
>  ##########################################################
>
>  If allowed to finish, we get this in the logs:
>  2008-02-24 09:45:37 -- do_work entered
>  2008-02-24 09:45:47 -- do_work exit status: FINISHED_NORMALLY
>
>  However, if delete_worker is called before completion, we only get:
>  2008-02-24 09:46:03 -- do_work entered

Eric,

Problem is if you look into code of delete_worker then, you will find
that we are sending TERM and KILL signals to the worker and hence its
not possible to use "ensure" there.

Why, we have both "TERM" and "KILL" there is because, signals to kill
a task is not cross platform across unixes.
But if we remove "KILL" and have "TERM" only, your worker will work as
you expected.

Along with Alex patches, I am trying to push this change in git, so
you can try. But, currently gitorious is down, sadly. I am literally
waiting for getting the damn thing up.


More information about the Backgroundrb-devel mailing list