summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLamont Granquist <lamont@scriptkiddie.org>2014-11-13 17:10:06 -0800
committerLamont Granquist <lamont@scriptkiddie.org>2014-11-13 17:10:06 -0800
commit5e6c78598bc08a5d934dc4356cedabe3200652a6 (patch)
tree440186c34cd680a0d80e31d04150e04da396d871
parent32bf6ef6d329aae0e4c8ea841e26124316186ef7 (diff)
downloadchef-lcg/lazy-deep-merge.tar.gz
quicksave: partial deep merge cache partially donelcg/lazy-deep-merge
-rw-r--r--lib/chef/node.rb20
-rw-r--r--lib/chef/node/attribute.rb45
2 files changed, 45 insertions, 20 deletions
diff --git a/lib/chef/node.rb b/lib/chef/node.rb
index dbb7852586..0e73bfeea4 100644
--- a/lib/chef/node.rb
+++ b/lib/chef/node.rb
@@ -169,34 +169,26 @@ class Chef
attributes.override
end
- def override_attrs
- attributes.override
+ alias_method :override_attrs, :override
+ alias_method :default_attrs, :default
+ alias_method :normal_attrs, :normal
+
+ def automatic_attrs
+ attributes.automatic
end
def override_attrs=(new_values)
attributes.override = new_values
end
- def default_attrs
- attributes.default
- end
-
def default_attrs=(new_values)
attributes.default = new_values
end
- def normal_attrs
- attributes.normal
- end
-
def normal_attrs=(new_values)
attributes.normal = new_values
end
- def automatic_attrs
- attributes.automatic
- end
-
def automatic_attrs=(new_values)
attributes.automatic = new_values
end
diff --git a/lib/chef/node/attribute.rb b/lib/chef/node/attribute.rb
index 1d564a57e4..b2532e4504 100644
--- a/lib/chef/node/attribute.rb
+++ b/lib/chef/node/attribute.rb
@@ -175,6 +175,9 @@ class Chef
# return the automatic level attribute component
attr_reader :automatic
+ # cache of deep merged values by top-level key
+ attr_reader :deep_merge_cache
+
def initialize(normal, default, override, automatic)
@set_unless_present = false
@@ -192,9 +195,7 @@ class Chef
@automatic = VividMash.new(self, automatic)
- @merged_attributes = nil
- @combined_override = nil
- @combined_default = nil
+ @deep_merge_cache = {}
end
# Debug what's going on with an attribute. +args+ is a path spec to the
@@ -230,57 +231,71 @@ class Chef
@set_unless_present = setting
end
- def reset_cache
- # FIXME: REMOVED IN CHEF-12
+ def reset_cache(path = nil)
+ if path.nil? || path.empty?
+ @deep_merge_cache = {}
+ else
+ @deep_merge_cache.delete[path.first]
+ end
end
alias :reset :reset_cache
# Set the cookbook level default attribute component to +new_data+.
def default=(new_data)
+ reset
@default = VividMash.new(self, new_data)
end
# Set the role level default attribute component to +new_data+
def role_default=(new_data)
+ reset
@role_default = VividMash.new(self, new_data)
end
# Set the environment level default attribute component to +new_data+
def env_default=(new_data)
+ reset
@env_default = VividMash.new(self, new_data)
end
# Set the force_default (+default!+) level attributes to +new_data+
def force_default=(new_data)
+ reset
@force_default = VividMash.new(self, new_data)
end
# Set the normal level attribute component to +new_data+
def normal=(new_data)
+ reset
@normal = VividMash.new(self, new_data)
end
# Set the cookbook level override attribute component to +new_data+
def override=(new_data)
+ reset
@override = VividMash.new(self, new_data)
end
# Set the role level override attribute component to +new_data+
def role_override=(new_data)
+ reset
@role_override = VividMash.new(self, new_data)
end
# Set the environment level override attribute component to +new_data+
def env_override=(new_data)
+ reset
@env_override = VividMash.new(self, new_data)
end
def force_override=(new_data)
+ reset
@force_override = VividMash.new(self, new_data)
end
def automatic=(new_data)
+ reset
@automatic = VividMash.new(self, new_data)
end
@@ -290,6 +305,7 @@ class Chef
# clears attributes from all precedence levels
def rm(*args)
+ reset(args)
# just easier to compute our retval, rather than collect+merge sub-retvals
ret = args.inject(merged_attributes) do |attr, arg|
if attr.nil? || !attr.respond_to?(:[])
@@ -320,6 +336,7 @@ class Chef
#
# equivalent to: force_default!['foo']['bar'].delete('baz')
def rm_default(*args)
+ reset(args)
remove_from_precedence_level(force_default!(autovivify: false), *args)
end
@@ -327,6 +344,7 @@ class Chef
#
# equivalent to: normal!['foo']['bar'].delete('baz')
def rm_normal(*args)
+ reset(args)
remove_from_precedence_level(normal!(autovivify: false), *args)
end
@@ -334,6 +352,7 @@ class Chef
#
# equivalent to: force_override!['foo']['bar'].delete('baz')
def rm_override(*args)
+ reset(args)
remove_from_precedence_level(force_override!(autovivify: false), *args)
end
@@ -343,26 +362,36 @@ class Chef
# sets default attributes without merging
def default!(opts={})
+ # FIXME: do not flush whole cache
+ reset
MultiMash.new(self, @default, [], opts)
end
# sets normal attributes without merging
def normal!(opts={})
+ # FIXME: do not flush whole cache
+ reset
MultiMash.new(self, @normal, [], opts)
end
# sets override attributes without merging
def override!(opts={})
+ # FIXME: do not flush whole cache
+ reset
MultiMash.new(self, @override, [], opts)
end
# clears from all default precedence levels and then sets force_default
def force_default!(opts={})
+ # FIXME: do not flush whole cache
+ reset
MultiMash.new(self, @force_default, [@default, @env_default, @role_default], opts)
end
# clears from all override precedence levels and then sets force_override
def force_override!(opts={})
+ # FIXME: do not flush whole cache
+ reset
MultiMash.new(self, @force_override, [@override, @env_override, @role_override], opts)
end
@@ -383,7 +412,11 @@ class Chef
end
def [](key)
- merged_attributes(key)
+ if deep_merge_cache.has_key?(key)
+ deep_merge_cache[key]
+ else
+ deep_merge_cache[key] = merged_attributes(key)
+ end
end
def []=(key, value)