views:

32

answers:

1

i've inherited a site that in production is generating dozens of "no block given" exceptions every 5 minutes.

the top of the stack trace is:

   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'

so it appears that the problem is in the cache money plugin.

has anyone experienced something similar?

i've cut and pasted the relevant code below -- anyone more familiar with blocks able to discern any obvious problems?

 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
+1  A: 

line 33 is calling add, but not passing a block, though one is expected on line 42 and there's no block_given? check like there is in the get method. There doesn't really seem to be an appropriate block to pass in this case, as the block passed to get is already yielded to in the add call on line 33, so passing it again separately to add is probably not correct.

Changing line 42 to yield if block_given? should fix your error in this case and shouldn't cause problems elsewhere.

It's also worth noting that line 42 is only called if something was not stored, so you may want to look into why that's happening.

x1a4