all repos — erl @ 5b2e1e8a6dcdc5b7201d16efb9190ff49ed39564

Execute Reload Loop

fix handling of restart events

Alan Pearce
commit

5b2e1e8a6dcdc5b7201d16efb9190ff49ed39564

parent

d29d0816680a343ee47c40fa9ace8d80862ac412

1 file changed, 20 insertions(+), 8 deletions(-)

changed files
M state/state.gostate/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,