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?にあるようなチェックはありません。に渡されたブロックは33 行目の呼び出しで既にget渡されているため、この場合に渡す適切なブロックは実際にはないようです。getaddadd

行 42 を に変更yield if block_given?すると、この場合のエラーが修正され、他の場所で問題が発生することはありません。

42 行目は何かが保存されていない場合にのみ呼び出されることにも注意してください。

于 2010-05-29T17:18:26.203 に答える