summaryrefslogtreecommitdiffstats
path: root/lib/puppet
diff options
context:
space:
mode:
authorLuke Kanies <luke@madstop.com>2009-05-17 17:20:55 -0500
committerJames Turnbull <james@lovedthanlost.net>2009-05-20 18:29:04 +1000
commit415553e9485d7ba3ed867033ac9c3315107d3c92 (patch)
treeedec1c8310b21a6564b7b15a226252f29906a604 /lib/puppet
parentd489a2b9e2806beefd41627adf7e20d23b0924d6 (diff)
downloadpuppet-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.rb5
-rw-r--r--lib/puppet/util/autoload/file_cache.rb97
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