Author: Adam Evyčędo <git@apiote.xyz>
return 503 before initialisation is complete
main.go | 11 +++++++++-- server/route_preinit.go | 31 +++++++++++++++++++++++++++++++ server/router.go | 2 +- traffic/access.go | 8 ++++++--
diff --git a/main.go b/main.go index 9e4f3fe8a2d8d7e3d8d7187d365dad44d2144bd4..d6fc100652a1ce51fa3c4e53da36852a34daae12 100644 --- a/main.go +++ b/main.go @@ -45,12 +45,19 @@ log.Println(err) os.Exit(1) } case "serve": + fmt.Println("The wheels on the bus go round and round") c := make(chan os.Signal, 1) d := make(chan bool) + i := make(chan bool, 1) signal.Notify(c, os.Interrupt, syscall.SIGUSR1) - go traffic.Initialise(c, d, cfg, &t) + go traffic.Initialise(c, d, i, cfg, &t) c <- syscall.SIGUSR1 - srv := server.Route(cfg, &t) + srv := server.RoutePreinit(cfg) + <-i + if err := srv.Shutdown(context.Background()); err != nil { + panic(err) + } + srv = server.Route(cfg, &t) <-d if err := srv.Shutdown(context.Background()); err != nil { panic(err) diff --git a/server/route_preinit.go b/server/route_preinit.go new file mode 100644 index 0000000000000000000000000000000000000000..09bea6a4983bab5b53f90c10a8d9b1e3de1e8117 --- /dev/null +++ b/server/route_preinit.go @@ -0,0 +1,31 @@ +package server + +import ( + "errors" + + "apiote.xyz/p/szczanieckiej/config" + + "log" + "net/http" + "os" +) + +func RoutePreinit(cfg config.Config) *http.Server { + srv := &http.Server{Addr: cfg.ListenAddress} + + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + se := ServerError{ + code: http.StatusServiceUnavailable, + err: errors.New("not yet initialised"), + } + sendError(w, r, se) + }) + + go func() { + if err := srv.ListenAndServe(); err != http.ErrServerClosed { + log.Printf("Preinit ListenAndServe(): %v", err) + os.Exit(1) + } + }() + return srv +} diff --git a/server/router.go b/server/router.go index 9058f7ebf449d35c7fcb6340a88d8f7a170f359b..9e82d4897c7bbf2843ede1262a3dd1847eb19671 100644 --- a/server/router.go +++ b/server/router.go @@ -526,6 +526,7 @@ } func Route(cfg config.Config, traffic *traffic.Traffic) *http.Server { srv := &http.Server{Addr: cfg.ListenAddress} + http.DefaultServeMux = &http.ServeMux{} http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { accept, err := parseAccept(r.Header.Values("Accept")) @@ -612,7 +613,6 @@ } }) go func() { - fmt.Println("The wheels on the bus go round and round") if err := srv.ListenAndServe(); err != http.ErrServerClosed { log.Printf("ListenAndServe(): %v\n", err) os.Exit(1) diff --git a/traffic/access.go b/traffic/access.go index d5b1dc1c05efbb386a42de0ef572a7b88c2c532b..137db9de832ecf2e2f8359dfeb3831003878d804 100644 --- a/traffic/access.go +++ b/traffic/access.go @@ -595,14 +595,15 @@ } traffic.Feeds = feeds } -func Initialise(sigChan chan os.Signal, doneChan chan bool, cfg config.Config, +func Initialise(sigChan chan os.Signal, doneChan chan bool, initedChan chan bool, cfg config.Config, traffic *Traffic) { bare.MaxMapSize(8192) + alreadyInitialised := false for { sig := <-sigChan if sig == os.Interrupt { break - } + } // else it's SIGUSR1, reloading config allVersions := GlobalVersions{} codeIndexes := GlobalCodeIndex{} nameIndexes := GlobalNameIndex{} @@ -682,6 +683,9 @@ traffic.Vehicles = vehicles traffic.PositionIndexes = positionIndexes traffic.FeedInfos = feedInfos log.Println("Initialised") + if !alreadyInitialised { + initedChan <- true + } } doneChan <- true }