mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Release the network attachment on allocation failure
- otherwise the attachment task will stay in store and consume IP addresses and there is no way to remove it. Signed-off-by: Alessandro Boch <aboch@docker.com>
This commit is contained in:
parent
30a5e20cc0
commit
9e74ea8594
2 changed files with 38 additions and 1 deletions
|
@ -1697,18 +1697,31 @@ func (c *Cluster) AttachNetwork(target string, containerID string, addresses []s
|
||||||
close(attachCompleteCh)
|
close(attachCompleteCh)
|
||||||
c.Unlock()
|
c.Unlock()
|
||||||
|
|
||||||
logrus.Debugf("Successfully attached to network %s with tid %s", target, taskID)
|
logrus.Debugf("Successfully attached to network %s with task id %s", target, taskID)
|
||||||
|
|
||||||
|
release := func() {
|
||||||
|
ctx, cancel := c.getRequestContext()
|
||||||
|
defer cancel()
|
||||||
|
if err := agent.ResourceAllocator().DetachNetwork(ctx, taskID); err != nil {
|
||||||
|
logrus.Errorf("Failed remove network attachment %s to network %s on allocation failure: %v",
|
||||||
|
taskID, target, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var config *network.NetworkingConfig
|
var config *network.NetworkingConfig
|
||||||
select {
|
select {
|
||||||
case config = <-attachWaitCh:
|
case config = <-attachWaitCh:
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
|
release()
|
||||||
return nil, fmt.Errorf("attaching to network failed, make sure your network options are correct and check manager logs: %v", ctx.Err())
|
return nil, fmt.Errorf("attaching to network failed, make sure your network options are correct and check manager logs: %v", ctx.Err())
|
||||||
}
|
}
|
||||||
|
|
||||||
c.Lock()
|
c.Lock()
|
||||||
c.attachers[aKey].config = config
|
c.attachers[aKey].config = config
|
||||||
c.Unlock()
|
c.Unlock()
|
||||||
|
|
||||||
|
logrus.Debugf("Successfully allocated resources on network %s for task id %s", target, taskID)
|
||||||
|
|
||||||
return config, nil
|
return config, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -420,6 +420,30 @@ func (s *DockerSwarmSuite) TestOverlayAttachableOnSwarmLeave(c *check.C) {
|
||||||
c.Assert(out, checker.Not(checker.Contains), nwName)
|
c.Assert(out, checker.Not(checker.Contains), nwName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *DockerSwarmSuite) TestOverlayAttachableReleaseResourcesOnFailure(c *check.C) {
|
||||||
|
d := s.AddDaemon(c, true, true)
|
||||||
|
|
||||||
|
// Create attachable network
|
||||||
|
out, err := d.Cmd("network", "create", "-d", "overlay", "--attachable", "--subnet", "10.10.9.0/24", "ovnet")
|
||||||
|
c.Assert(err, checker.IsNil, check.Commentf(out))
|
||||||
|
|
||||||
|
// Attach a container with specific IP
|
||||||
|
out, err = d.Cmd("run", "-d", "--network", "ovnet", "--name", "c1", "--ip", "10.10.9.33", "busybox", "top")
|
||||||
|
c.Assert(err, checker.IsNil, check.Commentf(out))
|
||||||
|
|
||||||
|
// Attempt to attach another contianer with same IP, must fail
|
||||||
|
_, err = d.Cmd("run", "-d", "--network", "ovnet", "--name", "c2", "--ip", "10.10.9.33", "busybox", "top")
|
||||||
|
c.Assert(err, checker.NotNil)
|
||||||
|
|
||||||
|
// Remove first container
|
||||||
|
out, err = d.Cmd("rm", "-f", "c1")
|
||||||
|
c.Assert(err, checker.IsNil, check.Commentf(out))
|
||||||
|
|
||||||
|
// Verify the network can be removed, no phantom network attachment task left over
|
||||||
|
out, err = d.Cmd("network", "rm", "ovnet")
|
||||||
|
c.Assert(err, checker.IsNil, check.Commentf(out))
|
||||||
|
}
|
||||||
|
|
||||||
func (s *DockerSwarmSuite) TestSwarmRemoveInternalNetwork(c *check.C) {
|
func (s *DockerSwarmSuite) TestSwarmRemoveInternalNetwork(c *check.C) {
|
||||||
d := s.AddDaemon(c, true, true)
|
d := s.AddDaemon(c, true, true)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue