From: Eric Wong <bofh@yhbt.net>
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 [thread overview]
Message-ID: <20211001030923.26705-6-bofh@yhbt.net> (raw)
In-Reply-To: <20211001030923.26705-1-bofh@yhbt.net>
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
next prev parent reply other threads:[~2021-10-01 3:09 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-01 3:09 [PATCH 0/6] reduce thundering herds on Linux 4.5+ Eric Wong
2021-10-01 3:09 ` [PATCH 1/6] extconf.rb: get rid of unnecessary checks Eric Wong
2021-10-01 3:09 ` [PATCH 2/6] makefile: reduce unnecessary rebuilds Eric Wong
2021-10-01 3:09 ` [PATCH 3/6] HACKING: drop outdated information about pandoc Eric Wong
2021-10-01 3:09 ` [PATCH 4/6] http_server: get rid of Process.ppid check Eric Wong
2021-10-01 3:09 ` Eric Wong [this message]
2021-10-01 3:09 ` [PATCH 6/6] use EPOLLEXCLUSIVE on Linux 4.5+ Eric Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://yhbt.net/unicorn/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20211001030923.26705-6-bofh@yhbt.net \
--to=bofh@yhbt.net \
--cc=unicorn-public@yhbt.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://yhbt.net/unicorn.git/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).