summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Cammarata <jimi@sngx.net>2017-05-11 14:57:30 -0500
committerJames Cammarata <jimi@sngx.net>2017-05-11 14:57:30 -0500
commitab07efa70fb4838224991eafdb8dcbde958ac583 (patch)
tree8c210bb37f2ef34648ee13f786ee582bd20e6e97
parent10002529745bb809a0b6e3726c457817e8139a6b (diff)
downloadansible-issue_23579_memory.tar.gz
Avoid default serialization of classes in dump_attrsissue_23579_memory
For playbook base objects, when dumping attributes via dump_attrs() an attribute like loop_control is a class. Using the default serialization for these is slow and consumes a lot of memory. Since LoopControl is also based on the Base class, we can use serialize() instead and save a lot of resources. This also adds a from_attrs() complimentary method to nicely turn the dumped attrs back into proper field attributes. Fixes #23579
-rw-r--r--lib/ansible/playbook/base.py22
-rw-r--r--lib/ansible/plugins/strategy/__init__.py3
2 files changed, 21 insertions, 4 deletions
diff --git a/lib/ansible/playbook/base.py b/lib/ansible/playbook/base.py
index bd4bef91b6..eaddab0076 100644
--- a/lib/ansible/playbook/base.py
+++ b/lib/ansible/playbook/base.py
@@ -506,10 +506,28 @@ class Base(with_metaclass(BaseMeta, object)):
Dumps all attributes to a dictionary
'''
attrs = dict()
- for name in self._valid_attrs.keys():
- attrs[name] = getattr(self, name)
+ for (name, attribute) in iteritems(self._valid_attrs):
+ attr = getattr(self, name)
+ if attribute.isa == 'class' and attr is not None and hasattr(attr, 'serialize'):
+ attrs[name] = attr.serialize()
+ else:
+ attrs[name] = attr
return attrs
+ def from_attrs(self, attrs):
+ '''
+ Loads attributes from a dictionary
+ '''
+ for (attr, value) in iteritems(attrs):
+ if attr in self._valid_attrs:
+ attribute = self._valid_attrs[attr]
+ if attribute.isa == 'class' and isinstance(value, dict):
+ obj = attribute.class_type()
+ obj.deserialize(value)
+ setattr(self, attr, obj)
+ else:
+ setattr(self, attr, value)
+
def serialize(self):
'''
Serializes the object derived from the base object into
diff --git a/lib/ansible/plugins/strategy/__init__.py b/lib/ansible/plugins/strategy/__init__.py
index 99d65ff385..459b2f630a 100644
--- a/lib/ansible/plugins/strategy/__init__.py
+++ b/lib/ansible/plugins/strategy/__init__.py
@@ -331,8 +331,7 @@ class StrategyBase:
found_task = iterator.get_original_task(original_host, task_result._task)
original_task = found_task.copy(exclude_parent=True, exclude_tasks=True)
original_task._parent = found_task._parent
- for (attr, val) in iteritems(task_result._task_fields):
- setattr(original_task, attr, val)
+ original_task.from_attrs(task_result._task_fields)
task_result._host = original_host
task_result._task = original_task