From: Urban Wallasch Date: Wed, 10 Apr 2019 17:01:04 +0000 (+0200) Subject: * Discern temporary network errors and don't treat those as fatal. X-Git-Url: https://git.packet-gain.de/?a=commitdiff_plain;h=50a6502ba6b31b532e3dede309f160bd9129f4fd;p=gogopherd.git * Discern temporary network errors and don't treat those as fatal. --- diff --git a/gogopherd.go b/gogopherd.go index e400a97..4cf1c28 100644 --- a/gogopherd.go +++ b/gogopherd.go @@ -248,14 +248,17 @@ func handleRequest(conn net.Conn) { } func serveTCP(listener *net.TCPListener) { + defer listener.Close() + logger.Print("listening on TCP ", listener.Addr()) for { conn, err := listener.AcceptTCP() if shutting_down { return } - checkFatal(err, "Accept") - logger.Print("connect from ", conn.RemoteAddr()) - go handleRequest(conn) + if checkFatal(err, "Accept") == nil { + logger.Print("connect from ", conn.RemoteAddr()) + go handleRequest(conn) + } } } @@ -268,14 +271,13 @@ func main() { checkFatal(err, "ResolveTCPAddr") listener, err := net.ListenTCP("tcp", address) checkFatal(err, "ListenTCP") - logger.Print("listening on TCP ", address) go serveTCP(listener) // wait for signal sigchan := make(chan os.Signal) signal.Notify(sigchan, syscall.SIGINT, syscall.SIGTERM) sig := <-sigchan - tracer.Print("Received signal: ", sig) + logger.Print("shutdown on signal: ", sig) shutting_down = true tracer.Print("Bye.") } diff --git a/logger.go b/logger.go index 9b6dbca..c5a896b 100644 --- a/logger.go +++ b/logger.go @@ -11,6 +11,7 @@ package main import ( "io/ioutil" "log" + "net" "os" "path/filepath" "runtime" @@ -43,11 +44,17 @@ func initLogger(verbose bool, logfilename string) { } } -func checkFatal(err error, msg string) { +func checkFatal(err error, msg string) error { if err != nil { _, file, line, _ := runtime.Caller(1) - loggex.Fatalf("%s:%d: %s %v\n", filepath.Base(file), line, msg, err) + if ne, ok := err.(net.Error); ok && ne.Temporary() { + // this a temporary error so we should sleep and retry + loggex.Printf("%s:%d: %s %v\n", filepath.Base(file), line, msg, err) + } else { + loggex.Fatalf("%s:%d: %s %v\n", filepath.Base(file), line, msg, err) + } } + return err } func check(err error, msg string) error {