From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) 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.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id D02581FB07 for ; Fri, 1 Oct 2021 03:09:24 +0000 (UTC) From: Eric Wong To: unicorn-public@yhbt.net Subject: [PATCH 5/6] worker_loop: get rid of select() avoidance hack Date: Fri, 1 Oct 2021 03:09:22 +0000 Message-Id: <20211001030923.26705-6-bofh@yhbt.net> In-Reply-To: <20211001030923.26705-1-bofh@yhbt.net> References: <20211001030923.26705-1-bofh@yhbt.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: It doesn't seem to do anything since commit 221340c4ebc15666 (prevent single listener from monopolizing a worker, 2020-04-16). --- lib/unicorn/http_server.rb | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/lib/unicorn/http_server.rb b/lib/unicorn/http_server.rb index 09c5ec2..7f33f98 100644 --- a/lib/unicorn/http_server.rb +++ b/lib/unicorn/http_server.rb @@ -699,6 +699,7 @@ def reopen_worker_logs(worker_nr) logger.info "worker=#{worker_nr} reopening logs..." Unicorn::Util.reopen_logs logger.info "worker=#{worker_nr} done reopening logs" + false rescue => e logger.error(e) rescue nil exit!(77) # EX_NOPERM in sysexits.h @@ -709,19 +710,17 @@ def reopen_worker_logs(worker_nr) # given a INT, QUIT, or TERM signal) def worker_loop(worker) readers = init_worker_process(worker) - nr = 0 # this becomes negative if we need to reopen logs + reopen = false # this only works immediately if the master sent us the signal # (which is the normal case) - trap(:USR1) { nr = -65536 } + trap(:USR1) { reopen = true } ready = readers.dup - nr_listeners = readers.size @after_worker_ready.call(self, worker) begin - nr < 0 and reopen_worker_logs(worker.nr) - nr = 0 + reopen = reopen_worker_logs(worker.nr) if reopen worker.tick = time_now.to_i tmp = ready.dup while sock = tmp.shift @@ -729,26 +728,16 @@ def worker_loop(worker) # but that will return false if client = sock.kgio_tryaccept process_client(client) - nr += 1 worker.tick = time_now.to_i end - break if nr < 0 + break if reopen end - # make the following bet: if we accepted clients this round, - # we're probably reasonably busy, so avoid calling select() - # and do a speculative non-blocking accept() on ready listeners - # before we sleep again in select(). - if nr == nr_listeners - tmp = ready.dup - redo - end - - # timeout used so we can detect parent death: + # timeout so we can .tick and keep parent from SIGKILL-ing us worker.tick = time_now.to_i ret = IO.select(readers, nil, nil, @timeout) and ready = ret[0] rescue => e - redo if nr < 0 && readers[0] + redo if reopen && readers[0] Unicorn.log_error(@logger, "listen loop error", e) if readers[0] end while readers[0] end