Skip to content

Commit

Permalink
Test adding connection to Reactor after shutdown [changelog skip] (#2418
Browse files Browse the repository at this point in the history
)

* 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.

* Fix Queue#close implementation for Ruby 2.2
Allow `ClosedQueueError` to be raised when `Queue#<<` is called.

* Pass `@block` directly instead of `@block.method(:call)`
  • Loading branch information
wjordan committed Oct 8, 2020
1 parent 9ab7a3f commit 761fbaf
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 2 deletions.
1 change: 1 addition & 0 deletions lib/puma/queue_close.rb
Expand Up @@ -18,6 +18,7 @@ def push(object)
raise ClosedQueueError if @closed
super
end
alias << push
end
Queue.prepend QueueClose
end
Expand Down
2 changes: 1 addition & 1 deletion lib/puma/reactor.rb
Expand Up @@ -84,7 +84,7 @@ def select_loop
retry
end
# Wakeup all remaining objects on shutdown.
@timeouts.each(&@block.method(:call))
@timeouts.each(&@block)
@selector.close
end

Expand Down
18 changes: 17 additions & 1 deletion test/test_puma_server.rb
Expand Up @@ -972,6 +972,22 @@ 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 options.fetch(:queue_requests, true)
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!" :
Expand All @@ -982,7 +998,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

Expand Down

0 comments on commit 761fbaf

Please sign in to comment.