class DiskStore::Reaper

Constants

DEFAULT_OPTS

Attributes

path[R]

Public Class Methods

new(path, opts = {}) click to toggle source
# File lib/disk_store/reaper.rb, line 28
def initialize(path, opts = {})
  @path = path
  @options = DEFAULT_OPTS.merge(opts)

  set_eviction_strategy(@options[:eviction_strategy])
end
spawn_for(path, opts = {}) click to toggle source

Spawn exactly 1 reaper for each cache path

# File lib/disk_store/reaper.rb, line 18
def self.spawn_for(path, opts = {})
  return Celluloid::Actor[path] if !Celluloid::Actor[path].nil?
  
  Reaper.supervise_as(path, path, opts)
  Celluloid::Actor[path].async.start!
  Celluloid::Actor[path]
end

Public Instance Methods

set_eviction_strategy(strategy) click to toggle source
# File lib/disk_store/reaper.rb, line 35
def set_eviction_strategy(strategy)
  return if strategy.nil?
  self.class.send :prepend, DiskStore::Reaper.const_get(strategy)
end
start!() click to toggle source
# File lib/disk_store/reaper.rb, line 40
def start!
  loop do
    perform_sweep! if needs_eviction?
    wait_for_next
  end
end

Private Instance Methods

current_cache_size() click to toggle source
# File lib/disk_store/reaper.rb, line 83
def current_cache_size
  files.inject(0) { |sum, file| sum + File.size(file) }
end
directories() click to toggle source
# File lib/disk_store/reaper.rb, line 75
def directories
  Dir[File.join(path, "**", "*")].select { |f| File.directory?(f) }
end
directories_to_evict() click to toggle source
# File lib/disk_store/reaper.rb, line 63
def directories_to_evict
  []
end
empty_directories() click to toggle source
# File lib/disk_store/reaper.rb, line 79
def empty_directories
  directories.select { |d| Dir.entries(d).size == 2 }
end
files() click to toggle source
# File lib/disk_store/reaper.rb, line 71
def files
  Dir[File.join(path, "**", "*")].select { |f| File.file?(f) }
end
files_to_evict() click to toggle source
# File lib/disk_store/reaper.rb, line 59
def files_to_evict
  []
end
maximum_cache_size() click to toggle source
# File lib/disk_store/reaper.rb, line 87
def maximum_cache_size
  @options[:cache_size].to_i
end
needs_eviction?() click to toggle source
# File lib/disk_store/reaper.rb, line 55
def needs_eviction?
  current_cache_size > maximum_cache_size
end
perform_sweep!() click to toggle source
# File lib/disk_store/reaper.rb, line 49
def perform_sweep!
  # Evict and delete selected files
  files_to_evict.each { |file| FileUtils.rm(file[:path]) }
  directories_to_evict.each { |dir| Dir.rmdir(dir) }
end
wait_for_next() click to toggle source
# File lib/disk_store/reaper.rb, line 67
def wait_for_next
  sleep @options[:reaper_interval]
end