瀏覽代碼

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"
 	"fmt"
 	"io"
 	"io"
 	"os"
 	"os"
-	"time"
 
 
 	"github.com/coredhcp/coredhcp/config"
 	"github.com/coredhcp/coredhcp/config"
 	"github.com/coredhcp/coredhcp/logger"
 	"github.com/coredhcp/coredhcp/logger"
@@ -100,7 +99,6 @@ func main() {
 		log.Fatal(err)
 		log.Fatal(err)
 	}
 	}
 	if err := srv.Wait(); err != nil {
 	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"
 	"fmt"
 	"io"
 	"io"
 	"os"
 	"os"
-	"time"
 
 
 	"github.com/coredhcp/coredhcp/config"
 	"github.com/coredhcp/coredhcp/config"
 	"github.com/coredhcp/coredhcp/logger"
 	"github.com/coredhcp/coredhcp/logger"
@@ -122,7 +121,6 @@ func main() {
 		log.Fatal(err)
 		log.Fatal(err)
 	}
 	}
 	if err := srv.Wait(); err != nil {
 	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
 module github.com/coredhcp/coredhcp
 
 
-go 1.19
+go 1.20
 
 
 require (
 require (
 	github.com/bits-and-blooms/bitset v1.13.0
 	github.com/bits-and-blooms/bitset v1.13.0

+ 9 - 2
server/handle.go

@@ -5,6 +5,7 @@
 package server
 package server
 
 
 import (
 import (
+	"errors"
 	"fmt"
 	"fmt"
 	"net"
 	"net"
 	"sync"
 	"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
 		b = b[:MaxDatagram] //Reslice to max capacity in case the buffer in pool was resliced smaller
 
 
 		n, oob, peer, err := l.ReadFrom(b)
 		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)
 			log.Printf("Error reading from connection: %v", err)
 			return 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
 		b = b[:MaxDatagram] //Reslice to max capacity in case the buffer in pool was resliced smaller
 
 
 		n, oob, peer, err := l.ReadFrom(b)
 		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)
 			log.Printf("Error reading from connection: %v", err)
 			return err
 			return err
 		}
 		}

+ 8 - 2
server/serve.go

@@ -5,6 +5,7 @@
 package server
 package server
 
 
 import (
 import (
+	"errors"
 	"fmt"
 	"fmt"
 	"io"
 	"io"
 	"net"
 	"net"
@@ -164,9 +165,14 @@ cleanup:
 // Wait waits until the end of the execution of the server.
 // Wait waits until the end of the execution of the server.
 func (s *Servers) Wait() error {
 func (s *Servers) Wait() error {
 	log.Debug("Waiting")
 	log.Debug("Waiting")
-	err := <-s.errors
+	errs := make([]error, 1, len(s.listeners))
+	errs[0] = <-s.errors
 	s.Close()
 	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
 // Close closes all listening connections