Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add stub/wrapper for reuseport.Listen on Windows platforms #638

Merged
merged 16 commits into from Aug 30, 2019
Merged
2 changes: 2 additions & 0 deletions reuseport/reuseport_test.go
@@ -1,3 +1,5 @@
// +build linux darwin dragonfly freebsd netbsd openbsd rumprun
andrewheberle marked this conversation as resolved.
Show resolved Hide resolved

package reuseport

import (
Expand Down
27 changes: 27 additions & 0 deletions reuseport/reuseport_windows.go
@@ -0,0 +1,27 @@
// 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 .
andrewheberle marked this conversation as resolved.
Show resolved Hide resolved
package reuseport

import (
"fmt"
"net"
)

// ErrNoReusePort is returned if the OS doesn't support SO_REUSEPORT.
type ErrNoReusePort struct {
andrewheberle marked this conversation as resolved.
Show resolved Hide resolved
err error
}

// Error implements error interface.
func (e *ErrNoReusePort) Error() string {
return fmt.Sprintf("The OS doesn't support SO_REUSEPORT: %s", e.err)
}

// Listen always returns ErrNoReusePort on Windows
func Listen(network, addr string) (net.Listener, error) {
return nil, &ErrNoReusePort{fmt.Errorf("Not supported on Windows")}
}
16 changes: 16 additions & 0 deletions reuseport/reuseport_windows_test.go
@@ -0,0 +1,16 @@
package reuseport
andrewheberle marked this conversation as resolved.
Show resolved Hide resolved

import (
"testing"
)

func TestListen(t *testing.T) {
_, err := Listen("tcp6", "[::1]:10082")
if err == nil {
t.Fatalf("unexpected non-error creating listener")
}

if _, errnoreuseport := err.(*ErrNoReusePort); !errnoreuseport {
t.Fatalf("unexpected error creating listener: %s", err)
}
}