cmd/syncthing: Introduce exiter to handle termination (#5532)

This commit is contained in:
Simon Frei 2019-02-14 00:07:27 +01:00 committed by Audrius Butkevicius
parent 905c3594b0
commit 7a40c42e8b
2 changed files with 36 additions and 24 deletions

View File

@ -932,7 +932,7 @@ func (s *apiService) getSystemConfigInsync(w http.ResponseWriter, r *http.Reques
func (s *apiService) postSystemRestart(w http.ResponseWriter, r *http.Request) { func (s *apiService) postSystemRestart(w http.ResponseWriter, r *http.Request) {
s.flushResponse(`{"ok": "restarting"}`, w) s.flushResponse(`{"ok": "restarting"}`, w)
go restart() go exit.Restart()
} }
func (s *apiService) postSystemReset(w http.ResponseWriter, r *http.Request) { func (s *apiService) postSystemReset(w http.ResponseWriter, r *http.Request) {
@ -958,12 +958,12 @@ func (s *apiService) postSystemReset(w http.ResponseWriter, r *http.Request) {
s.flushResponse(`{"ok": "resetting folder `+folder+`"}`, w) s.flushResponse(`{"ok": "resetting folder `+folder+`"}`, w)
} }
go restart() go exit.Restart()
} }
func (s *apiService) postSystemShutdown(w http.ResponseWriter, r *http.Request) { func (s *apiService) postSystemShutdown(w http.ResponseWriter, r *http.Request) {
s.flushResponse(`{"ok": "shutting down"}`, w) s.flushResponse(`{"ok": "shutting down"}`, w)
go shutdown() go exit.Shutdown()
} }
func (s *apiService) flushResponse(resp string, w http.ResponseWriter) { func (s *apiService) flushResponse(resp string, w http.ResponseWriter) {
@ -1383,8 +1383,7 @@ func (s *apiService) postSystemUpgrade(w http.ResponseWriter, r *http.Request) {
} }
s.flushResponse(`{"ok": "restarting"}`, w) s.flushResponse(`{"ok": "restarting"}`, w)
l.Infoln("Upgrading") exit.ExitUpgrading()
stop <- exitUpgrading
} }
} }

View File

@ -68,10 +68,7 @@ const (
maxSystemLog = 250 maxSystemLog = 250
) )
var ( var myID protocol.DeviceID
myID protocol.DeviceID
stop = make(chan int)
)
const ( const (
usage = "syncthing [options]" usage = "syncthing [options]"
@ -264,6 +261,32 @@ func parseCommandLineOptions() RuntimeOptions {
return options return options
} }
type exiter struct {
stop chan int
}
func (e *exiter) Restart() {
l.Infoln("Restarting")
e.stop <- exitRestarting
}
func (e *exiter) Shutdown() {
l.Infoln("Shutting down")
e.stop <- exitSuccess
}
func (e *exiter) ExitUpgrading() {
l.Infoln("Shutting down after upgrade")
e.stop <- exitUpgrading
}
// waitForExit must be called synchronously.
func (e *exiter) waitForExit() int {
return <-e.stop
}
var exit = exiter{make(chan int)}
func main() { func main() {
options := parseCommandLineOptions() options := parseCommandLineOptions()
l.SetFlags(options.logFlags) l.SetFlags(options.logFlags)
@ -858,7 +881,7 @@ func syncthingMain(runtimeOptions RuntimeOptions) {
} }
} }
code := <-stop code := exit.waitForExit()
mainService.Stop() mainService.Stop()
@ -879,7 +902,7 @@ func setupSignalHandling() {
signal.Notify(restartSign, sigHup) signal.Notify(restartSign, sigHup)
go func() { go func() {
<-restartSign <-restartSign
stop <- exitRestarting exit.Restart()
}() }()
// Exit with "success" code (no restart) on INT/TERM // Exit with "success" code (no restart) on INT/TERM
@ -889,7 +912,7 @@ func setupSignalHandling() {
signal.Notify(stopSign, os.Interrupt, sigTerm) signal.Notify(stopSign, os.Interrupt, sigTerm)
go func() { go func() {
<-stopSign <-stopSign
stop <- exitSuccess exit.Shutdown()
}() }()
} }
@ -1034,16 +1057,6 @@ func resetDB() error {
return os.RemoveAll(locations.Get(locations.Database)) return os.RemoveAll(locations.Get(locations.Database))
} }
func restart() {
l.Infoln("Restarting")
stop <- exitRestarting
}
func shutdown() {
l.Infoln("Shutting down")
stop <- exitSuccess
}
func ensureDir(dir string, mode fs.FileMode) { func ensureDir(dir string, mode fs.FileMode) {
fs := fs.NewFilesystem(fs.FilesystemTypeBasic, dir) fs := fs.NewFilesystem(fs.FilesystemTypeBasic, dir)
err := fs.MkdirAll(".", mode) err := fs.MkdirAll(".", mode)
@ -1079,7 +1092,7 @@ func standbyMonitor() {
// things a moment to stabilize. // things a moment to stabilize.
time.Sleep(restartDelay) time.Sleep(restartDelay)
restart() exit.Restart()
return return
} }
now = time.Now() now = time.Now()
@ -1137,7 +1150,7 @@ func autoUpgrade(cfg *config.Wrapper) {
events.Default.Unsubscribe(sub) events.Default.Unsubscribe(sub)
l.Warnf("Automatically upgraded to version %q. Restarting in 1 minute.", rel.Tag) l.Warnf("Automatically upgraded to version %q. Restarting in 1 minute.", rel.Tag)
time.Sleep(time.Minute) time.Sleep(time.Minute)
stop <- exitUpgrading exit.ExitUpgrading()
return return
} }
} }