<div dir="ltr">Hi,<div><br></div><div style>I want to let your know about the Retry. This is a new feature in Taskflow. Retry allows to execute a flow or a part of a flow several times if it fails. Retry is very similar to task and it can be executed or reverted, it accepts and returns values in the similar way as a Task. And it has 'on_failure' method that allow to handle flow failure and make a decision to revert a flow or revert only a failed part and retry it again. Retry has a 'history' parameter, this is a history of all previous results returned by this retry and flow failures raised on each previous try.</div>
<div style><br></div><div style>There is an example of Retry that retries a flow if some error has been raised by the task and reverts a flow if CriticalError has been raised.</div><div style><br></div><div style>class SimpleRetry(Retry):</div>
<div style><br></div><div style>    def on_failure(self, history, *args, **kwargs):</div><div style>        # History is a list of tupes (retry_result, {'task_name': misc.Failure})</div><div style>        # retry_result is the result returned by retry execute method</div>
<div style>        # 'task_name' is the name of failed task in curent subflow</div><div style>        # misc.Failure is an object that wraps raised exception</div><div style>        # This code fetches a dictionary of latest errors</div>
<div style>        last_errors = history[-1][1]</div><div style>        </div><div style>        # Check errors' types</div><div style>        for task_name, failure in last_errors.items():</div><div style>            # Revert a flow if CriticalError has occurred</div>
<div style>            if failure.check(CriticalError):</div><div style>                return REVERT</div><div style>         # Retry a flow if any other error occurred</div><div style>         return RETRY</div><div style>
<br></div><div style>    def execute(self, history, *args, **kwargs):</div><div style>        attempt = len(history)+1<br></div><div style>        print "Retry a flow %s times" % attempt</div><div style>        return attempt</div>
<div style><br></div><div style>    def revert(self, history, *args, **kwargs):</div><div style>        print "Reverting a flow"</div><div style><br></div><div style><br></div><div style>There is an example a flow with Retry:</div>
<div style><br></div><div style>flow = linear_flow.Flow("my_flow", retry = SimpleRetry("my_retry)).add(Task1(), Task2())</div><div style><br></div><div style>In case of Task1 or Task2 failure SimpleRetry.on_failure method will be called. If the retry returns RETRY then Task1 and Task2 will be reverted and SimpleRetry and tasks will be executed again, otherwise the whole flow will be reverted.</div>
<div style><br></div><div style>There are some predefined retries that can be easily used in most common cases. You can find the base Retry class and all predefined retries in the taskflow.retry package.</div><div style><br>
</div><div style>Example of usage of Retry can be found in <a href="http://taskflow.examples.retry_flow.py">taskflow.examples.retry_flow.py</a> file.</div><div style><br></div><div style>Wiki page is here <a href="https://wiki.openstack.org/wiki/TaskFlow/Retry">https://wiki.openstack.org/wiki/TaskFlow/Retry</a></div>
<div style><br></div><div style><br></div><div style>Thanks!</div><div style><br></div><div style>Anastasia</div></div>