BUGFIX: all interrupts & server restart work now

This commit is contained in:
Simon Martens
2024-11-11 17:22:01 +01:00
parent 68f7502985
commit 61a51130dd
2 changed files with 40 additions and 28 deletions

View File

@@ -46,7 +46,6 @@ func Start(k *app.KGPZ, s *server.Server) {
sigs := make(chan os.Signal, 1) sigs := make(chan os.Signal, 1)
done := make(chan bool, 1) done := make(chan bool, 1)
serversignals := s.Events.Subscribe(1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
@@ -54,10 +53,10 @@ func Start(k *app.KGPZ, s *server.Server) {
_ = <-sigs _ = <-sigs
fmt.Println("Received signal. Cleaning up.") fmt.Println("Received signal. Cleaning up.")
// INFO: here we add cleanup functions // INFO: here we add cleanup functions
s.Kill() s.Stop()
s.BreakUntil(serversignals, server.Killed) fmt.Println("Server stopped. Waiting for FS.")
fmt.Println("Server killed.")
k.Shutdown() k.Shutdown()
fmt.Println("FS stopped. Exiting.")
done <- true done <- true
}() }()
@@ -74,7 +73,8 @@ func Start(k *app.KGPZ, s *server.Server) {
fmt.Println("Pulling repo.") fmt.Println("Pulling repo.")
k.Pull() k.Pull()
} else if input == "q" { } else if input == "q" {
done <- true s := os.Signal(syscall.SIGTERM)
sigs <- s
} }
} }
}() }()

View File

@@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"io" "io"
"net/http" "net/http"
"sync"
"githib.com/Theodor-Springmann-Stiftung/kgpz_web/app" "githib.com/Theodor-Springmann-Stiftung/kgpz_web/app"
) )
@@ -30,6 +31,8 @@ const (
// - we reload all clients // - we reload all clients
// - if data validity catastrophically fails, we restart the router to map error pages. // - if data validity catastrophically fails, we restart the router to map error pages.
type Server struct { type Server struct {
running *sync.WaitGroup
shutdown *sync.WaitGroup
} }
func Start(k *app.KGPZ) *Server { func Start(k *app.KGPZ) *Server {
@@ -38,17 +41,38 @@ func Start(k *app.KGPZ) *Server {
func (s *Server) Start() { func (s *Server) Start() {
srv := &http.Server{Addr: ":8081"} srv := &http.Server{Addr: ":8081"}
s.killHandler(srv) s.runner(srv)
s.shutdownHandler(srv)
s.runnerHandler(srv)
s.restartHandler()
} }
func (s *Server) runnerHandler(srv *http.Server) { func (s *Server) Stop() {
if s.running == nil {
return
}
s.running.Done()
s.shutdown.Wait()
}
func (s *Server) Restart() {
if s.running != nil {
s.running.Done()
s.shutdown.Wait()
}
s.Start()
}
func (s *Server) runner(srv *http.Server) {
s.running = &sync.WaitGroup{}
s.shutdown = &sync.WaitGroup{}
s.running.Add(1)
s.shutdown.Add(1)
cleanup := sync.WaitGroup{}
cleanup.Add(1)
shutttingdown := s.Events.Subscribe(1)
go func() { go func() {
s.Events.Publish(Running) defer s.shutdown.Done()
// EXAMPLE: // EXAMPLE:
mux := http.NewServeMux() mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
@@ -62,28 +86,16 @@ func (s *Server) runnerHandler(srv *http.Server) {
return return
} }
loop: cleanup.Wait()
for {
msg := <-shutttingdown
if msg == ShuttingDown {
s.Events.Publish(ShuttedDown)
break loop
}
if msg == Killing {
s.Events.Publish(Killed)
break loop
}
}
}() }()
go func() { go func() {
s.BreakUntil(shutdown, ShutDown) defer cleanup.Done()
fmt.Println("Shutting down server") s.running.Wait()
if err := srv.Shutdown(nil); err != nil { if err := srv.Shutdown(nil); err != nil {
fmt.Println("Error shutting down server") fmt.Println("Error shutting down server")
} }
s.Events.Publish(ShuttingDown)
}() }()
} }