summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel DeLeo <dan@opscode.com>2011-03-21 22:15:03 -0700
committerDaniel DeLeo <dan@opscode.com>2011-03-21 22:50:04 -0700
commitb1b8a97d169f0899009c7056e63c9d7b17d4539e (patch)
treeef6e652af50f2cba5bee42834f823343c966e58e
parent043e4660d185bda371b6d5d85cd2f63b4401a60c (diff)
downloadchef-b1b8a97d169f0899009c7056e63c9d7b17d4539e.tar.gz
[CHEF-1154] auto-clean the checksum dir when a Marshal error occurs
* Workaround marshal errors w/ moneta by deleting 0byte files in the checksum cache dir * Assumes you're using the BasicFile backend to moneta. * even though every file is checked, total time should be negligable, and this approach avoids depending too much on moneta's implementation
-rw-r--r--chef/lib/chef/checksum_cache.rb34
-rw-r--r--chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-600hhz-01
-rw-r--r--chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ahd2gq-01
-rw-r--r--chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-api8ux-01
-rw-r--r--chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-b0r1m1-01
-rw-r--r--chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-bfygsi-01
-rw-r--r--chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-el14l6-01
-rw-r--r--chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ivrl3y-01
-rw-r--r--chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-kkbs85-01
-rw-r--r--chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ory1ux-01
-rw-r--r--chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-pgsq76-01
-rw-r--r--chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ra8uim-01
-rw-r--r--chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t7k1g-01
-rw-r--r--chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t8g0sv-01
-rw-r--r--chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ufy6g3-01
-rw-r--r--chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-x2d6j9-01
-rw-r--r--chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-xi0l6h-01
-rw-r--r--chef/spec/unit/checksum_cache_spec.rb8
18 files changed, 49 insertions, 9 deletions
diff --git a/chef/lib/chef/checksum_cache.rb b/chef/lib/chef/checksum_cache.rb
index b6eb03061e..61a69f589a 100644
--- a/chef/lib/chef/checksum_cache.rb
+++ b/chef/lib/chef/checksum_cache.rb
@@ -8,9 +8,9 @@
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
-#
+#
# http://www.apache.org/licenses/LICENSE-2.0
-#
+#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -27,28 +27,28 @@ require 'chef/mixin/convert_to_class_name'
require 'singleton'
require 'moneta'
-class Chef
+class Chef
class ChecksumCache
include Chef::Mixin::ConvertToClassName
include ::Singleton
-
+
attr_reader :moneta
-
+
def initialize(*args)
self.reset!(*args)
end
-
+
def reset!(backend=nil, options=nil)
backend ||= Chef::Config[:cache_type]
options ||= Chef::Config[:cache_options]
-
+
begin
require "moneta/#{convert_to_snake_case(backend, 'Moneta')}"
rescue LoadError => e
Chef::Log.fatal("Could not load Moneta back end #{backend.inspect}")
raise e
end
-
+
@moneta = Moneta.const_get(backend).new(options)
end
@@ -112,7 +112,7 @@ class Chef
end
def lookup_checksum(key, fstat)
- cached = @moneta.fetch(key)
+ cached = fetch(key)
if cached && file_unchanged?(cached, fstat)
validate_checksum(key)
cached["checksum"]
@@ -146,6 +146,22 @@ class Chef
private
+ def fetch(key)
+ @moneta.fetch(key)
+ rescue ArgumentError => e
+ Log.warn "Error loading cached checksum for key #{key.inspect}"
+ Log.warn(e)
+ repair_checksum_cache
+ nil
+ end
+
+ def repair_checksum_cache
+ Chef::Log.info("Removing invalid checksum cache files")
+ Dir["#{Chef::Config[:cache_options][:path]}/*"].each do |file_path|
+ File.unlink(file_path) unless File.size?(file_path)
+ end
+ end
+
def file_unchanged?(cached, fstat)
cached["mtime"].to_f == fstat.mtime.to_f
end
diff --git a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-600hhz-0 b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-600hhz-0
index e69de29bb2..81836588d5 100644
--- a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-600hhz-0
+++ b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-600hhz-0
@@ -0,0 +1 @@
+checksum data here
diff --git a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ahd2gq-0 b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ahd2gq-0
index e69de29bb2..81836588d5 100644
--- a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ahd2gq-0
+++ b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ahd2gq-0
@@ -0,0 +1 @@
+checksum data here
diff --git a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-api8ux-0 b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-api8ux-0
index e69de29bb2..81836588d5 100644
--- a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-api8ux-0
+++ b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-api8ux-0
@@ -0,0 +1 @@
+checksum data here
diff --git a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-b0r1m1-0 b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-b0r1m1-0
index e69de29bb2..81836588d5 100644
--- a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-b0r1m1-0
+++ b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-b0r1m1-0
@@ -0,0 +1 @@
+checksum data here
diff --git a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-bfygsi-0 b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-bfygsi-0
index e69de29bb2..81836588d5 100644
--- a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-bfygsi-0
+++ b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-bfygsi-0
@@ -0,0 +1 @@
+checksum data here
diff --git a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-el14l6-0 b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-el14l6-0
index e69de29bb2..81836588d5 100644
--- a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-el14l6-0
+++ b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-el14l6-0
@@ -0,0 +1 @@
+checksum data here
diff --git a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ivrl3y-0 b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ivrl3y-0
index e69de29bb2..81836588d5 100644
--- a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ivrl3y-0
+++ b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ivrl3y-0
@@ -0,0 +1 @@
+checksum data here
diff --git a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-kkbs85-0 b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-kkbs85-0
index e69de29bb2..81836588d5 100644
--- a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-kkbs85-0
+++ b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-kkbs85-0
@@ -0,0 +1 @@
+checksum data here
diff --git a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ory1ux-0 b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ory1ux-0
index e69de29bb2..81836588d5 100644
--- a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ory1ux-0
+++ b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ory1ux-0
@@ -0,0 +1 @@
+checksum data here
diff --git a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-pgsq76-0 b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-pgsq76-0
index e69de29bb2..81836588d5 100644
--- a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-pgsq76-0
+++ b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-pgsq76-0
@@ -0,0 +1 @@
+checksum data here
diff --git a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ra8uim-0 b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ra8uim-0
index e69de29bb2..81836588d5 100644
--- a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ra8uim-0
+++ b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ra8uim-0
@@ -0,0 +1 @@
+checksum data here
diff --git a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t7k1g-0 b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t7k1g-0
index e69de29bb2..81836588d5 100644
--- a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t7k1g-0
+++ b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t7k1g-0
@@ -0,0 +1 @@
+checksum data here
diff --git a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t8g0sv-0 b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t8g0sv-0
index e69de29bb2..81836588d5 100644
--- a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t8g0sv-0
+++ b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-t8g0sv-0
@@ -0,0 +1 @@
+checksum data here
diff --git a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ufy6g3-0 b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ufy6g3-0
index e69de29bb2..81836588d5 100644
--- a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ufy6g3-0
+++ b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-ufy6g3-0
@@ -0,0 +1 @@
+checksum data here
diff --git a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-x2d6j9-0 b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-x2d6j9-0
index e69de29bb2..81836588d5 100644
--- a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-x2d6j9-0
+++ b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-x2d6j9-0
@@ -0,0 +1 @@
+checksum data here
diff --git a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-xi0l6h-0 b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-xi0l6h-0
index e69de29bb2..81836588d5 100644
--- a/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-xi0l6h-0
+++ b/chef/spec/data/checksum_cache/chef-file--tmp-chef-rendered-template20100929-10863-xi0l6h-0
@@ -0,0 +1 @@
+checksum data here
diff --git a/chef/spec/unit/checksum_cache_spec.rb b/chef/spec/unit/checksum_cache_spec.rb
index 1896fedfa2..e86b52d195 100644
--- a/chef/spec/unit/checksum_cache_spec.rb
+++ b/chef/spec/unit/checksum_cache_spec.rb
@@ -193,6 +193,14 @@ describe Chef::ChecksumCache do
Chef::ChecksumCache.cleanup_checksum_cache
end
+
+ it "cleans all 0byte checksum files when it encounters a Marshal error" do
+ @cache.moneta.stub!(:fetch).and_raise(ArgumentError)
+ # This cache file is 0 bytes, raises an argument error when
+ # attempting to Marshal.load
+ File.should_receive(:unlink).with(File.join(CHEF_SPEC_DATA, "checksum_cache", "chef-file--tmp-chef-rendered-template20100929-10863-6m8zdk-0"))
+ @cache.lookup_checksum("chef-file--tmp-chef-rendered-template20100929-10863-6m8zdk-0", "foo")
+ end
end
end