@@ -43,7 +43,7 @@ def execute(self, msg):
4343 worker_task .id ,
4444 )
4545
46- self ._group_callback (worker_task )
46+ self ._remove_from_group (worker_task )
4747 else :
4848 logger .info (
4949 'Execute task %s (%s) with args: %s and kwargs: %s' ,
@@ -83,20 +83,15 @@ def retry(self, worker_task, delay, execute_inline, count_retries):
8383 def _enqueue_task (self , worker_task , delay , execute_inline , is_retry , count_retries ):
8484 # type: (WorkerTask, int, bool, bool, bool) -> Any
8585 try :
86- if is_retry and count_retries :
87- worker_task .retry += 1
88- if worker_task .retry > worker_task .max_retries :
89- self ._group_callback (worker_task )
90- raise MaxRetriesReachedException (worker_task .retry )
86+ if is_retry :
87+ if count_retries :
88+ worker_task .retry += 1
89+ if worker_task .retry > worker_task .max_retries :
90+ self ._remove_from_group (worker_task )
91+ raise MaxRetriesReachedException (worker_task .retry )
92+ worker_task .retry_scheduled = True
9193
92- if worker_task .group_id :
93- logger .info (
94- 'Add task %s (%s) to group %s' ,
95- worker_task .abs_func_name ,
96- worker_task .id ,
97- worker_task .group_id ,
98- )
99- self .group_client .add (worker_task )
94+ self ._add_to_group (worker_task )
10095
10196 logger .info ('%s task %s (%s): %s, %s (%s%s)' ,
10297 'Retrying' if is_retry else 'Delaying' ,
@@ -106,6 +101,7 @@ def _enqueue_task(self, worker_task, delay, execute_inline, is_retry, count_retr
106101 worker_task .kwargs ,
107102 worker_task .queue ,
108103 ', inline' if execute_inline else '' )
104+
109105 if execute_inline :
110106 if settings .FORCE_SERIALIZATION :
111107 return self ._execute_task (WorkerTask .deserialize (worker_task .serialize ()))
@@ -114,11 +110,13 @@ def _enqueue_task(self, worker_task, delay, execute_inline, is_retry, count_retr
114110 else :
115111 self .queue_client .add_message (worker_task .queue , worker_task .serialize (), delay )
116112 return None
113+ except MaxRetriesReachedException :
114+ raise
117115 except QueueDoesNotExistException as ex :
118- self ._group_callback (worker_task )
116+ self ._remove_from_group (worker_task )
119117 raise InvalidQueueException (ex .queue_name )
120118 except QueueClientException as ex :
121- self ._group_callback (worker_task )
119+ self ._remove_from_group (worker_task )
122120
123121 logger .exception ('Task %s (%s) failed to enqueue to %s: %s' ,
124122 worker_task .abs_func_name ,
@@ -128,28 +126,44 @@ def _enqueue_task(self, worker_task, delay, execute_inline, is_retry, count_retr
128126
129127 raise QueueException ()
130128 except Exception :
131- self ._group_callback (worker_task )
129+ self ._remove_from_group (worker_task )
132130 raise
133131
134132 def _execute_task (self , worker_task ):
135133 # type: (WorkerTask) -> Any
134+ worker_task .retry_scheduled = False
136135 result = worker_task .execute ()
137- self ._group_callback (worker_task )
136+ self ._remove_from_group (worker_task )
138137 return result
139138
140- def _group_callback (self , worker_task ):
139+ def _add_to_group (self , worker_task ):
141140 # type: (WorkerTask) -> None
142- if not worker_task .group_id :
143- return
141+ if worker_task .group_id and not worker_task .retry_scheduled :
142+ logger .info (
143+ 'Add task %s (%s) to group %s' ,
144+ worker_task .abs_func_name ,
145+ worker_task .id ,
146+ worker_task .group_id ,
147+ )
148+
149+ self .group_client .add (worker_task )
150+
151+ def _remove_from_group (self , worker_task ):
152+ # type: (WorkerTask) -> None
153+ if worker_task .group_id and not worker_task .retry_scheduled :
154+ logger .info (
155+ 'Remove task %s (%s) from group %s' ,
156+ worker_task .abs_func_name ,
157+ worker_task .id ,
158+ worker_task .group_id ,
159+ )
144160
145- logger .info (
146- 'Remove task %s (%s) from group %s' ,
147- worker_task .abs_func_name ,
148- worker_task .id ,
149- worker_task .group_id ,
150- )
161+ if self .group_client .remove (worker_task ):
162+ self ._execute_group_callback (worker_task )
151163
152- if self .group_client .remove (worker_task ) and settings .GROUP_CALLBACK_TASK :
164+ def _execute_group_callback (self , worker_task ):
165+ # type: (WorkerTask) -> None
166+ if settings .GROUP_CALLBACK_TASK :
153167 callback = settings .GROUP_CALLBACK_TASK
154168
155169 if isinstance (callback , basestring ):
0 commit comments