mirror of
https://github.com/Theodor-Springmann-Stiftung/kgpz_web.git
synced 2025-10-29 17:15:31 +00:00
BUGFIX: all interrupts & server restart work now
This commit is contained in:
10
kgpz_web.go
10
kgpz_web.go
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|||||||
@@ -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)
|
|
||||||
}()
|
}()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user