Jump to: navigation, search

Difference between revisions of "TaskFlow/States of Task and Flow"

(Flow state diagram and sources updated)
(Flow States: Updated to current vision)
Line 3: Line 3:
 
[[File:Tf flow state diagram.png|150px|thumb|Flow state diagram]]
 
[[File:Tf flow state diagram.png|150px|thumb|Flow state diagram]]
  
Flow starts its life in '''PENDING''' state. Then, when it is run, it transitions to '''RUNNING''' state. When all tasks are finished successfully, flow transitions to '''SUCCESS''' state. In case of failure, flow is reverted; when it happens, flow first transitions to '''REVERTING''' state, then revert happens, then flow transitions to REVERTED state, and then to '''FAILURE'''.
+
Flow starts its life in '''PENDING''' state. Then, when it is run, it transitions to '''RUNNING''' state. When all tasks are finished successfully, flow transitions to '''SUCCESS''' state. In case of failure, flow is reverted; when it happens, flow first transitions to '''REVERTING''' state, then revert happens, then flow transitions to '''REVERTED''' state, and then to '''FAILURE'''.
  
 
Transition from '''REVERTED''' to '''FAILURE''' state happens immediately. The main purpose of '''REVERTED''' state is notifications.
 
Transition from '''REVERTED''' to '''FAILURE''' state happens immediately. The main purpose of '''REVERTED''' state is notifications.
  
In '''RUNNING''' and '''REVERTING''' state flow can be interrupted. When this happens, flow transitions to '''INTERRUPTED''' state. From that state, flow can run on (transition back to '''RUNNING''') or be reverted (and transition to '''REVERTED''' state).
+
In '''RUNNING''' and '''REVERTING''' state flow can be suspended. When this happens, flow transitions to '''SUSPENDING''' state immediately.
 +
In that state engine waits for running tasks to finish. Then, when no tasks are running and all results receivced so far are saved,
 +
flow leaves '''SUSPENDING''' state. It may go to '''SUCCESS''' if all tasks were in fact run, or '''FAILURE''', if
 +
all tasks were run but some of them failed, but most common case is that flow transitions to '''SUSPENDED'''.
 +
From that state, flow can run on (transition back to '''RUNNING''') or be reverted (and transition to '''REVERTING''' state).
  
There is also special flow state, '''RESUMING''' (not shown on diagram). Any flow is in this state when it is resumed (loaded) from storage. '''RESUMING''' state is never saved to storage and exists only for notifications.
+
When is interrupted 'in a hard way' (e.g. server crashes), it can be loaded from storage in any state. If the state is not
 +
'''PENDING''' (flow was never run) or '''SUCCESS''' or '''FAILURE''' (in which flow is already finished), flow
 +
gets to '''RESUMING''' state for the short time period when it is loaded from database (this transitions is not shown
 +
on diagram). '''RESUMING''' state is never saved to storage and exists only for notifications. When flow is finally loaded
 +
from database, it goes to '''SUSPENDED''' state.
  
 
<br clear=all>
 
<br clear=all>

Revision as of 15:37, 4 October 2013

Flow States

Flow state diagram

Flow starts its life in PENDING state. Then, when it is run, it transitions to RUNNING state. When all tasks are finished successfully, flow transitions to SUCCESS state. In case of failure, flow is reverted; when it happens, flow first transitions to REVERTING state, then revert happens, then flow transitions to REVERTED state, and then to FAILURE.

Transition from REVERTED to FAILURE state happens immediately. The main purpose of REVERTED state is notifications.

In RUNNING and REVERTING state flow can be suspended. When this happens, flow transitions to SUSPENDING state immediately. In that state engine waits for running tasks to finish. Then, when no tasks are running and all results receivced so far are saved, flow leaves SUSPENDING state. It may go to SUCCESS if all tasks were in fact run, or FAILURE, if all tasks were run but some of them failed, but most common case is that flow transitions to SUSPENDED. From that state, flow can run on (transition back to RUNNING) or be reverted (and transition to REVERTING state).

When is interrupted 'in a hard way' (e.g. server crashes), it can be loaded from storage in any state. If the state is not PENDING (flow was never run) or SUCCESS or FAILURE (in which flow is already finished), flow gets to RESUMING state for the short time period when it is loaded from database (this transitions is not shown on diagram). RESUMING state is never saved to storage and exists only for notifications. When flow is finally loaded from database, it goes to SUSPENDED state.


Task States

Task state diagram

When task just added to the flow, it is in PENDING state, which means it can be executed or waits for all of task it depends on to complete. Then, when task is executed, it transitions to RUNNING state, and stays in it until its execute() method returns. When task is finished, it transitions to SUCCESS state if it was finished successfully, or to FAILURE state if not.

When flow is reverted, all tasks in PENDING state are left as is; tasks from all the other states transition to REVERTING state, and their revert() method is called. When that method returns, task transitions to REVERTED state, and then to PENDING.

Transition from RUNNING to REVERTING state happens when task was interrupted while running, and then revert occurs. This may take place e.g. when daemon is killed while running the task.

Transition from REVERTED to PENDING state happens immediately. The main purpose of REVERTED state is notifications.


Vendor-Specific States

Tasks that are running vendor-specific code can have some other states to implement some custom logic/notifications and change task's metadata. However transitions between such vendor-specific states are enclosed in one of common states which are shown in the diagram.

For example task's state transitions can be:

PENDING --> RUNNING --> (any vendor specific states/transitions) --> RUNNING --> SUCCESS

Note: there should likely be a way to make (any vendor specific states/transitions) configurable in that the vendor specific states/transitions may not need to be persisted to permanent storage. Perhaps a task property maybe appropriate?

Appendix A: Diagrams

The diagrams were drawn using PlantUML. You can re-create them offline or online here.

Source for task state diagram:

 [*] --> PENDING
 PENDING --> RUNNING
 RUNNING --> SUCCESS
 RUNNING --> FAILURE
 RUNNING --> REVERTING
 SUCCESS --> REVERTING
 FAILURE --> REVERTING
 REVERTING -up-> REVERTED
 REVERTING -up-> FAILURE
 REVERTED -up-> PENDING

Source for flow state diagram:

 [*] --> PENDING
 PENDING --> RUNNING
 RUNNING --> SUCCESS
 RUNNING -> REVERTING
 RUNNING --> SUSPENDING
 REVERTING --> REVERTED
 REVERTING --> SUSPENDING
 REVERTED --> FAILURE
 SUSPENDING -u-> SUSPENDED
 SUSPENDING --> SUCCESS
 SUSPENDING --> FAILURE
 SUSPENDED --> RUNNING
 SUSPENDED --> REVERTING
 RESUMING --> SUSPENDED
 SUCCESS --> RUNNING
 FAILURE --> RUNNING