From b2e61e958ea8a5886c8033a831c7a9d227d27fd6 Mon Sep 17 00:00:00 2001 From: Arko Dasgupta Date: Tue, 7 May 2019 15:36:32 -0700 Subject: [PATCH] Correctly clean up --config-only networks The endpoint count for --config-only networks was being incremented even when the respective --config-from inherited network failed to create a network This was due to a variable shadowing problem with err causing the deferred function to not execute correctly. Using the same err variable across the entire function fixes the issue Fixes: moby/moby#35101 Signed-off-by: Arko Dasgupta (cherry picked from commit eacb56d8754b98348d890a7f2bdb90ab865e54be) Signed-off-by: Sebastiaan van Stijn --- controller.go | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/controller.go b/controller.go index ed05c0ace7..3b92b695c7 100644 --- a/controller.go +++ b/controller.go @@ -705,11 +705,17 @@ const overlayDSROptionString = "dsr" // NewNetwork creates a new network of the specified network type. The options // are network specific and modeled in a generic way. func (c *controller) NewNetwork(networkType, name string, id string, options ...NetworkOption) (Network, error) { + var ( + cap *driverapi.Capability + err error + t *network + ) + if id != "" { c.networkLocker.Lock(id) defer c.networkLocker.Unlock(id) - if _, err := c.NetworkByID(id); err == nil { + if _, err = c.NetworkByID(id); err == nil { return nil, NetworkNameError(id) } } @@ -738,15 +744,10 @@ func (c *controller) NewNetwork(networkType, name string, id string, options ... } network.processOptions(options...) - if err := network.validateConfiguration(); err != nil { + if err = network.validateConfiguration(); err != nil { return nil, err } - var ( - cap *driverapi.Capability - err error - ) - // Reset network types, force local scope and skip allocation and // plumbing for configuration networks. Reset of the config-only // network drivers is needed so that this special network is not @@ -793,11 +794,11 @@ func (c *controller) NewNetwork(networkType, name string, id string, options ... // From this point on, we need the network specific configuration, // which may come from a configuration-only network if network.configFrom != "" { - t, err := c.getConfigNetwork(network.configFrom) + t, err = c.getConfigNetwork(network.configFrom) if err != nil { return nil, types.NotFoundErrorf("configuration network %q does not exist", network.configFrom) } - if err := t.applyConfigurationTo(network); err != nil { + if err = t.applyConfigurationTo(network); err != nil { return nil, types.InternalErrorf("Failed to apply configuration: %v", err) } defer func() {