fix data race in UT cases for package ghttp

This commit is contained in:
John Guo
2022-02-22 20:49:09 +08:00
parent d9c1e1f576
commit f0cd3c084e
4 changed files with 33 additions and 8 deletions

View File

@ -10,7 +10,6 @@ import (
"bytes"
"context"
"fmt"
"net"
"net/http"
"os"
"runtime"
@ -616,7 +615,7 @@ func (s *Server) GetListenedPort() int {
func (s *Server) GetListenedPorts() []int {
ports := make([]int, 0)
for _, server := range s.servers {
ports = append(ports, server.rawListener.Addr().(*net.TCPAddr).Port)
ports = append(ports, server.GetListenedPort())
}
return ports
}

View File

@ -13,6 +13,7 @@ import (
"net"
"net/http"
"os"
"sync"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/os/gproc"
@ -27,6 +28,7 @@ type gracefulServer struct {
address string // Listening address like:":80", ":8080".
httpServer *http.Server // Underlying http.Server.
rawListener net.Listener // Underlying net.Listener.
rawLnMu sync.RWMutex // Concurrent safety mutex for `rawListener`.
listener net.Listener // Wrapped net.Listener.
isHttps bool // Is HTTPS.
status int // Status of current server.
@ -72,15 +74,15 @@ func (s *gracefulServer) ListenAndServe() error {
return err
}
s.listener = ln
s.rawListener = ln
s.setRawListener(ln)
return s.doServe(context.TODO())
}
// Fd retrieves and returns the file descriptor of current server.
// It is available ony in *nix like operation systems like: linux, unix, darwin.
// It is available ony in *nix like operating systems like: linux, unix, darwin.
func (s *gracefulServer) Fd() uintptr {
if s.rawListener != nil {
file, err := s.rawListener.(*net.TCPListener).File()
if ln := s.getRawListener(); ln != nil {
file, err := ln.(*net.TCPListener).File()
if err == nil {
return file.Fd()
}
@ -111,7 +113,7 @@ func (s *gracefulServer) ListenAndServeTLS(certFile, keyFile string, tlsConfig .
if config.NextProtos == nil {
config.NextProtos = []string{"http/1.1"}
}
err := error(nil)
var err error
if len(config.Certificates) == 0 {
config.Certificates = make([]tls.Certificate, 1)
if gres.Contains(certFile) {
@ -133,10 +135,18 @@ func (s *gracefulServer) ListenAndServeTLS(certFile, keyFile string, tlsConfig .
}
s.listener = tls.NewListener(ln, config)
s.rawListener = ln
s.setRawListener(ln)
return s.doServe(ctx)
}
// GetListenedPort retrieves and returns one port which is listened by current server.
func (s *gracefulServer) GetListenedPort() int {
if ln := s.getRawListener(); ln != nil {
return ln.Addr().(*net.TCPAddr).Port
}
return 0
}
// getProto retrieves and returns the proto string of current server.
func (s *gracefulServer) getProto() string {
proto := "http"
@ -199,6 +209,20 @@ func (s *gracefulServer) shutdown(ctx context.Context) {
}
}
// setRawListener sets `rawListener` with given net.Listener.
func (s *gracefulServer) setRawListener(ln net.Listener) {
s.rawLnMu.Lock()
defer s.rawLnMu.Unlock()
s.rawListener = ln
}
// setRawListener returns the `rawListener` of current server.
func (s *gracefulServer) getRawListener() net.Listener {
s.rawLnMu.RLock()
defer s.rawLnMu.RUnlock()
return s.rawListener
}
// close shuts down the server forcibly.
func (s *gracefulServer) close(ctx context.Context) {
if s.status == ServerStatusStopped {

View File

@ -34,6 +34,7 @@ func Test_Error_Code(t *testing.T) {
panic(gerror.NewCode(gcode.New(10000, "", nil), "test error"))
})
})
s.SetDumpRouterMap(false)
s.Start()
defer s.Shutdown()
time.Sleep(100 * time.Millisecond)

View File

@ -258,6 +258,7 @@ func Test_Static_Rewrite(t *testing.T) {
"/my-test1": "/test1.html",
"/my-test2": "/test2.html",
})
s.SetDumpRouterMap(false)
s.Start()
defer s.Shutdown()
time.Sleep(100 * time.Millisecond)