0

我继承了一个网站,该网站在生产中每 5 分钟产生数十个“无块”异常。

堆栈跟踪的顶部是:

   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
4

1 回答 1

2

第 33 行正在调用add,但没有传递一个块,尽管第 42 行应该有一个块,并且没有block_given?get方法中那样的检查。在这种情况下,似乎并没有合适的块可以传递,因为传递给的块get已经在add第 33 行的调用中让步,因此将其再次单独传递给add可能是不正确的。

在这种情况下,将第 42 行更改为yield if block_given?应该可以解决您的错误,并且不会在其他地方引起问题。

还值得注意的是,仅在未存储某些内容时才调用第 42 行,因此您可能想了解发生这种情况的原因。

于 2010-05-29T17:18:26.203 回答