فهرست منبع

Merge pull request #42504 from thaJeztah/portallocator_cleanup

Akihiro Suda 4 سال پیش
والد
کامیت
5e62ca1a05

+ 7 - 19
libnetwork/portallocator/portallocator.go

@@ -9,15 +9,6 @@ import (
 	"github.com/sirupsen/logrus"
 )
 
-var (
-	// defaultPortRangeStart indicates the first port in port range
-	defaultPortRangeStart = 49153
-	// defaultPortRangeEnd indicates the last port in port range
-	// consistent with default /proc/sys/net/ipv4/ip_local_port_range
-	// upper bound on linux
-	defaultPortRangeEnd = 60999
-)
-
 func sanitizePortRange(start int, end int) (newStart, newEnd int, err error) {
 	if start > defaultPortRangeEnd || end < defaultPortRangeStart || start > end {
 		return 0, 0, fmt.Errorf("Request out allowed range [%v, %v]",
@@ -44,7 +35,6 @@ var (
 	defaultIP          = net.ParseIP("0.0.0.0")
 	once               sync.Once
 	instance           *PortAllocator
-	createInstance     = func() { instance = newInstance() }
 )
 
 // ErrPortAlreadyAllocated is the returned error information when a requested port is already being used
@@ -108,7 +98,9 @@ func Get() *PortAllocator {
 	// the OS so that it can have up to date view of the OS port allocation.
 	// When this happens singleton behavior will be removed. Clients do not
 	// need to worry about this, they will not see a change in behavior.
-	once.Do(createInstance)
+	once.Do(func() {
+		instance = newInstance()
+	})
 	return instance
 }
 
@@ -118,6 +110,7 @@ func getDefaultPortRange() (int, int) {
 		start, end, err = sanitizePortRange(start, end)
 	}
 	if err != nil {
+		logrus.WithError(err).Infof("falling back to default port range %d-%d", defaultPortRangeStart, defaultPortRangeEnd)
 		start, end = defaultPortRangeStart, defaultPortRangeEnd
 	}
 	return start, end
@@ -208,15 +201,10 @@ func (p *PortAllocator) SetPortRange(portBegin, portEnd int) error {
 	var err error
 	if portBegin == 0 && portEnd == 0 {
 		begin, end = getDefaultPortRange()
-
-	} else {
-		begin, end, err = sanitizePortRange(portBegin, portEnd)
-		if err != nil {
-			return err
-		}
+	} else if begin, end, err = sanitizePortRange(portBegin, portEnd); err != nil {
+		return err
 	}
-	logrus.Debugf("Setting up port allocator to range %v-%v, current %v-%v",
-		begin, end, p.Begin, p.End)
+	logrus.Debugf("Setting up port allocator to range %v-%v, current %v-%v", begin, end, p.Begin, p.End)
 	p.mutex.Lock()
 	defer p.mutex.Unlock()
 	if p.Begin == begin && p.End == end {

+ 4 - 5
libnetwork/portallocator/portallocator_freebsd.go

@@ -8,20 +8,19 @@ import (
 
 func getDynamicPortRange() (start int, end int, err error) {
 	portRangeKernelSysctl := []string{"net.inet.ip.portrange.hifirst", "net.ip.portrange.hilast"}
-	portRangeFallback := fmt.Sprintf("using fallback port range %d-%d", defaultPortRangeStart, defaultPortRangeEnd)
 	portRangeLowCmd := exec.Command("/sbin/sysctl", portRangeKernelSysctl[0])
 	var portRangeLowOut bytes.Buffer
 	portRangeLowCmd.Stdout = &portRangeLowOut
 	cmdErr := portRangeLowCmd.Run()
 	if cmdErr != nil {
-		return 0, 0, fmt.Errorf("port allocator - sysctl net.inet.ip.portrange.hifirst failed - %s: %v", portRangeFallback, err)
+		return 0, 0, fmt.Errorf("port allocator - sysctl net.inet.ip.portrange.hifirst failed: %v", err)
 	}
 	n, err := fmt.Sscanf(portRangeLowOut.String(), "%d", &start)
 	if n != 1 || err != nil {
 		if err == nil {
 			err = fmt.Errorf("unexpected count of parsed numbers (%d)", n)
 		}
-		return 0, 0, fmt.Errorf("port allocator - failed to parse system ephemeral port range start from %s - %s: %v", portRangeLowOut.String(), portRangeFallback, err)
+		return 0, 0, fmt.Errorf("port allocator - failed to parse system ephemeral port range start from %s: %v", portRangeLowOut.String(), err)
 	}
 
 	portRangeHighCmd := exec.Command("/sbin/sysctl", portRangeKernelSysctl[1])
@@ -29,14 +28,14 @@ func getDynamicPortRange() (start int, end int, err error) {
 	portRangeHighCmd.Stdout = &portRangeHighOut
 	cmdErr = portRangeHighCmd.Run()
 	if cmdErr != nil {
-		return 0, 0, fmt.Errorf("port allocator - sysctl net.inet.ip.portrange.hilast failed - %s: %v", portRangeFallback, err)
+		return 0, 0, fmt.Errorf("port allocator - sysctl net.inet.ip.portrange.hilast failed: %v", err)
 	}
 	n, err = fmt.Sscanf(portRangeHighOut.String(), "%d", &end)
 	if n != 1 || err != nil {
 		if err == nil {
 			err = fmt.Errorf("unexpected count of parsed numbers (%d)", n)
 		}
-		return 0, 0, fmt.Errorf("port allocator - failed to parse system ephemeral port range end from %s - %s: %v", portRangeHighOut.String(), portRangeFallback, err)
+		return 0, 0, fmt.Errorf("port allocator - failed to parse system ephemeral port range end from %s: %v", portRangeHighOut.String(), err)
 	}
 	return start, end, nil
 }

+ 2 - 4
libnetwork/portallocator/portallocator_linux.go

@@ -8,12 +8,10 @@ import (
 
 func getDynamicPortRange() (start int, end int, err error) {
 	const portRangeKernelParam = "/proc/sys/net/ipv4/ip_local_port_range"
-	portRangeFallback := fmt.Sprintf("using fallback port range %d-%d", defaultPortRangeStart, defaultPortRangeEnd)
 	file, err := os.Open(portRangeKernelParam)
 	if err != nil {
-		return 0, 0, fmt.Errorf("port allocator - %s due to error: %v", portRangeFallback, err)
+		return 0, 0, err
 	}
-
 	defer file.Close()
 
 	n, err := fmt.Fscanf(bufio.NewReader(file), "%d\t%d", &start, &end)
@@ -21,7 +19,7 @@ func getDynamicPortRange() (start int, end int, err error) {
 		if err == nil {
 			err = fmt.Errorf("unexpected count of parsed numbers (%d)", n)
 		}
-		return 0, 0, fmt.Errorf("port allocator - failed to parse system ephemeral port range from %s - %s: %v", portRangeKernelParam, portRangeFallback, err)
+		return 0, 0, fmt.Errorf("port allocator - failed to parse system ephemeral port range from %s: %v", portRangeKernelParam, err)
 	}
 	return start, end, nil
 }

+ 12 - 0
libnetwork/portallocator/portallocator_unix.go

@@ -0,0 +1,12 @@
+// +build !windows
+
+package portallocator
+
+const (
+	// defaultPortRangeStart indicates the first port in port range
+	defaultPortRangeStart = 49153
+	// defaultPortRangeEnd indicates the last port in port range
+	// consistent with default /proc/sys/net/ipv4/ip_local_port_range
+	// upper bound on linux
+	defaultPortRangeEnd = 60999
+)

+ 4 - 2
libnetwork/portallocator/portallocator_windows.go

@@ -1,9 +1,11 @@
 package portallocator
 
-func init() {
+const (
+	// defaultPortRangeStart indicates the first port in port range
 	defaultPortRangeStart = 60000
+	// defaultPortRangeEnd indicates the last port in port range
 	defaultPortRangeEnd = 65000
-}
+)
 
 func getDynamicPortRange() (start int, end int, err error) {
 	return defaultPortRangeStart, defaultPortRangeEnd, nil