Jelajahi Sumber

daemon: Daemon.buildSandboxOptions: don't use PortBinding.GetCopy()

This code was initializing a new PortBinding, and creating a deep copy
for each binding. It's unclear what the intent was here, but at least
PortBinding.GetCopy() wasn't adding much value, as it created a new
PortBinding, [copying all values from the original][1], which includes
a [copy of IPAddresses in it][2]. Our original "template" did not have any
of that, so let's forego that, and just create new PortBindings as we go.

[1]: https://github.com/moby/moby/blob/454b6a7cf5187d1153159e5fe07f4b25c7a95e7f/libnetwork/types/types.go#L110-L120
[2]: https://github.com/moby/moby/blob/454b6a7cf5187d1153159e5fe07f4b25c7a95e7f/libnetwork/types/types.go#L236-L244

Benchmarking before/after;

    BenchmarkPortBindingCopy-10    166752   6230 ns/op  1600 B/op  100 allocs/op
    BenchmarkPortBindingNoCopy-10  226989   5056 ns/op  1600 B/op  100 allocs/op

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Sebastiaan van Stijn 1 tahun lalu
induk
melakukan
33b4285eb1
1 mengubah file dengan 11 tambahan dan 7 penghapusan
  1. 11 7
      daemon/container_operations.go

+ 11 - 7
daemon/container_operations.go

@@ -121,10 +121,8 @@ func (daemon *Daemon) buildSandboxOptions(cfg *config.Config, container *contain
 			Port:  portNum,
 		})
 
-		pb := types.PortBinding{Port: portNum, Proto: portProto}
 		binding := bindings[port]
 		for i := 0; i < len(binding); i++ {
-			pbCopy := pb.GetCopy()
 			newP, err := nat.NewPort(nat.SplitProtoPort(binding[i].HostPort))
 			var portStart, portEnd int
 			if err == nil {
@@ -133,14 +131,20 @@ func (daemon *Daemon) buildSandboxOptions(cfg *config.Config, container *contain
 			if err != nil {
 				return nil, fmt.Errorf("Error parsing HostPort value(%s):%v", binding[i].HostPort, err)
 			}
-			pbCopy.HostPort = uint16(portStart)
-			pbCopy.HostPortEnd = uint16(portEnd)
-			pbCopy.HostIP = net.ParseIP(binding[i].HostIP)
-			publishedPorts = append(publishedPorts, pbCopy)
+			publishedPorts = append(publishedPorts, types.PortBinding{
+				Proto:       portProto,
+				Port:        portNum,
+				HostIP:      net.ParseIP(binding[i].HostIP),
+				HostPort:    uint16(portStart),
+				HostPortEnd: uint16(portEnd),
+			})
 		}
 
 		if container.HostConfig.PublishAllPorts && len(binding) == 0 {
-			publishedPorts = append(publishedPorts, pb)
+			publishedPorts = append(publishedPorts, types.PortBinding{
+				Proto: portProto,
+				Port:  portNum,
+			})
 		}
 	}