Browse code

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

Since commit 2c4a868f64e6e13bf06589a6670122196651e82e, 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>

Albin Kerouanton authored on 2021/12/06 20:26:32
Showing 5 changed files
... ...
@@ -1,7 +1,6 @@
1 1
 package config
2 2
 
3 3
 import (
4
-	"fmt"
5 4
 	"os"
6 5
 	"strings"
7 6
 
... ...
@@ -10,7 +9,6 @@ import (
10 10
 	"github.com/docker/docker/libnetwork/ipamutils"
11 11
 	"github.com/docker/docker/libnetwork/netlabel"
12 12
 	"github.com/docker/docker/libnetwork/osl"
13
-	"github.com/docker/docker/libnetwork/portallocator"
14 13
 	"github.com/docker/docker/pkg/plugingetter"
15 14
 	"github.com/docker/libkv/store"
16 15
 	"github.com/pelletier/go-toml"
... ...
@@ -163,23 +161,6 @@ func OptionExperimental(exp bool) Option {
163 163
 	}
164 164
 }
165 165
 
166
-// OptionDynamicPortRange function returns an option setter for service port allocation range
167
-func OptionDynamicPortRange(in string) Option {
168
-	return func(c *Config) {
169
-		start, end := 0, 0
170
-		if len(in) > 0 {
171
-			n, err := fmt.Sscanf(in, "%d-%d", &start, &end)
172
-			if n != 2 || err != nil {
173
-				logrus.Errorf("Failed to parse range string with err %v", err)
174
-				return
175
-			}
176
-		}
177
-		if err := portallocator.Get().SetPortRange(start, end); err != nil {
178
-			logrus.Errorf("Failed to set port range with err %v", err)
179
-		}
180
-	}
181
-}
182
-
183 166
 // OptionNetworkControlPlaneMTU function returns an option setter for control plane MTU
184 167
 func OptionNetworkControlPlaneMTU(exp int) Option {
185 168
 	return func(c *Config) {
... ...
@@ -9,22 +9,6 @@ import (
9 9
 	"github.com/sirupsen/logrus"
10 10
 )
11 11
 
12
-func sanitizePortRange(start int, end int) (newStart, newEnd int, err error) {
13
-	if start > defaultPortRangeEnd || end < defaultPortRangeStart || start > end {
14
-		return 0, 0, fmt.Errorf("Request out allowed range [%v, %v]",
15
-			defaultPortRangeStart, defaultPortRangeEnd)
16
-	}
17
-	err = nil
18
-	newStart, newEnd = start, end
19
-	if start < defaultPortRangeStart {
20
-		newStart = defaultPortRangeStart
21
-	}
22
-	if end > defaultPortRangeEnd {
23
-		newEnd = defaultPortRangeEnd
24
-	}
25
-	return
26
-}
27
-
28 12
 type ipMapping map[string]protoMap
29 13
 
30 14
 var (
... ...
@@ -104,20 +88,12 @@ func Get() *PortAllocator {
104 104
 	return instance
105 105
 }
106 106
 
107
-func getDefaultPortRange() (int, int) {
107
+func newInstance() *PortAllocator {
108 108
 	start, end, err := getDynamicPortRange()
109
-	if err == nil {
110
-		start, end, err = sanitizePortRange(start, end)
111
-	}
112 109
 	if err != nil {
113
-		logrus.WithError(err).Infof("falling back to default port range %d-%d", defaultPortRangeStart, defaultPortRangeEnd)
114
-		start, end = defaultPortRangeStart, defaultPortRangeEnd
110
+		logrus.WithError(err).Infof("falling back to default port range %d-%d", DefaultPortRangeStart, DefaultPortRangeEnd)
111
+		start, end = DefaultPortRangeStart, DefaultPortRangeEnd
115 112
 	}
116
-	return start, end
117
-}
118
-
119
-func newInstance() *PortAllocator {
120
-	start, end := getDefaultPortRange()
121 113
 	return &PortAllocator{
122 114
 		ipMap: ipMapping{},
123 115
 		Begin: start,
... ...
@@ -191,30 +167,6 @@ func (p *PortAllocator) ReleasePort(ip net.IP, proto string, port int) error {
191 191
 	return nil
192 192
 }
193 193
 
194
-// SetPortRange sets dynamic port allocation range.
195
-// if both portBegin and portEnd are 0, the port range reverts to default
196
-// value. Otherwise they are sanitized against the default values to
197
-// ensure their validity.
198
-func (p *PortAllocator) SetPortRange(portBegin, portEnd int) error {
199
-	// if begin and end is zero, revert to default values
200
-	var begin, end int
201
-	var err error
202
-	if portBegin == 0 && portEnd == 0 {
203
-		begin, end = getDefaultPortRange()
204
-	} else if begin, end, err = sanitizePortRange(portBegin, portEnd); err != nil {
205
-		return err
206
-	}
207
-	logrus.Debugf("Setting up port allocator to range %v-%v, current %v-%v", begin, end, p.Begin, p.End)
208
-	p.mutex.Lock()
209
-	defer p.mutex.Unlock()
210
-	if p.Begin == begin && p.End == end {
211
-		return nil
212
-	}
213
-	p.ipMap = ipMapping{}
214
-	p.Begin, p.End = begin, end
215
-	return nil
216
-}
217
-
218 194
 func (p *PortAllocator) newPortMap() *portMap {
219 195
 	defaultKey := getRangeKey(p.Begin, p.End)
220 196
 	pm := &portMap{
... ...
@@ -1,7 +1,6 @@
1 1
 package portallocator
2 2
 
3 3
 import (
4
-	"fmt"
5 4
 	"net"
6 5
 	"testing"
7 6
 )
... ...
@@ -322,47 +321,3 @@ func TestNoDuplicateBPR(t *testing.T) {
322 322
 		t.Fatalf("Acquire(0) allocated the same port twice: %d", port)
323 323
 	}
324 324
 }
325
-
326
-func TestChangePortRange(t *testing.T) {
327
-	var tests = []struct {
328
-		begin  int
329
-		end    int
330
-		setErr error
331
-		reqRlt int
332
-	}{
333
-		{defaultPortRangeEnd + 1, defaultPortRangeEnd + 10, fmt.Errorf("begin out of range"), 0},
334
-		{defaultPortRangeStart - 10, defaultPortRangeStart - 1, fmt.Errorf("end out of range"), 0},
335
-		{defaultPortRangeEnd, defaultPortRangeStart, fmt.Errorf("out of order"), 0},
336
-		{defaultPortRangeStart + 100, defaultPortRangeEnd + 10, nil, defaultPortRangeStart + 100},
337
-		{0, 0, nil, defaultPortRangeStart}, // revert to default if no value given
338
-		{defaultPortRangeStart - 100, defaultPortRangeEnd, nil, defaultPortRangeStart + 1},
339
-	}
340
-	p := Get()
341
-	port := 0
342
-	for _, c := range tests {
343
-		t.Logf("test: port allocate range %v-%v, setErr=%v, reqPort=%v",
344
-			c.begin, c.end, c.setErr, c.reqRlt)
345
-		err := p.SetPortRange(c.begin, c.end)
346
-		if (c.setErr == nil && c.setErr != err) ||
347
-			(c.setErr != nil && err == nil) {
348
-			t.Fatalf("Unexpected set range result, expected=%v, actual=%v", c.setErr, err)
349
-		}
350
-		if err != nil {
351
-			continue
352
-		}
353
-		if port > 0 {
354
-			err := p.ReleasePort(defaultIP, "tcp", port)
355
-			if err != nil {
356
-				t.Fatalf("Releasing port %v failed, err=%v", port, err)
357
-			}
358
-		}
359
-
360
-		port, err = p.RequestPort(defaultIP, "tcp", 0)
361
-		if err != nil {
362
-			t.Fatalf("Request failed, err %v", err)
363
-		}
364
-		if port != c.reqRlt {
365
-			t.Fatalf("Incorrect port returned, expected=%v, actual=%v", c.reqRlt, port)
366
-		}
367
-	}
368
-}
... ...
@@ -4,10 +4,10 @@
4 4
 package portallocator
5 5
 
6 6
 const (
7
-	// defaultPortRangeStart indicates the first port in port range
8
-	defaultPortRangeStart = 49153
9
-	// defaultPortRangeEnd indicates the last port in port range
7
+	// DefaultPortRangeStart indicates the first port in port range
8
+	DefaultPortRangeStart = 49153
9
+	// DefaultPortRangeEnd indicates the last port in port range
10 10
 	// consistent with default /proc/sys/net/ipv4/ip_local_port_range
11 11
 	// upper bound on linux
12
-	defaultPortRangeEnd = 60999
12
+	DefaultPortRangeEnd = 65535
13 13
 )
... ...
@@ -1,12 +1,12 @@
1 1
 package portallocator
2 2
 
3 3
 const (
4
-	// defaultPortRangeStart indicates the first port in port range
5
-	defaultPortRangeStart = 60000
6
-	// defaultPortRangeEnd indicates the last port in port range
7
-	defaultPortRangeEnd = 65000
4
+	// DefaultPortRangeStart indicates the first port in port range
5
+	DefaultPortRangeStart = 60000
6
+	// DefaultPortRangeEnd indicates the last port in port range
7
+	DefaultPortRangeEnd = 65000
8 8
 )
9 9
 
10 10
 func getDynamicPortRange() (start int, end int, err error) {
11
-	return defaultPortRangeStart, defaultPortRangeEnd, nil
11
+	return DefaultPortRangeStart, DefaultPortRangeEnd, nil
12 12
 }