2010-05-29 94 views
0

我已经继承了一个网站,生产中每隔5分钟就会产生数十个“无块给定”例外。“没有块给出”错误与cache_money

堆栈跟踪的顶部是:

vendor/gems/nkallen-cache-money-0.2.5/lib/cash/accessor.rb:42:in `add' 
    vendor/gems/nkallen-cache-money-0.2.5/lib/cash/accessor.rb:33:in `get' 
    vendor/gems/nkallen-cache-money-0.2.5/lib/cash/accessor.rb:22:in `call' 
    vendor/gems/nkallen-cache-money-0.2.5/lib/cash/accessor.rb:22:in `fetch' 
    vendor/gems/nkallen-cache-money-0.2.5/lib/cash/accessor.rb:31:in `get' 

所以看来,这个问题是在缓存货币插件。

有没有人经历过类似的事情?

我已经剪下并粘贴了下面的相关代码 - 任何人都更熟悉块能够辨别任何明显的问题?

11  def fetch(keys, options = {}, &block) 
12   case keys 
13   when Array 
14   keys = keys.collect { |key| cache_key(key) } 
15   hits = repository.get_multi(keys) 
16   if (missed_keys = keys - hits.keys).any? 
17    missed_values = block.call(missed_keys) 
18    hits.merge!(missed_keys.zip(Array(missed_values)).to_hash) 
19   end 
20   hits 
21   else 
22   repository.get(cache_key(keys), options[:raw]) || (block ? block.call : nil) 
23   end 
24  end 
25 
26  def get(keys, options = {}, &block) 
27   case keys 
28   when Array 
29   fetch(keys, options, &block) 
30   else 
31   fetch(keys, options) do 
32    if block_given? 
33    add(keys, result = yield(keys), options) 
34    result 
35    end 
36   end 
37   end 
38  end 
39 
40  def add(key, value, options = {}) 
41   if repository.add(cache_key(key), value, options[:ttl] || 0, options[:raw]) == "NOT_STORED\r\n" 
42   yield 
43   end 
44  end 

回答

2

线33被调用add,但不通过的块,尽管一个预期线42和没有block_given?检查像有在get方法。在这种情况下,似乎并没有合适的区块可以通过,因为传递给get的区块已经收回到第33行的add呼叫,因此将其单独传递给add可能是不正确的。

将第42行更改为yield if block_given?应该在此情况下解决您的错误,并且不应在别处导致问题。

还值得注意的是,第42行仅在未存储内容的情况下才会调用,因此您可能需要查看原因。

相关问题