szczanieckiej.git

commit a40a8e378d14827b99092e0dd60bc7a8f9115e02

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
 }