From ff1e665729d7bf6e3f3d17b0f5eb614b78bef341 Mon Sep 17 00:00:00 2001 From: normal Date: Sat, 4 Aug 2018 23:33:38 +0000 Subject: test/ruby/test_io.rb (test_select_leak): speedup and reduce memory use We can reuse the sub-thread and exception with Thread#raise to reproduce the old memory leak with less overhead. This allows us to to run more iterations and improve reliability of the actual test, particularly on platforms without USE_THREAD_CACHE. For glibc and jemalloc, also limit arena count to avoid inadvertant growth. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64187 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- test/ruby/test_io.rb | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) (limited to 'test') diff --git a/test/ruby/test_io.rb b/test/ruby/test_io.rb index d6bdc7f811..d71efeb8a2 100644 --- a/test/ruby/test_io.rb +++ b/test/ruby/test_io.rb @@ -3804,18 +3804,33 @@ __END__ def test_select_leak skip 'MJIT uses too much memory' if RubyVM::MJIT.enabled? - assert_no_memory_leak([], <<-"end;", <<-"end;", rss: true, timeout: 60) + # avoid malloc arena explosion from glibc and jemalloc: + env = { + 'MALLOC_ARENA_MAX' => '1', + 'MALLOC_ARENA_TEST' => '1', + 'MALLOC_CONF' => 'narenas:1', + } + assert_no_memory_leak([env], <<-"end;", <<-"end;", rss: true, timeout: 60) r, w = IO.pipe rset = [r] wset = [w] + exc = StandardError.new(-"select used to leak on exception") + exc.set_backtrace([]) Thread.new { IO.select(rset, wset, nil, 0) }.join end; - 20_000.times do - th = Thread.new { IO.select(rset, wset) } + th = Thread.new do + begin + IO.select(rset, wset) + rescue => e + retry + end while true + end + 50_000.times do Thread.pass until th.stop? - th.kill - th.join + th.raise(exc) end + th.kill + th.join end; end end -- cgit v1.2.3