From cb614a0e4ccbd1c1ee57a78b1f6f0c08722da76f Mon Sep 17 00:00:00 2001 From: Will Jordan Date: Wed, 7 Oct 2020 14:07:45 -0700 Subject: [PATCH] Test adding connection to Reactor after shutdown Modifies `TestPumaServer#shutdown_requests` to pause `Reactor#add` until after shutdown begins, to ensure requests are handled correctly for this edge case. Adds unit-test coverage for the fix introduced in #2377 and updated in #2279. --- test/test_puma_server.rb | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/test/test_puma_server.rb b/test/test_puma_server.rb index 86d6b28b98..51cf4b55c2 100644 --- a/test/test_puma_server.rb +++ b/test/test_puma_server.rb @@ -972,6 +972,21 @@ def shutdown_requests(s1_complete: true, s1_response: nil, post: false, s2_respo [204, {}, []] } + pool = @server.instance_variable_get(:@thread_pool) + + # Trigger potential race condition by pausing Reactor#add until shutdown begins. + if (reactor = @server.instance_variable_get(:@reactor)) + reactor.instance_variable_set(:@pool, pool) + reactor.extend(Module.new do + def add(client) + if client.env['REQUEST_PATH'] == '/s2' + Thread.pass until @pool.instance_variable_get(:@shutdown) + end + super + end + end) + end + s1 = nil s2 = send_http post ? "POST /s2 HTTP/1.1\r\nHost: test.com\r\nContent-Type: text/plain\r\nContent-Length: 5\r\n\r\nhi!" : @@ -982,7 +997,7 @@ def shutdown_requests(s1_complete: true, s1_response: nil, post: false, s2_respo app_finished.signal if s1_complete end @server.stop - Thread.pass until @server.instance_variable_get(:@thread_pool).instance_variable_get(:@shutdown) + Thread.pass until pool.instance_variable_get(:@shutdown) assert_match(s1_response, s1.gets) if s1_response