diff options
author | Luke Kanies <luke@madstop.com> | 2009-05-17 17:20:55 -0500 |
---|---|---|
committer | James Turnbull <james@lovedthanlost.net> | 2009-05-20 18:29:04 +1000 |
commit | 415553e9485d7ba3ed867033ac9c3315107d3c92 (patch) | |
tree | edec1c8310b21a6564b7b15a226252f29906a604 /lib/puppet | |
parent | d489a2b9e2806beefd41627adf7e20d23b0924d6 (diff) | |
download | puppet-415553e9485d7ba3ed867033ac9c3315107d3c92.tar.gz puppet-415553e9485d7ba3ed867033ac9c3315107d3c92.tar.xz puppet-415553e9485d7ba3ed867033ac9c3315107d3c92.zip |
Adding caching of file metadata to the autoloader
The cache isn't actually used yet - this just adds
all of the plumbing.
It was found that stat'ing files that didn't exist
could take up to 85% of a run, so this is progress
toward getting rid of those stats.
Signed-off-by: Luke Kanies <luke@madstop.com>
Diffstat (limited to 'lib/puppet')
-rw-r--r-- | lib/puppet/util/autoload.rb | 5 | ||||
-rw-r--r-- | lib/puppet/util/autoload/file_cache.rb | 97 |
2 files changed, 101 insertions, 1 deletions
diff --git a/lib/puppet/util/autoload.rb b/lib/puppet/util/autoload.rb index 7c176779a..db06ea934 100644 --- a/lib/puppet/util/autoload.rb +++ b/lib/puppet/util/autoload.rb @@ -3,9 +3,12 @@ require 'puppet/util/cacher' # Autoload paths, either based on names or all at once. class Puppet::Util::Autoload + require 'puppet/util/autoload/file_cache' + include Puppet::Util include Puppet::Util::Warnings include Puppet::Util::Cacher + include Puppet::Util::Autoload::FileCache @autoloaders = {} @loaded = [] @@ -74,7 +77,7 @@ class Puppet::Util::Autoload searchpath.each do |dir| file = File.join(dir, path) - next unless FileTest.exist?(file) + next unless file_exist?(file) begin Kernel.load file, @wrap name = symbolize(name) diff --git a/lib/puppet/util/autoload/file_cache.rb b/lib/puppet/util/autoload/file_cache.rb new file mode 100644 index 000000000..6de525a8d --- /dev/null +++ b/lib/puppet/util/autoload/file_cache.rb @@ -0,0 +1,97 @@ +module Puppet::Util::Autoload::FileCache + @found_files = {} + @missing_files = {} + class << self + attr_reader :found_files, :missing_files + end + + # Only used for testing. + def self.clear + @found_files.clear + @missing_files.clear + end + + def found_files + Puppet::Util::Autoload::FileCache.found_files + end + + def missing_files + Puppet::Util::Autoload::FileCache.missing_files + end + + def directory_exist?(path) + cache = cached_data?(path, :directory?) + return cache unless cache.nil? + + begin + stat = File.lstat(path) + if stat.directory? + found_file(path, stat) + return true + else + missing_file(path) + return false + end + rescue Errno::ENOENT + missing_file(path) + return false + end + end + + def file_exist?(path) + cache = cached_data?(path) + return cache unless cache.nil? + + begin + stat = File.lstat(path) + found_file(path, stat) + return true + rescue Errno::ENOENT + missing_file(path) + return false + end + end + + def found_file?(path, type = nil) + if data = found_files[path] and ! data_expired?(data[:time]) + if type and ! data[:stat].send(type) + return false + end + return true + else + return false + end + end + + def found_file(path, stat) + found_files[path] = {:stat => stat, :time => Time.now} + end + + def missing_file?(path) + if time = missing_files[path] and ! data_expired?(time) + return true + else + return false + end + end + + def missing_file(path) + missing_files[path] = Time.now + end + + private + + def cached_data?(path, type = nil) + if found_file?(path, type) + return true + elsif missing_file?(path) + return false + else + return nil + end + end + + def data_expired?(time) + Time.now - time > 15 + end +end |