diff options
author | Luke Kanies <luke@madstop.com> | 2009-04-16 14:54:40 -0500 |
---|---|---|
committer | James Turnbull <james@lovedthanlost.net> | 2009-04-17 16:15:47 +1000 |
commit | 7398fa171fdd6dcaeb2d8fd1c07a23bbd78891d0 (patch) | |
tree | de0aa525b85c15645119a355b9c21be30d3c2d55 | |
parent | 88ff9c6500e76fdda02e60262dd1571577c0b92b (diff) | |
download | puppet-7398fa171fdd6dcaeb2d8fd1c07a23bbd78891d0.tar.gz puppet-7398fa171fdd6dcaeb2d8fd1c07a23bbd78891d0.tar.xz puppet-7398fa171fdd6dcaeb2d8fd1c07a23bbd78891d0.zip |
Partially fixing #2029 - failed caches doesn't throw an exception
If the main terminus fails you get an exception, but
not if a cache terminus fails.
Signed-off-by: Luke Kanies <luke@madstop.com>
-rw-r--r-- | lib/puppet/indirector/indirection.rb | 24 | ||||
-rwxr-xr-x | spec/unit/indirector/indirection.rb | 15 |
2 files changed, 32 insertions, 7 deletions
diff --git a/lib/puppet/indirector/indirection.rb b/lib/puppet/indirector/indirection.rb index 7ac214cd0..2a54ecc24 100644 --- a/lib/puppet/indirector/indirection.rb +++ b/lib/puppet/indirector/indirection.rb @@ -185,14 +185,12 @@ class Puppet::Indirector::Indirection request = request(:find, key, *args) terminus = prepare(request) - # See if our instance is in the cache and up to date. - if cache? and ! request.ignore_cache? and cached = cache.find(request) - if cached.expired? - Puppet.info "Not using expired %s for %s from cache; expired at %s" % [self.name, request.key, cached.expiration] - else - Puppet.debug "Using cached %s for %s" % [self.name, request.key] - return cached + begin + if result = find_in_cache(request) + return result end + rescue => detail + Puppet.err "Cached %s for %s failed: %s" % [self.name, request.key, detail] end # Otherwise, return the result from the terminus, caching if appropriate. @@ -209,6 +207,18 @@ class Puppet::Indirector::Indirection return nil end + def find_in_cache(request) + # See if our instance is in the cache and up to date. + return nil unless cache? and ! request.ignore_cache? and cached = cache.find(request) + if cached.expired? + Puppet.info "Not using expired %s for %s from cache; expired at %s" % [self.name, request.key, cached.expiration] + return nil + end + + Puppet.debug "Using cached %s for %s" % [self.name, request.key] + return cached + end + # Remove something via the terminus. def destroy(key, *args) request = request(:destroy, key, *args) diff --git a/spec/unit/indirector/indirection.rb b/spec/unit/indirector/indirection.rb index dc4157fd2..a8bc8ba99 100755 --- a/spec/unit/indirector/indirection.rb +++ b/spec/unit/indirector/indirection.rb @@ -295,6 +295,21 @@ describe Puppet::Indirector::Indirection do @indirection.find("/my/key").should equal(@instance) end + it "should not fail if the cache fails" do + @terminus.stubs(:find).returns @instance + + @cache.expects(:find).raises ArgumentError + @cache.stubs(:save) + lambda { @indirection.find("/my/key") }.should_not raise_error + end + + it "should look in the main terminus if the cache fails" do + @terminus.expects(:find).returns @instance + @cache.expects(:find).raises ArgumentError + @cache.stubs(:save) + @indirection.find("/my/key").should equal(@instance) + end + it "should send a debug log if it is using the cached object" do Puppet.expects(:debug) @cache.stubs(:find).returns @instance |