mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
Avoid default serialization of classes in dump_attrs
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
This commit is contained in:
parent
409fe1a3c3
commit
78478e80ea
2 changed files with 21 additions and 4 deletions
|
@ -506,10 +506,28 @@ class Base(with_metaclass(BaseMeta, object)):
|
||||||
Dumps all attributes to a dictionary
|
Dumps all attributes to a dictionary
|
||||||
'''
|
'''
|
||||||
attrs = dict()
|
attrs = dict()
|
||||||
for name in self._valid_attrs.keys():
|
for (name, attribute) in iteritems(self._valid_attrs):
|
||||||
attrs[name] = getattr(self, name)
|
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
|
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):
|
def serialize(self):
|
||||||
'''
|
'''
|
||||||
Serializes the object derived from the base object into
|
Serializes the object derived from the base object into
|
||||||
|
|
|
@ -332,8 +332,7 @@ class StrategyBase:
|
||||||
found_task = iterator.get_original_task(original_host, task_result._task)
|
found_task = iterator.get_original_task(original_host, task_result._task)
|
||||||
original_task = found_task.copy(exclude_parent=True, exclude_tasks=True)
|
original_task = found_task.copy(exclude_parent=True, exclude_tasks=True)
|
||||||
original_task._parent = found_task._parent
|
original_task._parent = found_task._parent
|
||||||
for (attr, val) in iteritems(task_result._task_fields):
|
original_task.from_attrs(task_result._task_fields)
|
||||||
setattr(original_task, attr, val)
|
|
||||||
|
|
||||||
task_result._host = original_host
|
task_result._host = original_host
|
||||||
task_result._task = original_task
|
task_result._task = original_task
|
||||||
|
|
Loading…
Reference in a new issue