فهرست منبع

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