2010-05-29 56 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行僅在未存儲內容的情況下才會調用,因此您可能需要查看原因。

相關問題