Skip to content

Commit 6ac9a2f

Browse files
committed
Vendor libnetwork v0.6.0-rc3
- Fixes moby#19576 - Fixed embedded DNS to listen in TCP as well - Fixed a race-condition in IPAM to choose non-overlapping subnet for concurrent requests Signed-off-by: Madhu Venugopal <[email protected]>
1 parent 15cc67b commit 6ac9a2f

File tree

8 files changed

+63
-37
lines changed

8 files changed

+63
-37
lines changed

hack/vendor.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ clone git github.com/RackSec/srslog 6eb773f331e46fbba8eecb8e794e635e75fc04de
2727
clone git github.com/imdario/mergo 0.2.1
2828

2929
#get libnetwork packages
30-
clone git github.com/docker/libnetwork v0.6.0-rc2
30+
clone git github.com/docker/libnetwork v0.6.0-rc3
3131
clone git github.com/armon/go-metrics eb0af217e5e9747e41dd5303755356b62d28e3ec
3232
clone git github.com/hashicorp/go-msgpack 71c2886f5a673a35f909803f38ece5810165097b
3333
clone git github.com/hashicorp/memberlist 9a1e242e454d2443df330bdd51a436d5a9058fc4

vendor/src/github.com/docker/libnetwork/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Changelog
22

3+
## 0.6.0-rc3 (2016-01-25)
4+
- Fixes docker/docker#19576
5+
- Fixed embedded DNS to listen in TCP as well
6+
- Fixed a race-condition in IPAM to choose non-overlapping subnet for concurrent requests
7+
38
## 0.6.0-rc2 (2016-01-21)
49
- Fixes docker/docker#19376
510
- Fixes docker/docker#15819

vendor/src/github.com/docker/libnetwork/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ run-tests:
6363
if ls $$dir/*.go &> /dev/null; then \
6464
pushd . &> /dev/null ; \
6565
cd $$dir ; \
66-
$(shell which godep) go test ${INSIDECONTAINER} -test.parallel 3 -test.v -covermode=count -coverprofile=./profile.tmp ; \
66+
$(shell which godep) go test ${INSIDECONTAINER} -test.parallel 5 -test.v -covermode=count -coverprofile=./profile.tmp ; \
6767
ret=$$? ;\
6868
if [ $$ret -ne 0 ]; then exit $$ret; fi ;\
6969
popd &> /dev/null; \

vendor/src/github.com/docker/libnetwork/endpoint.go

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ func (ep *endpoint) sbJoin(sbox Sandbox, options ...EndpointOption) error {
465465
if sb.needDefaultGW() {
466466
return sb.setupDefaultGW(ep)
467467
}
468-
return sb.clearDefaultGW()
468+
return nil
469469
}
470470

471471
func (ep *endpoint) rename(name string) error {
@@ -597,15 +597,7 @@ func (ep *endpoint) sbLeave(sbox Sandbox, force bool, options ...EndpointOption)
597597
}
598598

599599
sb.deleteHostsEntries(n.getSvcRecords(ep))
600-
601-
if !sb.inDelete && sb.needDefaultGW() {
602-
ep := sb.getEPwithoutGateway()
603-
if ep == nil {
604-
return fmt.Errorf("endpoint without GW expected, but not found")
605-
}
606-
return sb.setupDefaultGW(ep)
607-
}
608-
return sb.clearDefaultGW()
600+
return nil
609601
}
610602

611603
func (n *network) validateForceDelete(locator string) error {

vendor/src/github.com/docker/libnetwork/ipam/allocator.go

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -145,12 +145,12 @@ func (a *Allocator) GetDefaultAddressSpaces() (string, string, error) {
145145
// RequestPool returns an address pool along with its unique id.
146146
func (a *Allocator) RequestPool(addressSpace, pool, subPool string, options map[string]string, v6 bool) (string, *net.IPNet, map[string]string, error) {
147147
log.Debugf("RequestPool(%s, %s, %s, %v, %t)", addressSpace, pool, subPool, options, v6)
148-
k, nw, ipr, err := a.parsePoolRequest(addressSpace, pool, subPool, v6)
148+
retry:
149+
k, nw, ipr, pdf, err := a.parsePoolRequest(addressSpace, pool, subPool, v6)
149150
if err != nil {
150151
return "", nil, nil, types.InternalErrorf("failed to parse pool request for address space %q pool %q subpool %q: %v", addressSpace, pool, subPool, err)
151152
}
152153

153-
retry:
154154
if err := a.refresh(addressSpace); err != nil {
155155
return "", nil, nil, err
156156
}
@@ -160,8 +160,12 @@ retry:
160160
return "", nil, nil, err
161161
}
162162

163-
insert, err := aSpace.updatePoolDBOnAdd(*k, nw, ipr)
163+
insert, err := aSpace.updatePoolDBOnAdd(*k, nw, ipr, pdf)
164164
if err != nil {
165+
if _, ok := err.(types.MaskableError); ok {
166+
log.Debugf("Retrying predefined pool search: %v", err)
167+
goto retry
168+
}
165169
return "", nil, nil, err
166170
}
167171

@@ -221,38 +225,39 @@ func (a *Allocator) getAddrSpace(as string) (*addrSpace, error) {
221225
return aSpace, nil
222226
}
223227

224-
func (a *Allocator) parsePoolRequest(addressSpace, pool, subPool string, v6 bool) (*SubnetKey, *net.IPNet, *AddressRange, error) {
228+
func (a *Allocator) parsePoolRequest(addressSpace, pool, subPool string, v6 bool) (*SubnetKey, *net.IPNet, *AddressRange, bool, error) {
225229
var (
226230
nw *net.IPNet
227231
ipr *AddressRange
228232
err error
233+
pdf = false
229234
)
230235

231236
if addressSpace == "" {
232-
return nil, nil, nil, ipamapi.ErrInvalidAddressSpace
237+
return nil, nil, nil, false, ipamapi.ErrInvalidAddressSpace
233238
}
234239

235240
if pool == "" && subPool != "" {
236-
return nil, nil, nil, ipamapi.ErrInvalidSubPool
241+
return nil, nil, nil, false, ipamapi.ErrInvalidSubPool
237242
}
238243

239244
if pool != "" {
240245
if _, nw, err = net.ParseCIDR(pool); err != nil {
241-
return nil, nil, nil, ipamapi.ErrInvalidPool
246+
return nil, nil, nil, false, ipamapi.ErrInvalidPool
242247
}
243248
if subPool != "" {
244249
if ipr, err = getAddressRange(subPool, nw); err != nil {
245-
return nil, nil, nil, err
250+
return nil, nil, nil, false, err
246251
}
247252
}
248253
} else {
249254
if nw, err = a.getPredefinedPool(addressSpace, v6); err != nil {
250-
return nil, nil, nil, err
255+
return nil, nil, nil, false, err
251256
}
252-
257+
pdf = true
253258
}
254259

255-
return &SubnetKey{AddressSpace: addressSpace, Subnet: nw.String(), ChildSubnet: subPool}, nw, ipr, nil
260+
return &SubnetKey{AddressSpace: addressSpace, Subnet: nw.String(), ChildSubnet: subPool}, nw, ipr, pdf, nil
256261
}
257262

258263
func (a *Allocator) insertBitMask(key SubnetKey, pool *net.IPNet) error {

vendor/src/github.com/docker/libnetwork/ipam/structures.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,12 +257,15 @@ func (aSpace *addrSpace) New() datastore.KVObject {
257257
}
258258
}
259259

260-
func (aSpace *addrSpace) updatePoolDBOnAdd(k SubnetKey, nw *net.IPNet, ipr *AddressRange) (func() error, error) {
260+
func (aSpace *addrSpace) updatePoolDBOnAdd(k SubnetKey, nw *net.IPNet, ipr *AddressRange, pdf bool) (func() error, error) {
261261
aSpace.Lock()
262262
defer aSpace.Unlock()
263263

264264
// Check if already allocated
265265
if p, ok := aSpace.subnets[k]; ok {
266+
if pdf {
267+
return nil, types.InternalMaskableErrorf("predefined pool %s is already reserved", nw)
268+
}
266269
aSpace.incRefCount(p, 1)
267270
return func() error { return nil }, nil
268271
}

vendor/src/github.com/docker/libnetwork/resolver.go

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,13 @@ const (
4141

4242
// resolver implements the Resolver interface
4343
type resolver struct {
44-
sb *sandbox
45-
extDNS []string
46-
server *dns.Server
47-
conn *net.UDPConn
48-
err error
44+
sb *sandbox
45+
extDNS []string
46+
server *dns.Server
47+
conn *net.UDPConn
48+
tcpServer *dns.Server
49+
tcpListen *net.TCPListener
50+
err error
4951
}
5052

5153
// NewResolver creates a new instance of the Resolver
@@ -60,6 +62,7 @@ func (r *resolver) SetupFunc() func() {
6062
return (func() {
6163
var err error
6264

65+
// DNS operates primarily on UDP
6366
addr := &net.UDPAddr{
6467
IP: net.ParseIP(resolverIP),
6568
}
@@ -72,9 +75,23 @@ func (r *resolver) SetupFunc() func() {
7275
laddr := r.conn.LocalAddr()
7376
_, ipPort, _ := net.SplitHostPort(laddr.String())
7477

78+
// Listen on a TCP as well
79+
tcpaddr := &net.TCPAddr{
80+
IP: net.ParseIP(resolverIP),
81+
}
82+
83+
r.tcpListen, err = net.ListenTCP("tcp", tcpaddr)
84+
if err != nil {
85+
r.err = fmt.Errorf("error in opening name TCP server socket %v", err)
86+
return
87+
}
88+
ltcpaddr := r.tcpListen.Addr()
89+
_, tcpPort, _ := net.SplitHostPort(ltcpaddr.String())
7590
rules := [][]string{
7691
{"-t", "nat", "-A", "OUTPUT", "-d", resolverIP, "-p", "udp", "--dport", dnsPort, "-j", "DNAT", "--to-destination", laddr.String()},
7792
{"-t", "nat", "-A", "POSTROUTING", "-s", resolverIP, "-p", "udp", "--sport", ipPort, "-j", "SNAT", "--to-source", ":" + dnsPort},
93+
{"-t", "nat", "-A", "OUTPUT", "-d", resolverIP, "-p", "tcp", "--dport", dnsPort, "-j", "DNAT", "--to-destination", ltcpaddr.String()},
94+
{"-t", "nat", "-A", "POSTROUTING", "-s", resolverIP, "-p", "tcp", "--sport", tcpPort, "-j", "SNAT", "--to-source", ":" + dnsPort},
7895
}
7996

8097
for _, rule := range rules {
@@ -97,14 +114,24 @@ func (r *resolver) Start() error {
97114
go func() {
98115
s.ActivateAndServe()
99116
}()
117+
118+
tcpServer := &dns.Server{Handler: r, Listener: r.tcpListen}
119+
r.tcpServer = tcpServer
120+
go func() {
121+
tcpServer.ActivateAndServe()
122+
}()
100123
return nil
101124
}
102125

103126
func (r *resolver) Stop() {
104127
if r.server != nil {
105128
r.server.Shutdown()
106129
}
130+
if r.tcpServer != nil {
131+
r.tcpServer.Shutdown()
132+
}
107133
r.conn = nil
134+
r.tcpServer = nil
108135
r.err = fmt.Errorf("setup not done yet")
109136
}
110137

@@ -195,9 +222,9 @@ func (r *resolver) ServeDNS(w dns.ResponseWriter, query *dns.Msg) {
195222
num = len(r.extDNS)
196223
}
197224
for i := 0; i < num; i++ {
198-
log.Debugf("Querying ext dns %s for %s[%d]", r.extDNS[i], name, query.Question[0].Qtype)
225+
log.Debugf("Querying ext dns %s:%s for %s[%d]", w.LocalAddr().Network(), r.extDNS[i], name, query.Question[0].Qtype)
199226

200-
c := &dns.Client{Net: "udp"}
227+
c := &dns.Client{Net: w.LocalAddr().Network()}
201228
addr := fmt.Sprintf("%s:%d", r.extDNS[i], 53)
202229

203230
resp, _, err = c.Exchange(query, addr)

vendor/src/github.com/docker/libnetwork/sandbox.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -186,12 +186,6 @@ func (sb *sandbox) delete(force bool) error {
186186
// Detach from all endpoints
187187
retain := false
188188
for _, ep := range sb.getConnectedEndpoints() {
189-
// endpoint in the Gateway network will be cleaned up
190-
// when when sandbox no longer needs external connectivity
191-
if ep.endpointInGWNetwork() {
192-
continue
193-
}
194-
195189
// Retain the sanbdox if we can't obtain the network from store.
196190
if _, err := c.getNetworkFromStore(ep.getNetwork().ID()); err != nil {
197191
retain = true

0 commit comments

Comments
 (0)