Skip to content
This repository has been archived by the owner on May 27, 2021. It is now read-only.

Commit

Permalink
cli: fallback while trying reuseport
Browse files Browse the repository at this point in the history
  • Loading branch information
ernado committed May 13, 2019
1 parent 6b88a6e commit 8d84054
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 6 deletions.
19 changes: 15 additions & 4 deletions internal/cli/run.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,25 @@ import (
)

// ListenUDPAndServe listens on laddr and process incoming packets.
func ListenUDPAndServe(serverNet, laddr string, u *server.Updater) error {
func ListenUDPAndServe(log *zap.Logger, serverNet, laddr string, u *server.Updater) error {
var (
c net.PacketConn
err error
)
opt := u.Get()
if reuseport.Available() && opt.ReusePort {
c, err = reuseport.ListenPacket(serverNet, laddr)
if err != nil {
// Trying to listen without reuseport.
// Sometimes reuseport.Available() can be true, but for subset
// of interfaces it is not available.
reusePortErr := err
c, err = net.ListenPacket(serverNet, laddr)
if err == nil {
opt.ReusePort = false
log.Warn("failed to use REUSEPORT, falling back to non-reuseport", zap.Error(reusePortErr))
}
}
} else {
c, err = net.ListenPacket(serverNet, laddr)
}
Expand Down Expand Up @@ -338,7 +349,7 @@ func protocolNotSupported(err error) bool {
return false
}

func runRoot(v *viper.Viper, listenFunc func(serverNet, laddr string, u *server.Updater) error) {
func runRoot(v *viper.Viper, listenFunc func(log *zap.Logger, serverNet, laddr string, u *server.Updater) error) {
l := getLogger(v)
wg := new(sync.WaitGroup)
listeners := getListeners(v, l)
Expand All @@ -348,7 +359,7 @@ func runRoot(v *viper.Viper, listenFunc func(serverNet, laddr string, u *server.
defer wg.Done()
lg := l.With(zap.String("addr", ln.adrr), zap.String("network", "udp"))
lg.Info("gortc/gortcd listening")
if err := listenFunc(ln.net, ln.adrr, ln.u); err != nil {
if err := listenFunc(lg, ln.net, ln.adrr, ln.u); err != nil {
if ln.fromAny && protocolNotSupported(err) {
// See https://github.com/gortc/gortcd/issues/32
// Should be ok to make it non configurable.
Expand All @@ -362,7 +373,7 @@ func runRoot(v *viper.Viper, listenFunc func(serverNet, laddr string, u *server.
wg.Wait()
}

func getRoot(v *viper.Viper, listenFunc func(serverNet, laddr string, u *server.Updater) error) *cobra.Command {
func getRoot(v *viper.Viper, listenFunc func(log *zap.Logger, serverNet, laddr string, u *server.Updater) error) *cobra.Command {
cmd := &cobra.Command{
Use: "gortcd",
Short: "gortcd is STUN and TURN server",
Expand Down
4 changes: 2 additions & 2 deletions internal/cli/run_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ func TestGetListeners(t *testing.T) {
func TestRootRun(t *testing.T) {
t.Run("Listen by flag", func(t *testing.T) {
v := getViper()
cmd := getRoot(v, func(serverNet, laddr string, u *server.Updater) error {
cmd := getRoot(v, func(log *zap.Logger, serverNet, laddr string, u *server.Updater) error {
if laddr != "127.0.0.1:0" {
t.Errorf("unexpected laddr %q", laddr)
}
Expand All @@ -210,7 +210,7 @@ func TestRootRun(t *testing.T) {
"127.0.0.1:12111": false,
"127.0.0.1:12112": false,
}
cmd := getRoot(v, func(serverNet, laddr string, u *server.Updater) error {
cmd := getRoot(v, func(log *zap.Logger, serverNet, laddr string, u *server.Updater) error {
mux.Lock()
defer mux.Unlock()
if addrMet[laddr] {
Expand Down

0 comments on commit 8d84054

Please sign in to comment.