Skip to content

Commit ee3b42f

Browse files
committed
Vendor libnetwork v0.6.0-rc1
- Fixes moby#19404 - Fixes ungraceful daemon restart issue in systemd with remote network plugin (moby/libnetwork#813) Signed-off-by: Madhu Venugopal <[email protected]>
1 parent 4b63689 commit ee3b42f

10 files changed

Lines changed: 78 additions & 39 deletions

File tree

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.5.6
30+
clone git github.com/docker/libnetwork v0.6.0-rc1
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-rc1 (2016-01-14)
4+
- Fixes docker/docker#19404
5+
- Fixes the ungraceful daemon restart issue in systemd with remote network plugin
6+
(https://github.com/docker/libnetwork/issues/813)
7+
38
## 0.5.6 (2016-01-14)
49
- Setup embedded DNS server correctly on container restart. Fixes docker/docker#19354
510

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ func (c *controller) NewNetwork(networkType, name string, options ...NetworkOpti
387387

388388
// Make sure we have a driver available for this network type
389389
// before we allocate anything.
390-
if _, err := network.driver(); err != nil {
390+
if _, err := network.driver(true); err != nil {
391391
return nil, err
392392
}
393393

@@ -432,7 +432,7 @@ func (c *controller) NewNetwork(networkType, name string, options ...NetworkOpti
432432
}
433433

434434
func (c *controller) addNetwork(n *network) error {
435-
d, err := n.driver()
435+
d, err := n.driver(true)
436436
if err != nil {
437437
return err
438438
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ func (sb *sandbox) clearDefaultGW() error {
8484
return nil
8585
}
8686

87-
if err := ep.sbLeave(sb); err != nil {
87+
if err := ep.sbLeave(sb, false); err != nil {
8888
return fmt.Errorf("container %s: endpoint leaving GW Network failed: %v", sb.containerID, err)
8989
}
9090
if err := ep.Delete(false); err != nil {

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

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@ func (ep *endpoint) sbJoin(sbox Sandbox, options ...EndpointOption) error {
406406

407407
ep.processOptions(options...)
408408

409-
driver, err := network.driver()
409+
driver, err := network.driver(true)
410410
if err != nil {
411411
return fmt.Errorf("failed to join endpoint: %v", err)
412412
}
@@ -533,10 +533,10 @@ func (ep *endpoint) Leave(sbox Sandbox, options ...EndpointOption) error {
533533
sb.joinLeaveStart()
534534
defer sb.joinLeaveEnd()
535535

536-
return ep.sbLeave(sbox, options...)
536+
return ep.sbLeave(sbox, false, options...)
537537
}
538538

539-
func (ep *endpoint) sbLeave(sbox Sandbox, options ...EndpointOption) error {
539+
func (ep *endpoint) sbLeave(sbox Sandbox, force bool, options ...EndpointOption) error {
540540
sb, ok := sbox.(*sandbox)
541541
if !ok {
542542
return types.BadRequestErrorf("not a valid Sandbox interface")
@@ -565,7 +565,7 @@ func (ep *endpoint) sbLeave(sbox Sandbox, options ...EndpointOption) error {
565565

566566
ep.processOptions(options...)
567567

568-
d, err := n.driver()
568+
d, err := n.driver(!force)
569569
if err != nil {
570570
return fmt.Errorf("failed to leave endpoint: %v", err)
571571
}
@@ -575,9 +575,11 @@ func (ep *endpoint) sbLeave(sbox Sandbox, options ...EndpointOption) error {
575575
ep.network = n
576576
ep.Unlock()
577577

578-
if err := d.Leave(n.id, ep.id); err != nil {
579-
if _, ok := err.(types.MaskableError); !ok {
580-
log.Warnf("driver error disconnecting container %s : %v", ep.name, err)
578+
if d != nil {
579+
if err := d.Leave(n.id, ep.id); err != nil {
580+
if _, ok := err.(types.MaskableError); !ok {
581+
log.Warnf("driver error disconnecting container %s : %v", ep.name, err)
582+
}
581583
}
582584
}
583585

@@ -649,7 +651,7 @@ func (ep *endpoint) Delete(force bool) error {
649651
}
650652

651653
if sb != nil {
652-
if e := ep.sbLeave(sb); e != nil {
654+
if e := ep.sbLeave(sb, force); e != nil {
653655
log.Warnf("failed to leave sandbox for endpoint %s : %v", name, e)
654656
}
655657
}
@@ -681,7 +683,7 @@ func (ep *endpoint) Delete(force bool) error {
681683
// unwatch for service records
682684
n.getController().unWatchSvcRecord(ep)
683685

684-
if err = ep.deleteEndpoint(); err != nil && !force {
686+
if err = ep.deleteEndpoint(force); err != nil && !force {
685687
return err
686688
}
687689

@@ -690,18 +692,22 @@ func (ep *endpoint) Delete(force bool) error {
690692
return nil
691693
}
692694

693-
func (ep *endpoint) deleteEndpoint() error {
695+
func (ep *endpoint) deleteEndpoint(force bool) error {
694696
ep.Lock()
695697
n := ep.network
696698
name := ep.name
697699
epid := ep.id
698700
ep.Unlock()
699701

700-
driver, err := n.driver()
702+
driver, err := n.driver(!force)
701703
if err != nil {
702704
return fmt.Errorf("failed to delete endpoint: %v", err)
703705
}
704706

707+
if driver == nil {
708+
return nil
709+
}
710+
705711
if err := driver.DeleteEndpoint(n.id, epid); err != nil {
706712
if _, ok := err.(types.ForbiddenError); ok {
707713
return err
@@ -913,7 +919,7 @@ func (ep *endpoint) assignAddressVersion(ipVer int, ipam ipamapi.Ipam) error {
913919
}
914920
}
915921
if progAdd != nil {
916-
return types.BadRequestErrorf("Invalid preferred address %s: It does not belong to any of this network's subnets")
922+
return types.BadRequestErrorf("Invalid preferred address %s: It does not belong to any of this network's subnets", prefAdd)
917923
}
918924
return fmt.Errorf("no available IPv%d addresses on this network's address pools: %s (%s)", ipVer, n.Name(), n.ID())
919925
}
@@ -956,7 +962,7 @@ func (c *controller) cleanupLocalEndpoints() {
956962
}
957963

958964
for _, ep := range epl {
959-
if err := ep.Delete(false); err != nil {
965+
if err := ep.Delete(true); err != nil {
960966
log.Warnf("Could not delete local endpoint %s during endpoint cleanup: %v", ep.name, err)
961967
}
962968
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ func (ep *endpoint) DriverInfo() (map[string]interface{}, error) {
188188
return nil, fmt.Errorf("could not find network in store for driver info: %v", err)
189189
}
190190

191-
driver, err := n.driver()
191+
driver, err := n.driver(true)
192192
if err != nil {
193193
return nil, fmt.Errorf("failed to get driver info: %v", err)
194194
}

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

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ type network struct {
149149
name string
150150
networkType string
151151
id string
152+
scope string
152153
ipamType string
153154
ipamOptions map[string]string
154155
addrSpace string
@@ -246,6 +247,7 @@ func (n *network) New() datastore.KVObject {
246247
return &network{
247248
ctrlr: n.ctrlr,
248249
drvOnce: &sync.Once{},
250+
scope: n.scope,
249251
}
250252
}
251253

@@ -295,6 +297,7 @@ func (n *network) CopyTo(o datastore.KVObject) error {
295297
dstN.name = n.name
296298
dstN.id = n.id
297299
dstN.networkType = n.networkType
300+
dstN.scope = n.scope
298301
dstN.ipamType = n.ipamType
299302
dstN.enableIPv6 = n.enableIPv6
300303
dstN.persist = n.persist
@@ -337,7 +340,7 @@ func (n *network) CopyTo(o datastore.KVObject) error {
337340
}
338341

339342
func (n *network) DataScope() string {
340-
return n.driverScope()
343+
return n.Scope()
341344
}
342345

343346
func (n *network) getEpCnt() *endpointCnt {
@@ -353,6 +356,7 @@ func (n *network) MarshalJSON() ([]byte, error) {
353356
netMap["name"] = n.name
354357
netMap["id"] = n.id
355358
netMap["networkType"] = n.networkType
359+
netMap["scope"] = n.scope
356360
netMap["ipamType"] = n.ipamType
357361
netMap["addrSpace"] = n.addrSpace
358362
netMap["enableIPv6"] = n.enableIPv6
@@ -456,6 +460,9 @@ func (n *network) UnmarshalJSON(b []byte) (err error) {
456460
if v, ok := netMap["internal"]; ok {
457461
n.internal = v.(bool)
458462
}
463+
if s, ok := netMap["scope"]; ok {
464+
n.scope = s.(string)
465+
}
459466
return nil
460467
}
461468

@@ -566,22 +573,28 @@ func (n *network) driverScope() string {
566573
return dd.capability.DataScope
567574
}
568575

569-
func (n *network) driver() (driverapi.Driver, error) {
576+
func (n *network) driver(load bool) (driverapi.Driver, error) {
570577
c := n.getController()
571578

572579
c.Lock()
573580
// Check if a driver for the specified network type is available
574581
dd, ok := c.drivers[n.networkType]
575582
c.Unlock()
576583

577-
if !ok {
584+
if !ok && load {
578585
var err error
579586
dd, err = c.loadDriver(n.networkType)
580587
if err != nil {
581588
return nil, err
582589
}
590+
} else if !ok {
591+
// dont fail if driver loading is not required
592+
return nil, nil
583593
}
584594

595+
n.Lock()
596+
n.scope = dd.capability.DataScope
597+
n.Unlock()
585598
return dd.driver, nil
586599
}
587600

@@ -631,7 +644,7 @@ func (n *network) Delete() error {
631644
}
632645

633646
func (n *network) deleteNetwork() error {
634-
d, err := n.driver()
647+
d, err := n.driver(true)
635648
if err != nil {
636649
return fmt.Errorf("failed deleting network: %v", err)
637650
}
@@ -651,7 +664,7 @@ func (n *network) deleteNetwork() error {
651664
}
652665

653666
func (n *network) addEndpoint(ep *endpoint) error {
654-
d, err := n.driver()
667+
d, err := n.driver(true)
655668
if err != nil {
656669
return fmt.Errorf("failed to add endpoint: %v", err)
657670
}
@@ -725,7 +738,7 @@ func (n *network) CreateEndpoint(name string, options ...EndpointOption) (Endpoi
725738
}
726739
defer func() {
727740
if err != nil {
728-
if e := ep.deleteEndpoint(); e != nil {
741+
if e := ep.deleteEndpoint(false); e != nil {
729742
log.Warnf("cleaning up endpoint failed %s : %v", name, e)
730743
}
731744
}
@@ -1169,7 +1182,9 @@ func (n *network) DriverOptions() map[string]string {
11691182
}
11701183

11711184
func (n *network) Scope() string {
1172-
return n.driverScope()
1185+
n.Lock()
1186+
defer n.Unlock()
1187+
return n.scope
11731188
}
11741189

11751190
func (n *network) IpamConfig() (string, map[string]string, []*IpamConf, []*IpamConf) {

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,10 @@ func (sb *sandbox) Statistics() (map[string]*types.InterfaceStatistics, error) {
160160
}
161161

162162
func (sb *sandbox) Delete() error {
163+
return sb.delete(false)
164+
}
165+
166+
func (sb *sandbox) delete(force bool) error {
163167
sb.Lock()
164168
if sb.inDelete {
165169
sb.Unlock()
@@ -194,11 +198,13 @@ func (sb *sandbox) Delete() error {
194198
continue
195199
}
196200

197-
if err := ep.Leave(sb); err != nil {
198-
log.Warnf("Failed detaching sandbox %s from endpoint %s: %v\n", sb.ID(), ep.ID(), err)
201+
if !force {
202+
if err := ep.Leave(sb); err != nil {
203+
log.Warnf("Failed detaching sandbox %s from endpoint %s: %v\n", sb.ID(), ep.ID(), err)
204+
}
199205
}
200206

201-
if err := ep.Delete(false); err != nil {
207+
if err := ep.Delete(force); err != nil {
202208
log.Warnf("Failed deleting endpoint %s: %v\n", ep.ID(), err)
203209
}
204210
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ func (c *controller) sandboxCleanup() {
226226
heap.Push(&sb.endpoints, ep)
227227
}
228228

229-
if err := sb.Delete(); err != nil {
229+
if err := sb.delete(true); err != nil {
230230
logrus.Errorf("failed to delete sandbox %s while trying to cleanup: %v", sb.id, err)
231231
}
232232
}

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

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ func (c *controller) getNetworkFromStore(nid string) (*network, error) {
7575
}
7676

7777
n.epCnt = ec
78+
n.scope = store.Scope()
7879
return n, nil
7980
}
8081

@@ -107,6 +108,7 @@ func (c *controller) getNetworksForScope(scope string) ([]*network, error) {
107108
}
108109

109110
n.epCnt = ec
111+
n.scope = scope
110112
nl = append(nl, n)
111113
}
112114

@@ -140,6 +142,7 @@ func (c *controller) getNetworksFromStore() ([]*network, error) {
140142
}
141143

142144
n.epCnt = ec
145+
n.scope = store.Scope()
143146
nl = append(nl, n)
144147
}
145148
}
@@ -148,17 +151,21 @@ func (c *controller) getNetworksFromStore() ([]*network, error) {
148151
}
149152

150153
func (n *network) getEndpointFromStore(eid string) (*endpoint, error) {
151-
store := n.ctrlr.getStore(n.Scope())
152-
if store == nil {
153-
return nil, fmt.Errorf("could not find endpoint %s: datastore not found for scope %s", eid, n.Scope())
154-
}
155-
156-
ep := &endpoint{id: eid, network: n}
157-
err := store.GetObject(datastore.Key(ep.Key()...), ep)
158-
if err != nil {
159-
return nil, fmt.Errorf("could not find endpoint %s: %v", eid, err)
154+
var errors []string
155+
for _, store := range n.ctrlr.getStores() {
156+
ep := &endpoint{id: eid, network: n}
157+
err := store.GetObject(datastore.Key(ep.Key()...), ep)
158+
// Continue searching in the next store if the key is not found in this store
159+
if err != nil {
160+
if err != datastore.ErrKeyNotFound {
161+
errors = append(errors, fmt.Sprintf("{%s:%v}, ", store.Scope(), err))
162+
log.Debugf("could not find endpoint %s in %s: %v", eid, store.Scope(), err)
163+
}
164+
continue
165+
}
166+
return ep, nil
160167
}
161-
return ep, nil
168+
return nil, fmt.Errorf("could not find endpoint %s: %v", eid, errors)
162169
}
163170

164171
func (n *network) getEndpointsFromStore() ([]*endpoint, error) {

0 commit comments

Comments
 (0)