Преглед на файлове

server: Ignore net.ErrClosed errors when shutting down

Also make server.Wait wait for all the listeners to exit, instead of
returning when the first one closes, which we couldn't do before because
of the spurious errors it would return

errors.Join requires go 1.20, update go.mod

Fixes #103

Signed-off-by: Anatole Denis <anatole@unverle.fr>
Anatole Denis преди 1 година
родител
ревизия
28988eb6c1
променени са 5 файла, в които са добавени 20 реда и са изтрити 11 реда
  1. 1 3
      cmds/coredhcp-generator/coredhcp.go.template
  2. 1 3
      cmds/coredhcp/main.go
  3. 1 1
      go.mod
  4. 9 2
      server/handle.go
  5. 8 2
      server/serve.go

+ 1 - 3
cmds/coredhcp-generator/coredhcp.go.template

@@ -11,7 +11,6 @@ import (
 	"fmt"
 	"io"
 	"os"
-	"time"
 
 	"github.com/coredhcp/coredhcp/config"
 	"github.com/coredhcp/coredhcp/logger"
@@ -100,7 +99,6 @@ func main() {
 		log.Fatal(err)
 	}
 	if err := srv.Wait(); err != nil {
-		log.Print(err)
+		log.Error(err)
 	}
-	time.Sleep(time.Second)
 }

+ 1 - 3
cmds/coredhcp/main.go

@@ -10,7 +10,6 @@ import (
 	"fmt"
 	"io"
 	"os"
-	"time"
 
 	"github.com/coredhcp/coredhcp/config"
 	"github.com/coredhcp/coredhcp/logger"
@@ -122,7 +121,6 @@ func main() {
 		log.Fatal(err)
 	}
 	if err := srv.Wait(); err != nil {
-		log.Print(err)
+		log.Error(err)
 	}
-	time.Sleep(time.Second)
 }

+ 1 - 1
go.mod

@@ -1,6 +1,6 @@
 module github.com/coredhcp/coredhcp
 
-go 1.19
+go 1.20
 
 require (
 	github.com/bits-and-blooms/bitset v1.13.0

+ 9 - 2
server/handle.go

@@ -5,6 +5,7 @@
 package server
 
 import (
+	"errors"
 	"fmt"
 	"net"
 	"sync"
@@ -209,7 +210,10 @@ func (l *listener6) Serve() error {
 		b = b[:MaxDatagram] //Reslice to max capacity in case the buffer in pool was resliced smaller
 
 		n, oob, peer, err := l.ReadFrom(b)
-		if err != nil {
+		if errors.Is(err, net.ErrClosed) {
+			// Server is quitting
+			return nil
+		} else if err != nil {
 			log.Printf("Error reading from connection: %v", err)
 			return err
 		}
@@ -225,7 +229,10 @@ func (l *listener4) Serve() error {
 		b = b[:MaxDatagram] //Reslice to max capacity in case the buffer in pool was resliced smaller
 
 		n, oob, peer, err := l.ReadFrom(b)
-		if err != nil {
+		if errors.Is(err, net.ErrClosed) {
+			// Server is quitting
+			return nil
+		} else if err != nil {
 			log.Printf("Error reading from connection: %v", err)
 			return err
 		}

+ 8 - 2
server/serve.go

@@ -5,6 +5,7 @@
 package server
 
 import (
+	"errors"
 	"fmt"
 	"io"
 	"net"
@@ -164,9 +165,14 @@ cleanup:
 // Wait waits until the end of the execution of the server.
 func (s *Servers) Wait() error {
 	log.Debug("Waiting")
-	err := <-s.errors
+	errs := make([]error, 1, len(s.listeners))
+	errs[0] = <-s.errors
 	s.Close()
-	return err
+	// Wait for the other listeners to close
+	for i := 1; i < len(s.listeners); i++ {
+		errs = append(errs, <-s.errors)
+	}
+	return errors.Join(errs...)
 }
 
 // Close closes all listening connections