yahns Ruby server user/dev discussion
 help / color / Atom feed
* [PATCH] test/test_client_expire: fix for high RLIMIT_NOFILE
@ 2016-05-15  8:41 Eric Wong
  0 siblings, 0 replies; only message in thread
From: Eric Wong @ 2016-05-15  8:41 UTC (permalink / raw)
  To: yahns-public

The ab(1) command we use for testing is limited to 20000 open
connections under Debian jessie; a perfectly reasonable limit
to avoid port exhaustion.  I never noticed this limit before,
but systemd under Jessie seems to have upped the default
RLIMIT_NOFILE to 65536(!), causing ab to error out.

We don't even need 10K connections for testing,
we just need to hit *some* limit before we start expiring.
So lower the RLIMIT_NOFILE back to 1024 in the forked server
process so we can test more quickly without running out of
ports or memory, since exhausting the 65536 RLIMIT_NOFILE
limit is not going to happen with a single TCP address.
---
 test/test_client_expire.rb | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/test/test_client_expire.rb b/test/test_client_expire.rb
index b2f932b..b6dec1a 100644
--- a/test/test_client_expire.rb
+++ b/test/test_client_expire.rb
@@ -99,6 +99,14 @@ def test_client_expire_desperate
       end
       stderr_path err.path
     end
+
+    # 1024 is common on old systems, but nowadays Jessie seems to be 65536
+    nr = Process.getrlimit(:NOFILE)[0]
+    if nr >= 1024
+      nr = 1024
+      do_rlimit = true
+    end
+
     pid = mkserver(cfg) do
       keep = { $stderr => true, $stdout => true, $stdin => true, @srv => true }
       ObjectSpace.each_object(IO) do |obj|
@@ -108,7 +116,9 @@ def test_client_expire_desperate
         rescue IOError # could be uninitialized
         end
       end
+      Process.setrlimit(:NOFILE, nr) if do_rlimit
     end
+
     f = get_tcp_client(host, port)
     f.write "G"
     s = get_tcp_client(host, port)
@@ -119,10 +129,9 @@ def test_client_expire_desperate
     assert_match(%r{keep-alive}, str)
     sleep 1
 
-    # ignore errors, just beat the crap out of the process
-    nr = Process.getrlimit(:NOFILE)[0] # 1024 is common
     assert_operator nr, :>, 666, "increase RLIM_NOFILE (ulimit -n)"
     nr -= 50
+    # ignore errors, just beat the crap out of the process
     opts = { out: "/dev/null", err: "/dev/null", close_others: true }
     begin
       pids = 2.times.map do

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, back to index

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-05-15  8:41 [PATCH] test/test_client_expire: fix for high RLIMIT_NOFILE Eric Wong

yahns Ruby server user/dev discussion

Archives are clonable:
	git clone --mirror https://yhbt.net/yahns-public
	git clone --mirror http://ou63pmih66umazou.onion/yahns-public

Example config snippet for mirrors

Newsgroups are available over NNTP:
	nntp://news.public-inbox.org/inbox.comp.lang.ruby.yahns
	nntp://ou63pmih66umazou.onion/inbox.comp.lang.ruby.yahns

 note: .onion URLs require Tor: https://www.torproject.org/

AGPL code for this site: git clone https://public-inbox.org/ public-inbox