我继承了一个网站,该网站在生产过程中每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
答案 0 :(得分:2)
第33行正在调用add
,但没有传递一个块,虽然第42行需要一个,并且block_given?
方法中没有get
检查。在这种情况下似乎没有合适的块传递,因为传递给get
的块已经在第33行的add
调用中得到了,所以再次将它再次传递给{ {1}}可能不正确。
将第42行更改为add
应修复此案例中的错误,并且不应在其他地方造成问题。
值得注意的是,如果没有存储某些内容,则仅调用第42行,因此您可能需要查看为什么会发生这种情况。