Переглянути джерело

Merge pull request #111 from aboch/lk

In bridge.go: Join(), Leave(), getnetwork() are not thread safe
Madhu Venugopal 10 роки тому
батько
коміт
1402220ec3
1 змінених файлів з 18 додано та 8 видалено
  1. 18 8
      libnetwork/drivers/bridge/bridge.go

+ 18 - 8
libnetwork/drivers/bridge/bridge.go

@@ -183,6 +183,8 @@ func (d *driver) Config(option map[string]interface{}) error {
 func (d *driver) getNetwork(id types.UUID) (*bridgeNetwork, error) {
 	// Just a dummy function to return the only network managed by Bridge driver.
 	// But this API makes the caller code unchanged when we move to support multiple networks.
+	d.Lock()
+	defer d.Unlock()
 	return d.network, nil
 }
 
@@ -627,20 +629,24 @@ func (d *driver) EndpointInfo(nid, eid types.UUID) (map[string]interface{}, erro
 
 // Join method is invoked when a Sandbox is attached to an endpoint.
 func (d *driver) Join(nid, eid types.UUID, sboxKey string, options map[string]interface{}) (*driverapi.JoinInfo, error) {
-	var err error
-	if !d.config.EnableICC {
-		err = d.link(nid, eid, options, true)
+	d.Lock()
+	config := d.config
+	d.Unlock()
+	if !config.EnableICC {
+		return nil, d.link(nid, eid, options, true)
 	}
-	return nil, err
+	return nil, nil
 }
 
 // Leave method is invoked when a Sandbox detaches from an endpoint.
 func (d *driver) Leave(nid, eid types.UUID, options map[string]interface{}) error {
-	var err error
-	if !d.config.EnableICC {
-		err = d.link(nid, eid, options, false)
+	d.Lock()
+	config := d.config
+	d.Unlock()
+	if !config.EnableICC {
+		return d.link(nid, eid, options, false)
 	}
-	return err
+	return nil
 }
 
 func (d *driver) link(nid, eid types.UUID, options map[string]interface{}, enable bool) error {
@@ -684,9 +690,11 @@ func (d *driver) link(nid, eid types.UUID, options map[string]interface{}, enabl
 				return err
 			}
 
+			d.Lock()
 			l := newLink(parentEndpoint.intf.Address.IP.String(),
 				endpoint.intf.Address.IP.String(),
 				endpoint.config.ExposedPorts, d.config.BridgeName)
+			d.Unlock()
 			if enable {
 				err = l.Enable()
 				if err != nil {
@@ -716,9 +724,11 @@ func (d *driver) link(nid, eid types.UUID, options map[string]interface{}, enabl
 		if childEndpoint.config == nil || childEndpoint.config.ExposedPorts == nil {
 			continue
 		}
+		d.Lock()
 		l := newLink(endpoint.intf.Address.IP.String(),
 			childEndpoint.intf.Address.IP.String(),
 			childEndpoint.config.ExposedPorts, d.config.BridgeName)
+		d.Unlock()
 		if enable {
 			err = l.Enable()
 			if err != nil {