From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.0 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 247A0201A9; Tue, 21 Feb 2017 20:15:26 +0000 (UTC) Date: Tue, 21 Feb 2017 20:15:26 +0000 From: Eric Wong To: Jeremy Evans Cc: unicorn-public@bogomips.org Subject: Re: Patch: Add after_worker_exit configuration option Message-ID: <20170221201526.GA7035@starla> References: <20170221191923.GH93742@jeremyevans.local> <20170221194320.GA26617@whir> <20170221200216.GJ93742@jeremyevans.local> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20170221200216.GJ93742@jeremyevans.local> List-Id: Jeremy Evans wrote: > On 02/21 07:43, Eric Wong wrote: > > Jeremy Evans wrote: > > > This option can be used to implement custom behavior for handling > > > worker exits. For example, let's say you have a specific request > > > that crashes a worker process, which you expect to be due to a > > > improperly programmed C extension. By modifying your worker to > > > save request related data in a temporary file and using this option, > > > you can get a record of what request is crashing the application, > > > which will make debugging easier. > > > > > > This is not a complete patch as it doesn't include tests, but > > > before writing tests I wanted to see if this is something you'd > > > consider including in unicorn. > > > > What advantage does this have over Ruby's builtin at_exit? > > at_exit is not called if the interpreter crashes: > > ruby -e 'at_exit{File.write('a.txt', 'a')}; Process.kill :SEGV, $$' 2>/dev/null > ([ -f a.txt ] && echo at_exit called) || echo at_exit not called Ah, thanks. I didn't read the code carefully, enough. The commit message and documentation should reflect that it's called in the master and not the worker. Anyways, this is probably OK since I can't think of a less intrusive or more generic (across all Rack servers) way of doing it. So I'm inclined to accept some version of this. > --- a/lib/unicorn/http_server.rb > +++ b/lib/unicorn/http_server.rb > @@ -14,7 +14,8 @@ class Unicorn::HttpServer > attr_accessor :app, :timeout, :worker_processes, > :before_fork, :after_fork, :before_exec, > :listener_opts, :preload_app, > - :orig_app, :config, :ready_pipe, :user > + :orig_app, :config, :ready_pipe, :user, > + :after_worker_exit I've been trying to reduce the method entry overhead across the board. Since this is a new field, can it be attr_writer solely for configurator? I don't think there's reader dependency other than below... > @@ -395,8 +396,7 @@ def reap_all_workers > proc_name 'master' > else > worker = @workers.delete(wpid) and worker.close rescue nil > - m = "reaped #{status.inspect} worker=#{worker.nr rescue 'unknown'}" > - status.success? ? logger.info(m) : logger.error(m) > + after_worker_exit.call(self, worker, status) Which can be made to access the ivar directly: @after_worker_exit.call(self, worker, status)