mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Replace MemoryStore mutex with a monitor to avoid issues with nested calls
This commit is contained in:
parent
cd8e653d5b
commit
a4da8175a2
2 changed files with 48 additions and 12 deletions
|
@ -3,51 +3,63 @@ module ActiveSupport
|
|||
class MemoryStore < Store
|
||||
def initialize
|
||||
@data = {}
|
||||
@mutex = Mutex.new
|
||||
@guard = Monitor.new
|
||||
end
|
||||
|
||||
def fetch(key, options = {})
|
||||
@mutex.synchronize do
|
||||
@guard.synchronize do
|
||||
super
|
||||
end
|
||||
end
|
||||
|
||||
def read(name, options = nil)
|
||||
super
|
||||
@data[name]
|
||||
@guard.synchronize do
|
||||
super
|
||||
@data[name]
|
||||
end
|
||||
end
|
||||
|
||||
def write(name, value, options = nil)
|
||||
super
|
||||
@data[name] = value
|
||||
@guard.synchronize do
|
||||
super
|
||||
@data[name] = value
|
||||
end
|
||||
end
|
||||
|
||||
def delete(name, options = nil)
|
||||
@data.delete(name)
|
||||
@guard.synchronize do
|
||||
@data.delete(name)
|
||||
end
|
||||
end
|
||||
|
||||
def delete_matched(matcher, options = nil)
|
||||
@data.delete_if { |k,v| k =~ matcher }
|
||||
@guard.synchronize do
|
||||
@data.delete_if { |k,v| k =~ matcher }
|
||||
end
|
||||
end
|
||||
|
||||
def exist?(name,options = nil)
|
||||
@data.has_key?(name)
|
||||
@guard.synchronize do
|
||||
@data.has_key?(name)
|
||||
end
|
||||
end
|
||||
|
||||
def increment(key, amount = 1)
|
||||
@mutex.synchronize do
|
||||
@guard.synchronize do
|
||||
super
|
||||
end
|
||||
end
|
||||
|
||||
def decrement(key, amount = 1)
|
||||
@mutex.synchronize do
|
||||
@guard.synchronize do
|
||||
super
|
||||
end
|
||||
end
|
||||
|
||||
def clear
|
||||
@data.clear
|
||||
@guard.synchronize do
|
||||
@data.clear
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -97,3 +97,27 @@ class FileStoreTest < Test::Unit::TestCase
|
|||
File.delete("foo.cache")
|
||||
end
|
||||
end
|
||||
|
||||
class MemoryStoreTest < Test::Unit::TestCase
|
||||
def setup
|
||||
@cache = ActiveSupport::Cache.lookup_store(:memory_store)
|
||||
end
|
||||
|
||||
def test_should_read_and_write
|
||||
@cache.write('foo', 'bar')
|
||||
assert_equal 'bar', @cache.read('foo')
|
||||
end
|
||||
|
||||
def test_fetch_without_cache_miss
|
||||
@cache.write('foo', 'bar')
|
||||
assert_equal 'bar', @cache.fetch('foo') { 'baz' }
|
||||
end
|
||||
|
||||
def test_fetch_with_cache_miss
|
||||
assert_equal 'baz', @cache.fetch('foo') { 'baz' }
|
||||
end
|
||||
|
||||
def test_fetch_with_forced_cache_miss
|
||||
@cache.fetch('foo', :force => true) { 'bar' }
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue