1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Improve documentation and add test

This commit is contained in:
Devin Christensen 2017-04-13 13:56:42 -06:00
parent 3360742396
commit 6116d7bc05
2 changed files with 12 additions and 7 deletions

View file

@ -80,11 +80,8 @@ module ActiveRecord
# * private methods that require being called in a +synchronize+ blocks
# are now explicitly documented
class ConnectionPool
# Threadsafe, fair, LIFO queue. Meant to be used by ConnectionPool
# with which it shares a Monitor. But could be a generic Queue.
#
# The Queue in stdlib's 'thread' could replace this class except
# stdlib's doesn't support waiting with a timeout.
# Threadsafe, fair, FIFO queue. Meant to be used by ConnectionPool
# with which it shares a Monitor.
class Queue
def initialize(lock = Monitor.new)
@lock = lock
@ -111,7 +108,7 @@ module ActiveRecord
# Add +element+ to the queue. Never blocks.
def add(element)
synchronize do
@queue.unshift element
@queue.push element
@cond.signal
end
end
@ -173,7 +170,7 @@ module ActiveRecord
# Removes and returns the head of the queue if possible, or +nil+.
def remove
@queue.shift
@queue.pop
end
# Remove and return the head the queue if the number of

View file

@ -203,6 +203,14 @@ module ActiveRecord
end.join
end
def test_checkout_order_is_fifo
conn1 = @pool.checkout
conn2 = @pool.checkout
@pool.checkin conn1
@pool.checkin conn2
assert_equal [conn2, conn1], 2.times.map { @pool.checkout }
end
# The connection pool is "fair" if threads waiting for
# connections receive them in the order in which they began
# waiting. This ensures that we don't timeout one HTTP request