diff --git a/libnetwork/drivers/overlay/joinleave.go b/libnetwork/drivers/overlay/joinleave.go index 4d0ae1592e..3e9760234b 100644 --- a/libnetwork/drivers/overlay/joinleave.go +++ b/libnetwork/drivers/overlay/joinleave.go @@ -46,7 +46,7 @@ func (d *driver) Join(nid, eid string, sboxKey string, jinfo driverapi.JoinInfo, return fmt.Errorf("could not find subnet for endpoint %s", eid) } - if err := n.joinSandbox(s, false, true); err != nil { + if err := n.joinSandbox(s, true); err != nil { return fmt.Errorf("network sandbox join failed: %v", err) } diff --git a/libnetwork/drivers/overlay/ov_network.go b/libnetwork/drivers/overlay/ov_network.go index 4fe1401791..aecdc7349a 100644 --- a/libnetwork/drivers/overlay/ov_network.go +++ b/libnetwork/drivers/overlay/ov_network.go @@ -244,16 +244,15 @@ func (d *driver) RevokeExternalConnectivity(nid, eid string) error { return nil } -func (n *network) joinSandbox(s *subnet, restore bool, incJoinCount bool) error { +func (n *network) joinSandbox(s *subnet, incJoinCount bool) error { // If there is a race between two go routines here only one will win // the other will wait. networkOnce.Do(networkOnceInit) n.Lock() - // If non-restore initialization occurred and was successful then - // tell the peerDB to initialize the sandbox with all the peers - // previously received from networkdb. But only do this after - // unlocking the network. Otherwise we could deadlock with + // If initialization was successful then tell the peerDB to initialize the + // sandbox with all the peers previously received from networkdb. But only + // do this after unlocking the network. Otherwise we could deadlock with // on the peerDB channel while peerDB is waiting for the network lock. var doInitPeerDB bool defer func() { @@ -264,8 +263,8 @@ func (n *network) joinSandbox(s *subnet, restore bool, incJoinCount bool) error }() if !n.sboxInit { - n.initErr = n.initSandbox(restore) - doInitPeerDB = n.initErr == nil && !restore + n.initErr = n.initSandbox() + doInitPeerDB = n.initErr == nil // If there was an error, we cannot recover it n.sboxInit = true } @@ -276,9 +275,9 @@ func (n *network) joinSandbox(s *subnet, restore bool, incJoinCount bool) error subnetErr := s.initErr if !s.sboxInit { - subnetErr = n.initSubnetSandbox(s, restore) - // We can recover from these errors, but not on restore - if restore || subnetErr == nil { + subnetErr = n.initSubnetSandbox(s) + // We can recover from these errors + if subnetErr == nil { s.initErr = subnetErr s.sboxInit = true } @@ -472,26 +471,6 @@ func checkOverlap(nw *net.IPNet) error { return nil } -func (n *network) restoreSubnetSandbox(s *subnet, brName, vxlanName string) error { - // restore overlay osl sandbox - ifaces := map[string][]osl.IfaceOption{ - brName + "+br": { - n.sbox.InterfaceOptions().Address(s.gwIP), - n.sbox.InterfaceOptions().Bridge(true), - }, - } - if err := n.sbox.Restore(ifaces, nil, nil, nil); err != nil { - return err - } - - ifaces = map[string][]osl.IfaceOption{ - vxlanName + "+vxlan": { - n.sbox.InterfaceOptions().Master(brName), - }, - } - return n.sbox.Restore(ifaces, nil, nil, nil) -} - func (n *network) setupSubnetSandbox(s *subnet, brName, vxlanName string) error { if hostMode { // Try to delete stale bridge interface if it exists @@ -628,7 +607,7 @@ func setDefaultVLAN(sbox osl.Sandbox) error { } // Must be called with the network lock -func (n *network) initSubnetSandbox(s *subnet, restore bool) error { +func (n *network) initSubnetSandbox(s *subnet) error { brName := n.generateBridgeName(s) vxlanName := n.generateVxlanName(s) @@ -644,14 +623,8 @@ func (n *network) initSubnetSandbox(s *subnet, restore bool) error { } } - if restore { - if err := n.restoreSubnetSandbox(s, brName, vxlanName); err != nil { - return err - } - } else { - if err := n.setupSubnetSandbox(s, brName, vxlanName); err != nil { - return err - } + if err := n.setupSubnetSandbox(s, brName, vxlanName); err != nil { + return err } s.vxlanName = vxlanName @@ -695,34 +668,23 @@ func (n *network) cleanupStaleSandboxes() { }) } -func (n *network) initSandbox(restore bool) error { +func (n *network) initSandbox() error { n.initEpoch++ - if !restore { - if hostMode { - if err := addNetworkChain(n.id[:12]); err != nil { - return err - } + if hostMode { + if err := addNetworkChain(n.id[:12]); err != nil { + return err } - - // If there are any stale sandboxes related to this network - // from previous daemon life clean it up here - n.cleanupStaleSandboxes() } - // In the restore case network sandbox already exist; but we don't know - // what epoch number it was created with. It has to be retrieved by - // searching the net namespaces. - var key string - if restore { - key = osl.GenerateKey("-" + n.id) - } else { - key = osl.GenerateKey(fmt.Sprintf("%d-", n.initEpoch) + n.id) - } + // If there are any stale sandboxes related to this network + // from previous daemon life clean it up here + n.cleanupStaleSandboxes() - sbox, err := osl.NewSandbox(key, !hostMode, restore) + key := osl.GenerateKey(fmt.Sprintf("%d-", n.initEpoch) + n.id) + sbox, err := osl.NewSandbox(key, !hostMode, false) if err != nil { - return fmt.Errorf("could not get network sandbox (oper %t): %v", restore, err) + return fmt.Errorf("could not get network sandbox: %v", err) } // this is needed to let the peerAdd configure the sandbox diff --git a/libnetwork/drivers/overlay/overlay.go b/libnetwork/drivers/overlay/overlay.go index 5a74638998..f4f872f73f 100644 --- a/libnetwork/drivers/overlay/overlay.go +++ b/libnetwork/drivers/overlay/overlay.go @@ -7,14 +7,12 @@ package overlay import ( "fmt" - "net" "sync" "github.com/docker/docker/libnetwork/datastore" "github.com/docker/docker/libnetwork/discoverapi" "github.com/docker/docker/libnetwork/driverapi" "github.com/docker/docker/libnetwork/netlabel" - "github.com/docker/docker/libnetwork/osl" "github.com/docker/docker/libnetwork/types" "github.com/sirupsen/logrus" ) @@ -69,65 +67,9 @@ func Register(r driverapi.Registerer, config map[string]interface{}) error { } } - if err := d.restoreEndpoints(); err != nil { - logrus.Warnf("Failure during overlay endpoints restore: %v", err) - } - return r.RegisterDriver(networkType, d, c) } -// Endpoints are stored in the local store. Restore them and reconstruct the overlay sandbox -func (d *driver) restoreEndpoints() error { - if d.localStore == nil { - logrus.Warn("Cannot restore overlay endpoints because local datastore is missing") - return nil - } - kvol, err := d.localStore.List(datastore.Key(overlayEndpointPrefix), &endpoint{}) - if err != nil && err != datastore.ErrKeyNotFound { - return fmt.Errorf("failed to read overlay endpoint from store: %v", err) - } - - if err == datastore.ErrKeyNotFound { - return nil - } - for _, kvo := range kvol { - ep := kvo.(*endpoint) - n := d.network(ep.nid) - if n == nil { - logrus.Debugf("Network (%.7s) not found for restored endpoint (%.7s)", ep.nid, ep.id) - logrus.Debugf("Deleting stale overlay endpoint (%.7s) from store", ep.id) - if err := d.deleteEndpointFromStore(ep); err != nil { - logrus.Debugf("Failed to delete stale overlay endpoint (%.7s) from store", ep.id) - } - continue - } - n.addEndpoint(ep) - - s := n.getSubnetforIP(ep.addr) - if s == nil { - return fmt.Errorf("could not find subnet for endpoint %s", ep.id) - } - - if err := n.joinSandbox(s, true, true); err != nil { - return fmt.Errorf("restore network sandbox failed: %v", err) - } - - Ifaces := make(map[string][]osl.IfaceOption) - vethIfaceOption := make([]osl.IfaceOption, 1) - vethIfaceOption = append(vethIfaceOption, n.sbox.InterfaceOptions().Master(s.brName)) - Ifaces["veth+veth"] = vethIfaceOption - - err := n.sbox.Restore(Ifaces, nil, nil, nil) - if err != nil { - n.leaveSandbox() - return fmt.Errorf("failed to restore overlay sandbox: %v", err) - } - - d.peerAdd(ep.nid, ep.id, ep.addr.IP, ep.addr.Mask, ep.mac, net.ParseIP(d.advertiseAddress), false, false, true) - } - return nil -} - func (d *driver) configure() error { // Apply OS specific kernel configs if needed d.initOS.Do(applyOStweaks) diff --git a/libnetwork/drivers/overlay/peerdb.go b/libnetwork/drivers/overlay/peerdb.go index 8b1e890ae3..af85f406fc 100644 --- a/libnetwork/drivers/overlay/peerdb.go +++ b/libnetwork/drivers/overlay/peerdb.go @@ -315,7 +315,7 @@ func (d *driver) peerAddOp(nid, eid string, peerIP net.IP, peerIPMask net.IPMask return fmt.Errorf("couldn't find the subnet %q in network %q", IP.String(), n.id) } - if err := n.joinSandbox(s, false, false); err != nil { + if err := n.joinSandbox(s, false); err != nil { return fmt.Errorf("subnet sandbox join failed for %q: %v", s.subnetIP.String(), err) }