瀏覽代碼

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