Skip to content

Commit ad508fe

Browse files
authored
save extended properties only when asked for (#316)
* save extended properties only when asked for * lint * bugfix: args and kwargs swapped * update: conf value to make previous tests happy * add: tests to verify result_extended flag works * move: using attr from extended properties * update: changelog
1 parent e174c99 commit ad508fe

File tree

3 files changed

+98
-41
lines changed

3 files changed

+98
-41
lines changed

Changelog

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,16 @@
44
Change history
55
================
66

7+
.. _version-2.4.0:
8+
9+
2.4.0
10+
=====
11+
:release-date: NA
12+
:release-by: NA
13+
14+
- Fix [#315](https://github.com/celery/django-celery-results/issues/315) Save args, kwargs and other extended props only when result_extended config is set to True
15+
16+
717
.. _version-2.3.1:
818

919
2.3.1

django_celery_results/backends/database.py

Lines changed: 60 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,51 @@ def exception_safe_to_retry(self, exc):
5454
return True
5555
return False
5656

57+
def _get_extended_properties(self, request, traceback):
58+
extended_props = {
59+
'periodic_task_name': None,
60+
'task_args': None,
61+
'task_kwargs': None,
62+
'task_name': None,
63+
'traceback': None,
64+
'worker': None,
65+
}
66+
if request and self.app.conf.find_value_for_key('extended', 'result'):
67+
68+
if getattr(request, 'argsrepr', None) is not None:
69+
# task protocol 2
70+
task_args = request.argsrepr
71+
else:
72+
# task protocol 1
73+
task_args = getattr(request, 'args', None)
74+
75+
if getattr(request, 'kwargsrepr', None) is not None:
76+
# task protocol 2
77+
task_kwargs = request.kwargsrepr
78+
else:
79+
# task protocol 1
80+
task_kwargs = getattr(request, 'kwargs', None)
81+
82+
# Encode input arguments
83+
if task_args is not None:
84+
_, _, task_args = self.encode_content(task_args)
85+
86+
if task_kwargs is not None:
87+
_, _, task_kwargs = self.encode_content(task_kwargs)
88+
89+
properties = getattr(request, 'properties', {}) or {}
90+
periodic_task_name = properties.get('periodic_task_name', None)
91+
extended_props.update({
92+
'periodic_task_name': periodic_task_name,
93+
'task_args': task_args,
94+
'task_kwargs': task_kwargs,
95+
'task_name': getattr(request, 'task', None),
96+
'traceback': traceback,
97+
'worker': getattr(request, 'hostname', None),
98+
})
99+
100+
return extended_props
101+
57102
def _store_result(
58103
self,
59104
task_id,
@@ -69,48 +114,22 @@ def _store_result(
69114
{'children': self.current_task_children(request)}
70115
)
71116

72-
task_name = getattr(request, 'task', None)
73-
properties = getattr(request, 'properties', {}) or {}
74-
periodic_task_name = properties.get('periodic_task_name', None)
75-
worker = getattr(request, 'hostname', None)
76-
77-
# Get input arguments
78-
if getattr(request, 'argsrepr', None) is not None:
79-
# task protocol 2
80-
task_args = request.argsrepr
81-
else:
82-
# task protocol 1
83-
task_args = getattr(request, 'args', None)
84-
85-
if getattr(request, 'kwargsrepr', None) is not None:
86-
# task protocol 2
87-
task_kwargs = request.kwargsrepr
88-
else:
89-
# task protocol 1
90-
task_kwargs = getattr(request, 'kwargs', None)
91-
92-
# Encode input arguments
93-
if task_args is not None:
94-
_, _, task_args = self.encode_content(task_args)
95-
96-
if task_kwargs is not None:
97-
_, _, task_kwargs = self.encode_content(task_kwargs)
98-
99-
self.TaskModel._default_manager.store_result(
100-
content_type,
101-
content_encoding,
102-
task_id,
103-
result,
104-
status,
105-
traceback=traceback,
106-
meta=meta,
107-
periodic_task_name=periodic_task_name,
108-
task_name=task_name,
109-
task_args=task_args,
110-
task_kwargs=task_kwargs,
111-
worker=worker,
112-
using=using,
117+
task_props = {
118+
'content_encoding': content_encoding,
119+
'content_type': content_type,
120+
'meta': meta,
121+
'result': result,
122+
'status': status,
123+
'task_id': task_id,
124+
'traceback': traceback,
125+
'using': using,
126+
}
127+
128+
task_props.update(
129+
self._get_extended_properties(request, traceback)
113130
)
131+
132+
self.TaskModel._default_manager.store_result(**task_props)
114133
return result
115134

116135
def _get_task_meta_for(self, task_id):

t/unit/backends/test_database.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ def setup_backend(self):
3131
self.app.conf.result_serializer = 'json'
3232
self.app.conf.result_backend = (
3333
'django_celery_results.backends:DatabaseBackend')
34+
self.app.conf.result_extended = True
3435
self.b = DatabaseBackend(app=self.app)
3536

3637
def _create_request(self, task_id, name, args, kwargs,
@@ -859,3 +860,30 @@ def test_groupresult_save_restore_nested(self):
859860
restored_group = self.b.restore_group(group_id=group_id)
860861

861862
assert restored_group == group
863+
864+
def test_backend_result_extended_is_false(self):
865+
self.app.conf.result_extended = False
866+
self.b = DatabaseBackend(app=self.app)
867+
tid2 = uuid()
868+
request = self._create_request(
869+
task_id=tid2,
870+
name='my_task',
871+
args=['a', 1, True],
872+
kwargs={'c': 6, 'd': 'e', 'f': False},
873+
)
874+
result = 'foo'
875+
876+
self.b.mark_as_done(tid2, result, request=request)
877+
878+
mindb = self.b.get_task_meta(tid2)
879+
880+
# check meta data
881+
assert mindb.get('result') == 'foo'
882+
assert mindb.get('task_name') is None
883+
assert mindb.get('task_args') is None
884+
assert mindb.get('task_kwargs') is None
885+
886+
# check task_result object
887+
tr = TaskResult.objects.get(task_id=tid2)
888+
assert tr.task_args is None
889+
assert tr.task_kwargs is None

0 commit comments

Comments
 (0)