Skip to content

Commit

Permalink
Handle concurrent creation of default GW network
Browse files Browse the repository at this point in the history
- Code is not protected against concurrent joins of overlay network

Signed-off-by: Alessandro Boch <aboch@docker.com>
  • Loading branch information
aboch committed Jan 26, 2016
1 parent 2eaae2c commit 754a2cd
Showing 1 changed file with 20 additions and 5 deletions.
25 changes: 20 additions & 5 deletions default_gateway.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ const (
gwEPlen = 12
)

var procGwNetwork = make(chan (bool), 1)

/*
libnetwork creates a bridge network "docker_gw_bridge" for provding
default gateway for the containers if none of the container's endpoints
Expand All @@ -35,13 +37,11 @@ func (sb *sandbox) setupDefaultGW(srcEp *endpoint) error {
return nil
}

// Look for default gw network. In case of error (includes not found),
// retry and create it if needed in a serialized execution.
n, err := c.NetworkByName(libnGWNetwork)
if err != nil {
if _, ok := err.(types.NotFoundError); !ok {
return err
}
n, err = c.createGWNetwork()
if err != nil {
if n, err = c.defaultGwNetwork(); err != nil {
return err
}
}
Expand Down Expand Up @@ -150,3 +150,18 @@ func (sb *sandbox) getEPwithoutGateway() *endpoint {
}
return nil
}

// Looks for the default gw network and creates it if not there.
// Parallel executions are serialized.
func (c *controller) defaultGwNetwork() (Network, error) {
procGwNetwork <- true
defer func() { <-procGwNetwork }()

n, err := c.NetworkByName(libnGWNetwork)
if err != nil {
if _, ok := err.(types.NotFoundError); ok {
n, err = c.createGWNetwork()
}
}
return n, err
}

0 comments on commit 754a2cd

Please sign in to comment.