@@ -14,6 +14,7 @@ import (
1414 "os/signal"
1515 "sort"
1616 "strings"
17+ "sync"
1718 "syscall"
1819 "time"
1920
@@ -45,6 +46,7 @@ type BootstrapApp struct {
4546 queries * repository.Queries
4647 router * gin.Engine
4748 db * sql.DB
49+ wg sync.WaitGroup
4850}
4951
5052func NewBootstrapApp (config model.Config ) * BootstrapApp {
@@ -227,33 +229,39 @@ func (app *BootstrapApp) Setup() error {
227229
228230 // start db cleanup routine
229231 app .log .App .Debug ().Msg ("Starting database cleanup routine" )
230- go app .dbCleanupRoutine ( )
232+ app .wg . Go ( app . dbCleanupRoutine )
231233
232234 // if analytics are not disabled, start heartbeat
233235 if app .config .Analytics .Enabled {
234236 app .log .App .Debug ().Msg ("Starting heartbeat routine" )
235- go app .heartbeatRoutine ( )
237+ app .wg . Go ( app . heartbeatRoutine )
236238 }
237239
238240 // create err channel to listen for server errors
239241 errChan := make (chan error , 1 )
240242
241243 // serve unix
242- go func () {
243- errChan <- app .serveUnix ()
244- }()
244+ app .wg .Go (func () {
245+ if err := app .serveUnix (); err != nil {
246+ errChan <- err
247+ }
248+ })
245249
246250 // serve to http
247- go func () {
248- errChan <- app .serveHTTP ()
249- }()
251+ app .wg .Go (func () {
252+ if err := app .serveHTTP (); err != nil {
253+ errChan <- err
254+ }
255+ })
250256
251257 // monitor cancellation and server errors
252258 for {
253259 select {
254260 case <- app .ctx .Done ():
255- app .log .App .Info ().Msg ("Oh, seems like I got to shutdown, bye!" )
261+ app .wg .Wait ()
262+ app .log .App .Debug ().Msg ("Closing database" )
256263 app .db .Close ()
264+ app .log .App .Info ().Msg ("Oh, it's time for me to go, bye!" )
257265 return nil
258266 case err := <- errChan :
259267 if err != nil {
@@ -275,14 +283,14 @@ func (app *BootstrapApp) serveHTTP() error {
275283
276284 go func () {
277285 <- app .ctx .Done ()
278- app .log .App .Debug ().Msg ("Shutting down server " )
286+ app .log .App .Debug ().Msg ("Shutting down http listener " )
279287 server .Close ()
280288 }()
281289
282290 err := server .ListenAndServe ()
283291
284292 if err != nil && ! errors .Is (err , http .ErrServerClosed ) {
285- return fmt .Errorf ("failed to start server : %w" , err )
293+ return fmt .Errorf ("failed to start http listener : %w" , err )
286294 }
287295
288296 return nil
@@ -312,24 +320,26 @@ func (app *BootstrapApp) serveUnix() error {
312320 return fmt .Errorf ("failed to create unix socket listner: %w" , err )
313321 }
314322
323+ server := & http.Server {
324+ Handler : app .router .Handler (),
325+ }
326+
327+ defer server .Close ()
315328 defer listener .Close ()
316329 defer os .Remove (app .config .Server .SocketPath )
317330
318331 go func () {
319332 <- app .ctx .Done ()
320- app .log .App .Debug ().Msg ("Shutting down server" )
333+ app .log .App .Debug ().Msg ("Shutting down unix sokcet listener" )
334+ server .Close ()
321335 listener .Close ()
322336 os .Remove (app .config .Server .SocketPath )
323337 }()
324338
325- server := & http.Server {
326- Handler : app .router .Handler (),
327- }
328-
329339 err = server .Serve (listener )
330340
331- if err != nil && ! errors .Is (err , net .ErrClosed ) {
332- return fmt .Errorf ("failed to start server : %w" , err )
341+ if err != nil && ( ! errors .Is (err , net .ErrClosed ) || ! errors . Is ( err , http . ErrServerClosed ) ) {
342+ return fmt .Errorf ("failed to start unix socket listener : %w" , err )
333343 }
334344
335345 return nil
0 commit comments