@@ -2,6 +2,8 @@ package main
22
33import (
44 "context"
5+ "errors"
6+ "fmt"
57 "log"
68 "net/http"
79 "os"
@@ -15,33 +17,40 @@ import (
1517)
1618
1719func main () {
20+ ctx := context .Background ()
21+ if err := run (ctx ); err != nil {
22+ fmt .Fprintf (os .Stderr , "%s\n " , err )
23+ os .Exit (1 )
24+ }
25+ }
26+
27+ func run (ctx context.Context ) error {
1828 log .Println ("Go version:" , runtime .Version ())
1929 log .Println ("Go OS/Arch:" , runtime .GOOS , runtime .GOARCH )
2030
2131 conf := config .New ()
2232 srv , err := server .New (conf )
2333 if err != nil {
24- log . Fatalf ("server: %v \n " , err )
34+ return fmt . Errorf ("server initialization error : %w " , err )
2535 }
2636
27- done := make (chan os.Signal , 1 )
28- signal .Notify (done , os .Interrupt , syscall .SIGINT , syscall .SIGTERM )
29-
3037 go func () {
31- if err := srv .ListenAndServe (); err != nil && err != http .ErrServerClosed {
32- log .Fatalf ("listen : %v\n " , err )
38+ if err := srv .ListenAndServe (); ! errors . Is ( err , http .ErrServerClosed ) {
39+ log .Fatalf ("server startup error : %v" , err )
3340 }
41+ log .Println ("stopped serving new connections." )
3442 }()
3543
36- <- done
44+ sigChan := make (chan os.Signal , 1 )
45+ signal .Notify (sigChan , syscall .SIGINT , syscall .SIGTERM )
46+ <- sigChan
3747
38- ctx , cancel := context .WithTimeout (context .Background (), 5 * time .Second )
39- defer func () {
40- // extra handling here, databases etc
41- cancel ()
42- }()
48+ shutdownCtx , shutdownRelease := context .WithTimeout (ctx , 10 * time .Second )
49+ defer shutdownRelease ()
4350
44- if err := srv .Shutdown (ctx ); err != nil {
45- log . Fatalf ( "Server Shutdown Failed:%+v " , err )
51+ if err := srv .Shutdown (shutdownCtx ); err != nil {
52+ return fmt . Errorf ( "server shutdown error: %w " , err )
4653 }
54+ log .Println ("server shutdown complete." )
55+ return nil
4756}
0 commit comments