summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Keiser <jkeiser@opscode.com>2013-10-11 13:12:02 -0700
committerJohn Keiser <jkeiser@opscode.com>2013-10-11 13:12:26 -0700
commit31a8ec0a5abbd7fe086a451fae4916d7045f72f8 (patch)
tree5de5a48205495637d4c2c7aa07494ee8eb5f9f13
parent9974a71ccc5345e90055a3674aa2f43025cad526 (diff)
downloadchef-zero-31a8ec0a5abbd7fe086a451fae4916d7045f72f8.tar.gz
Fix problems with cookbook update and delete for local storage
-rw-r--r--lib/chef_zero/endpoints/cookbook_version_endpoint.rb20
1 files changed, 14 insertions, 6 deletions
diff --git a/lib/chef_zero/endpoints/cookbook_version_endpoint.rb b/lib/chef_zero/endpoints/cookbook_version_endpoint.rb
index b05216c..3c0fcc6 100644
--- a/lib/chef_zero/endpoints/cookbook_version_endpoint.rb
+++ b/lib/chef_zero/endpoints/cookbook_version_endpoint.rb
@@ -2,6 +2,7 @@ require 'json'
require 'chef_zero/endpoints/rest_object_endpoint'
require 'chef_zero/rest_error_response'
require 'chef_zero/data_normalizer'
+require 'chef_zero/data_store/data_not_found_error'
module ChefZero
module Endpoints
@@ -42,7 +43,7 @@ module ChefZero
if existing_cookbook
missing_checksums = get_checksums(existing_cookbook) - get_checksums(request.body)
if missing_checksums.size > 0
- hoover_unused_checksums(missing_checksums)
+ hoover_unused_checksums(missing_checksums, request)
end
end
@@ -58,10 +59,12 @@ module ChefZero
response = super(request)
cookbook_name = request.rest_path[1]
- delete_data_dir(request, ['cookbooks', cookbook_name]) if list_data(request, ['cookbooks', cookbook_name]).size == 0
+ if exists_data_dir?(request, [ 'cookbooks', cookbook_name ]) && list_data(request, ['cookbooks', cookbook_name]).size == 0
+ delete_data_dir(request, ['cookbooks', cookbook_name])
+ end
# Hoover deleted files, if they exist
- hoover_unused_checksums(get_checksums(deleted_cookbook))
+ hoover_unused_checksums(get_checksums(deleted_cookbook), request)
response
end
@@ -81,16 +84,21 @@ module ChefZero
private
- def hoover_unused_checksums(deleted_checksums)
+ def hoover_unused_checksums(deleted_checksums, request)
data_store.list(['cookbooks']).each do |cookbook_name|
data_store.list(['cookbooks', cookbook_name]).each do |version|
- cookbook = data_store.get(['cookbooks', cookbook_name, version])
+ cookbook = data_store.get(['cookbooks', cookbook_name, version], request)
deleted_checksums = deleted_checksums - get_checksums(cookbook)
end
end
deleted_checksums.each do |checksum|
# There can be a race here if multiple cookbooks are uploading.
- data_store.delete(['file_store', 'checksums', checksum])
+ # This deals with an exception on delete, but things can still get deleted
+ # that shouldn't be.
+ begin
+ data_store.delete(['file_store', 'checksums', checksum])
+ rescue ChefZero::DataStore::DataNotFoundError
+ end
end
end