diff --git a/lib/odba/cache.rb b/lib/odba/cache.rb index 7116467..07f41bd 100644 --- a/lib/odba/cache.rb +++ b/lib/odba/cache.rb @@ -68,29 +68,31 @@ module ODBA retrieved_objects end def clean # :nodoc: - now = Time.now - start = Time.now if(@debug) - @cleaned = 0 - if(@debug) - puts "starting cleaning cycle" - $stdout.flush - end - retire_horizon = now - @retire_age - @cleaner_offset = _clean(retire_horizon, @fetched, @cleaner_offset) - if(@clean_prefetched) - @prefetched_offset = _clean(retire_horizon, @prefetched, - @prefetched_offset) - end - if(@debug) - puts "cleaned: #{@cleaned} objects in #{Time.now - start} seconds" - puts "remaining objects in @fetched: #{@fetched.size}" - puts "remaining objects in @prefetched: #{@prefetched.size}" - mbytes = File.read("/proc/#{$$}/stat").split(' ').at(22).to_i / (2**20) - GC.start - puts "remaining objects in ObjectSpace: #{ObjectSpace.each_object {}}" - puts "memory-usage: #{mbytes}MB" - $stdout.flush - end + @cache_mutex.synchronize { + now = Time.now + start = Time.now if(@debug) + @cleaned = 0 + if(@debug) + puts "starting cleaning cycle" + $stdout.flush + end + retire_horizon = now - @retire_age + @cleaner_offset = _clean(retire_horizon, @fetched, @cleaner_offset) + if(@clean_prefetched) + @prefetched_offset = _clean(retire_horizon, @prefetched, + @prefetched_offset) + end + if(@debug) + puts "cleaned: #{@cleaned} objects in #{Time.now - start} seconds" + puts "remaining objects in @fetched: #{@fetched.size}" + puts "remaining objects in @prefetched: #{@prefetched.size}" + mbytes = File.read("/proc/#{$$}/stat").split(' ').at(22).to_i / (2**20) + GC.start + puts "remaining objects in ObjectSpace: #{ObjectSpace.each_object {}}" + puts "memory-usage: #{mbytes}MB" + $stdout.flush + end + } end def _clean(retire_time, holder, offset) # :nodoc: if(offset > holder.size) @@ -98,14 +100,12 @@ module ODBA end counter = 0 cutoff = offset + @cleaner_step - @cache_mutex.synchronize { - holder.each_value { |value| - counter += 1 - if(counter > offset && value.odba_old?(retire_time)) - value.odba_retire && @cleaned += 1 - end - return cutoff if(counter > cutoff) - } + holder.each_value { |value| + counter += 1 + if(counter > offset && value.odba_old?(retire_time)) + value.odba_retire && @cleaned += 1 + end + return cutoff if(counter > cutoff) } cutoff # every once in a while we'll get a 'hash modified during iteration'-Error.