Revert "Added API to set ephemeral port allocator range."

Since commit 2c4a868f64, Docker doesn't
use the value of net.ipv4.ip_local_port_range when choosing an ephemeral
port. This change reverts back to the previous behavior.

Fixes #43054.

Signed-off-by: Albin Kerouanton <albinker@gmail.com>
This commit is contained in:
Albin Kerouanton 2021-12-06 12:26:32 +01:00 committed by Sebastiaan van Stijn
parent 7bb335999e
commit 414dd017b3
No known key found for this signature in database
GPG Key ID: 76698F39D527CE8C
5 changed files with 14 additions and 126 deletions

View File

@ -1,7 +1,6 @@
package config
import (
"fmt"
"os"
"strings"
@ -10,7 +9,6 @@ import (
"github.com/docker/docker/libnetwork/ipamutils"
"github.com/docker/docker/libnetwork/netlabel"
"github.com/docker/docker/libnetwork/osl"
"github.com/docker/docker/libnetwork/portallocator"
"github.com/docker/docker/pkg/plugingetter"
"github.com/docker/libkv/store"
"github.com/pelletier/go-toml"
@ -163,23 +161,6 @@ func OptionExperimental(exp bool) Option {
}
}
// OptionDynamicPortRange function returns an option setter for service port allocation range
func OptionDynamicPortRange(in string) Option {
return func(c *Config) {
start, end := 0, 0
if len(in) > 0 {
n, err := fmt.Sscanf(in, "%d-%d", &start, &end)
if n != 2 || err != nil {
logrus.Errorf("Failed to parse range string with err %v", err)
return
}
}
if err := portallocator.Get().SetPortRange(start, end); err != nil {
logrus.Errorf("Failed to set port range with err %v", err)
}
}
}
// OptionNetworkControlPlaneMTU function returns an option setter for control plane MTU
func OptionNetworkControlPlaneMTU(exp int) Option {
return func(c *Config) {

View File

@ -9,22 +9,6 @@ import (
"github.com/sirupsen/logrus"
)
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]",
defaultPortRangeStart, defaultPortRangeEnd)
}
err = nil
newStart, newEnd = start, end
if start < defaultPortRangeStart {
newStart = defaultPortRangeStart
}
if end > defaultPortRangeEnd {
newEnd = defaultPortRangeEnd
}
return
}
type ipMapping map[string]protoMap
var (
@ -104,20 +88,12 @@ func Get() *PortAllocator {
return instance
}
func getDefaultPortRange() (int, int) {
start, end, err := getDynamicPortRange()
if err == nil {
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
}
func newInstance() *PortAllocator {
start, end := getDefaultPortRange()
start, end, err := getDynamicPortRange()
if err != nil {
logrus.WithError(err).Infof("falling back to default port range %d-%d", DefaultPortRangeStart, DefaultPortRangeEnd)
start, end = DefaultPortRangeStart, DefaultPortRangeEnd
}
return &PortAllocator{
ipMap: ipMapping{},
Begin: start,
@ -191,30 +167,6 @@ func (p *PortAllocator) ReleasePort(ip net.IP, proto string, port int) error {
return nil
}
// SetPortRange sets dynamic port allocation range.
// if both portBegin and portEnd are 0, the port range reverts to default
// value. Otherwise they are sanitized against the default values to
// ensure their validity.
func (p *PortAllocator) SetPortRange(portBegin, portEnd int) error {
// if begin and end is zero, revert to default values
var begin, end int
var err error
if portBegin == 0 && portEnd == 0 {
begin, end = getDefaultPortRange()
} 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)
p.mutex.Lock()
defer p.mutex.Unlock()
if p.Begin == begin && p.End == end {
return nil
}
p.ipMap = ipMapping{}
p.Begin, p.End = begin, end
return nil
}
func (p *PortAllocator) newPortMap() *portMap {
defaultKey := getRangeKey(p.Begin, p.End)
pm := &portMap{

View File

@ -1,7 +1,6 @@
package portallocator
import (
"fmt"
"net"
"testing"
)
@ -322,47 +321,3 @@ func TestNoDuplicateBPR(t *testing.T) {
t.Fatalf("Acquire(0) allocated the same port twice: %d", port)
}
}
func TestChangePortRange(t *testing.T) {
var tests = []struct {
begin int
end int
setErr error
reqRlt int
}{
{defaultPortRangeEnd + 1, defaultPortRangeEnd + 10, fmt.Errorf("begin out of range"), 0},
{defaultPortRangeStart - 10, defaultPortRangeStart - 1, fmt.Errorf("end out of range"), 0},
{defaultPortRangeEnd, defaultPortRangeStart, fmt.Errorf("out of order"), 0},
{defaultPortRangeStart + 100, defaultPortRangeEnd + 10, nil, defaultPortRangeStart + 100},
{0, 0, nil, defaultPortRangeStart}, // revert to default if no value given
{defaultPortRangeStart - 100, defaultPortRangeEnd, nil, defaultPortRangeStart + 1},
}
p := Get()
port := 0
for _, c := range tests {
t.Logf("test: port allocate range %v-%v, setErr=%v, reqPort=%v",
c.begin, c.end, c.setErr, c.reqRlt)
err := p.SetPortRange(c.begin, c.end)
if (c.setErr == nil && c.setErr != err) ||
(c.setErr != nil && err == nil) {
t.Fatalf("Unexpected set range result, expected=%v, actual=%v", c.setErr, err)
}
if err != nil {
continue
}
if port > 0 {
err := p.ReleasePort(defaultIP, "tcp", port)
if err != nil {
t.Fatalf("Releasing port %v failed, err=%v", port, err)
}
}
port, err = p.RequestPort(defaultIP, "tcp", 0)
if err != nil {
t.Fatalf("Request failed, err %v", err)
}
if port != c.reqRlt {
t.Fatalf("Incorrect port returned, expected=%v, actual=%v", c.reqRlt, port)
}
}
}

View File

@ -4,10 +4,10 @@
package portallocator
const (
// defaultPortRangeStart indicates the first port in port range
defaultPortRangeStart = 49153
// defaultPortRangeEnd indicates the last port in port range
// 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
DefaultPortRangeEnd = 65535
)

View File

@ -1,12 +1,12 @@
package portallocator
const (
// defaultPortRangeStart indicates the first port in port range
defaultPortRangeStart = 60000
// defaultPortRangeEnd indicates the last port in port range
defaultPortRangeEnd = 65000
// 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
return DefaultPortRangeStart, DefaultPortRangeEnd, nil
}