OLD | NEW |
1 // Copyright 2016 The LUCI Authors. All rights reserved. | 1 // Copyright 2016 The LUCI Authors. All rights reserved. |
2 // Use of this source code is governed under the Apache License, Version 2.0 | 2 // Use of this source code is governed under the Apache License, Version 2.0 |
3 // that can be found in the LICENSE file. | 3 // that can be found in the LICENSE file. |
4 | 4 |
5 package dm | 5 package dm |
6 | 6 |
7 import ( | 7 import ( |
8 "fmt" | 8 "fmt" |
9 ) | 9 ) |
10 | 10 |
11 // validAttemptStateEvolution defines all valid {From -> []To} state | 11 // validAttemptStateEvolution defines all valid {From -> []To} state |
12 // transitions. The identity transition (X -> X) is implied, as long as X has an | 12 // transitions. The identity transition (X -> X) is implied, as long as X has an |
13 // entry in this mapping. | 13 // entry in this mapping. |
14 var validAttemptStateEvolution = map[Attempt_State][]Attempt_State{ | 14 var validAttemptStateEvolution = map[Attempt_State][]Attempt_State{ |
15 » Attempt_ADDING_DEPS: {Attempt_BLOCKED, Attempt_NEEDS_EXECUT
ION}, | 15 » Attempt_SCHEDULING: { |
16 » Attempt_BLOCKED: {Attempt_AWAITING_EXECUTION_STATE, Att
empt_NEEDS_EXECUTION}, | 16 » » Attempt_EXECUTING, // scheduled |
17 » Attempt_AWAITING_EXECUTION_STATE: {Attempt_NEEDS_EXECUTION}, | 17 » » Attempt_ABNORMAL_FINISHED, // cancelled/timeout/err/etc. |
18 » Attempt_EXECUTING: {Attempt_ADDING_DEPS, Attempt_FINISHED
}, | 18 » }, |
19 » Attempt_FINISHED: {}, | 19 » Attempt_EXECUTING: { |
20 » Attempt_NEEDS_EXECUTION: {Attempt_EXECUTING}, | 20 » » Attempt_SCHEDULING, // Retry |
| 21 » » Attempt_WAITING, // EnsureGraphData |
| 22 » » Attempt_FINISHED, // FinishAttempt |
| 23 » » Attempt_ABNORMAL_FINISHED, // cancel/timeout/err/etc. |
| 24 » }, |
| 25 » Attempt_WAITING: { |
| 26 » » Attempt_SCHEDULING, // unblocked |
| 27 » » Attempt_ABNORMAL_FINISHED, // cancelled |
| 28 » }, |
| 29 |
| 30 » Attempt_FINISHED: {}, |
| 31 » Attempt_ABNORMAL_FINISHED: {}, |
21 } | 32 } |
22 | 33 |
23 // Evolve attempts to evolve the state of this Attempt. If the state evolution | 34 // Evolve attempts to evolve the state of this Attempt. If the state evolution |
24 // is not allowed (e.g. invalid state transition), this returns an error. | 35 // is not allowed (e.g. invalid state transition), this returns an error. |
25 func (s *Attempt_State) Evolve(newState Attempt_State) error { | 36 func (s *Attempt_State) Evolve(newState Attempt_State) error { |
26 nextStates := validAttemptStateEvolution[*s] | 37 nextStates := validAttemptStateEvolution[*s] |
27 if nextStates == nil { | 38 if nextStates == nil { |
28 return fmt.Errorf("invalid state transition: no transitions defi
ned for %s", *s) | 39 return fmt.Errorf("invalid state transition: no transitions defi
ned for %s", *s) |
29 } | 40 } |
30 | 41 |
(...skipping 17 matching lines...) Expand all Loading... |
48 if err != nil { | 59 if err != nil { |
49 panic(err) | 60 panic(err) |
50 } | 61 } |
51 } | 62 } |
52 | 63 |
53 // Terminal returns true iff there are no valid evolutions from the current | 64 // Terminal returns true iff there are no valid evolutions from the current |
54 // state. | 65 // state. |
55 func (s Attempt_State) Terminal() bool { | 66 func (s Attempt_State) Terminal() bool { |
56 return len(validAttemptStateEvolution[s]) == 0 | 67 return len(validAttemptStateEvolution[s]) == 0 |
57 } | 68 } |
OLD | NEW |