From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS33070 50.56.128.0/17 X-Spam-Status: No, score=0.5 required=5.0 tests=AWL,RDNS_NONE shortcircuit=no autolearn=no version=3.3.2 X-Original-To: archivist@yhbt.net Delivered-To: archivist@dcvr.yhbt.net Received: from rubyforge.org (unknown [50.56.192.79]) by dcvr.yhbt.net (Postfix) with ESMTP id 2A32244C210 for ; Tue, 26 Nov 2013 02:07:49 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by rubyforge.org (Postfix) with ESMTP id CB76226202D; Tue, 26 Nov 2013 02:07:48 +0000 (UTC) X-Original-To: mongrel-unicorn@rubyforge.org Delivered-To: mongrel-unicorn@rubyforge.org Received: from dcvr.yhbt.net (dcvr.yhbt.net [64.71.152.64]) by rubyforge.org (Postfix) with ESMTP id 914C726202D for ; Tue, 26 Nov 2013 02:07:44 +0000 (UTC) Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id B0727202B3; Tue, 26 Nov 2013 02:07:43 +0000 (UTC) Date: Tue, 26 Nov 2013 02:07:43 +0000 From: Eric Wong To: unicorn list Subject: Re: Issues with PID file renaming Message-ID: <20131126020743.GA25952@dcvr.yhbt.net> References: <20131126012036.GA5868@dcvr.yhbt.net> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-BeenThere: mongrel-unicorn@rubyforge.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: mongrel-unicorn-bounces@rubyforge.org Errors-To: mongrel-unicorn-bounces@rubyforge.org Michael Fischer wrote: > On Mon, Nov 25, 2013 at 5:20 PM, Eric Wong wrote: > > >> What I notice is the following: when upgrading with 4.6.2 the file > >> unicorn.pid is copied to unicorn.pid.oldbin and the unicorn.pid file > >> is updated (the (new) master process). After a while the worker pid > >> files are updated and the unicorn.pid.oldbin file disappears, and all > >> is fine. > > > > Ugh. This is what I feared... Slow startup time of most Ruby web apps > > doesn't help. > > Why doesn't the new master write its pid file immediately upon > forking? It shouldn't have to wait for everything else to load, > should it? It used to do this in 4.6, but I wanted to support dropping the PID later in case of config failures. I'll revert that part of the change. > > How about having the old process create a hard link to .oldbin, > > and having the new one override the pid if Process.ppid == pid file? > > The check is still racy, but that's what pid files are :< > > If you decide to implement this, please make it optional. The current > behavior is correct IMO, and it will work much better if the above > issue is addressed. I've decided against that :) Just pushed this out to git://bogomips.org/unicorn as 795c3527337ff4f03ae6db08c5df01141565ed96 ---------------------------- 8< ----------------------------- Subject: [PATCH] always write PID file early for compatibility This reduces the window for a non-existent PID for folks who monitor PIDs (not a great idea anyways). Unfortunately, this change also brings us back to the case where having a PID later (for other process monitors) is beneficial but more unicorn releases exist where we write the PID early. Thanks to Jimmy Soho for reporting this issue. ref: This partially reverts 7d6ac0c17eb29a00a5b74099dbb3d4d015999f27 Folks: please monitor your app with HTTP requests rather than checking processes, a stuck/wedged Ruby VM is still a running one. --- lib/unicorn/http_server.rb | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/lib/unicorn/http_server.rb b/lib/unicorn/http_server.rb index 402f133..f15c8a7 100644 --- a/lib/unicorn/http_server.rb +++ b/lib/unicorn/http_server.rb @@ -136,20 +136,15 @@ class Unicorn::HttpServer trap(:CHLD) { awaken_master } # write pid early for Mongrel compatibility if we're not inheriting sockets - # This was needed for compatibility with some health checker a long time - # ago. This unfortunately has the side effect of clobbering valid PID - # files. - self.pid = config[:pid] unless ENV["UNICORN_FD"] + # This is needed for compatibility some Monit setups at least. + # This unfortunately has the side effect of clobbering valid PID if + # we upgrade and the upgrade breaks during preload_app==true && build_app! + self.pid = config[:pid] self.master_pid = $$ build_app! if preload_app bind_new_listeners! - # Assuming preload_app==false, we drop the pid file after the app is ready - # to process requests. If binding or build_app! fails with - # preload_app==true, we'll never get here and the parent will recover - self.pid = config[:pid] if ENV["UNICORN_FD"] - spawn_missing_workers self end -- EW _______________________________________________ Unicorn mailing list - mongrel-unicorn@rubyforge.org http://rubyforge.org/mailman/listinfo/mongrel-unicorn Do not quote signatures (like this one) or top post when replying