-
-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #535 from Fenny/master
Localize reuseport logic
- Loading branch information
Showing
5 changed files
with
72 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
// +build !windows | ||
|
||
// Package reuseport provides TCP net.Listener with SO_REUSEPORT support. | ||
// | ||
// SO_REUSEPORT allows linear scaling server performance on multi-CPU servers. | ||
// See https://www.nginx.com/blog/socket-sharding-nginx-release-1-9-1/ for more details :) | ||
// | ||
// The package is based on https://github.com/kavu/go_reuseport . | ||
package fiber | ||
|
||
import ( | ||
"net" | ||
"strings" | ||
|
||
tcplisten "github.com/valyala/tcplisten" | ||
) | ||
|
||
// Listen returns TCP listener with SO_REUSEPORT option set. | ||
// | ||
// The returned listener tries enabling the following TCP options, which usually | ||
// have positive impact on performance: | ||
// | ||
// - TCP_DEFER_ACCEPT. This option expects that the server reads from accepted | ||
// connections before writing to them. | ||
// | ||
// - TCP_FASTOPEN. See https://lwn.net/Articles/508865/ for details. | ||
// | ||
// Use https://github.com/valyala/tcplisten if you want customizing | ||
// these options. | ||
// | ||
// Only tcp4 and tcp6 networks are supported. | ||
// | ||
// ErrNoReusePort error is returned if the system doesn't support SO_REUSEPORT. | ||
func reuseport(network, addr string) (net.Listener, error) { | ||
cfg := &tcplisten.Config{ | ||
ReusePort: true, | ||
DeferAccept: true, | ||
FastOpen: true, | ||
} | ||
ln, err := cfg.NewListener(network, addr) | ||
if err != nil && strings.Contains(err.Error(), "SO_REUSEPORT") { | ||
return nil, err | ||
} | ||
return ln, err | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
package fiber | ||
|
||
import ( | ||
"context" | ||
"net" | ||
"syscall" | ||
|
||
"golang.org/x/sys/windows" | ||
) | ||
|
||
// Listen returns TCP listener with SO_REUSEADDR option set, SO_REUSEPORT is not supported on Windows, so it uses | ||
// SO_REUSEADDR as an alternative to achieve the same effect. | ||
func reuseport(network, addr string) (net.Listener, error) { | ||
cfg := net.ListenConfig{ | ||
Control: func(network, address string, c syscall.RawConn) (err error) { | ||
return c.Control(func(fd uintptr) { | ||
err = windows.SetsockoptInt(windows.Handle(fd), windows.SOL_SOCKET, windows.SO_REUSEADDR, 1) | ||
}) | ||
}, | ||
} | ||
return cfg.Listen(context.Background(), network, addr) | ||
} |