fix handling of restart events
1 file changed, 20 insertions(+), 8 deletions(-)
changed files
M state/state.go → state/state.go
@@ -11,6 +11,7 @@ const ( NotStarted State = iota Running + Stopping Exited )@@ -20,6 +21,8 @@ case NotStarted: return "NotStarted" case Running: return "Running" + case Stopping: + return "Stopping" case Exited: return "Exited" default:@@ -31,7 +34,7 @@ type Event int const ( Start Event = iota - Signal + Shutdown Exit Restart )@@ -40,7 +43,7 @@ func (e Event) String() string { switch e { case Start: return "Start" - case Signal: + case Shutdown: return "Shutdown" case Exit: return "Stopped"@@ -72,23 +75,31 @@ sm.transitions[NotStarted] = map[Event]State{ Start: Running, } sm.transitions[Running] = map[Event]State{ - Signal: Exited, - Exit: Exited, - Restart: Running, + Exit: Exited, + Shutdown: Stopping, + Restart: Stopping, + } + sm.transitions[Stopping] = map[Event]State{ + Shutdown: Exited, + Exit: Exited, } sm.transitions[Exited] = map[Event]State{ Start: Running, Restart: Running, } + var waiting chan struct{} wait := func(cmd command.Command) { err := cmd.Wait() if err != nil { log.Printf("Error waiting for command: %v\n", err) } sm.SendEvent(Exit) + + close(waiting) } start := func() { + waiting = make(chan struct{}, 1) err := cmd.Start() if err != nil { log.Printf("Failed to start command: %v", err)@@ -104,15 +115,16 @@ } } restart := func() { stop() - start() + <-waiting + sm.SendEvent(Restart) } sm.actions[NotStarted] = map[Event]Action{ Start: start, } sm.actions[Running] = map[Event]Action{ - Signal: stop, - Restart: restart, + Shutdown: stop, + Restart: restart, } sm.actions[Exited] = map[Event]Action{ Start: start,