77
88from dotflow .core .context import Context
99from dotflow .core .exception import ExecutionWithClassError
10+ from dotflow .core .types .status import TypeStatus
1011
1112
1213def is_execution_with_class_internal_error (error : Exception ) -> bool :
@@ -97,54 +98,62 @@ def __call__(self, *args, **kwargs):
9798 if self .func :
9899 self ._set_params ()
99100
100- task = self ._get_task (kwargs = kwargs )
101+ self . _current_task = self ._get_task (kwargs = kwargs )
101102 contexts = self ._get_context (kwargs = kwargs )
102103
103104 if contexts :
104105 return Context (
105106 storage = self ._run_action (* args , ** contexts ),
106- task_id = task .task_id ,
107- workflow_id = task .workflow_id ,
107+ task_id = self . _current_task .task_id ,
108+ workflow_id = self . _current_task .workflow_id ,
108109 )
109110
110111 return Context (
111112 storage = self ._run_action (* args ),
112- task_id = task .task_id ,
113- workflow_id = task .workflow_id ,
113+ task_id = self . _current_task .task_id ,
114+ workflow_id = self . _current_task .workflow_id ,
114115 )
115116
116117 # No parameters
117118 def action (* _args , ** _kwargs ):
118119 self .func = args [0 ]
119120 self ._set_params ()
120121
121- task = self ._get_task (kwargs = _kwargs )
122+ self . _current_task = self ._get_task (kwargs = _kwargs )
122123 contexts = self ._get_context (kwargs = _kwargs )
123124
124125 if contexts :
125126 return Context (
126127 storage = self ._run_action (* _args , ** contexts ),
127- task_id = task .task_id ,
128- workflow_id = task .workflow_id ,
128+ task_id = self . _current_task .task_id ,
129+ workflow_id = self . _current_task .workflow_id ,
129130 )
130131
131132 return Context (
132133 storage = self ._run_action (* _args ),
133- task_id = task .task_id ,
134- workflow_id = task .workflow_id ,
134+ task_id = self . _current_task .task_id ,
135+ workflow_id = self . _current_task .workflow_id ,
135136 )
136137
137138 return action
138139
139140 def _run_action (self , * args , ** kwargs ):
141+ task = getattr (self , '_current_task' , None )
142+
140143 for attempt in range (1 , self .retry + 1 ):
141144 try :
142145 if self .timeout :
143146 with ThreadPoolExecutor (max_workers = 1 ) as executor :
144147 future = executor .submit (self .func , * args , ** kwargs )
145- return future .result (timeout = self .timeout )
148+ result = future .result (timeout = self .timeout )
149+ else :
150+ result = self .func (* args , ** kwargs )
151+
152+ # Reset status to IN_PROGRESS after successful retry
153+ if task and attempt > 1 :
154+ task .status = TypeStatus .IN_PROGRESS
146155
147- return self . func ( * args , ** kwargs )
156+ return result
148157
149158 except Exception as error :
150159 last_exception = error
@@ -157,6 +166,9 @@ def _run_action(self, *args, **kwargs):
157166 if attempt == self .retry :
158167 raise last_exception from last_exception
159168
169+ if task :
170+ task .status = TypeStatus .RETRY
171+
160172 sleep (self .retry_delay )
161173 if self .backoff :
162174 self .retry_delay *= 2
0 commit comments