瀏覽代碼

Merge pull request #728 from mrjana/bugs

Fix race in os sandbox sharing
Madhu Venugopal 9 年之前
父節點
當前提交
e557f4a67d
共有 2 個文件被更改,包括 17 次插入9 次删除
  1. 16 8
      libnetwork/controller.go
  2. 1 1
      libnetwork/sandbox.go

+ 16 - 8
libnetwork/controller.go

@@ -144,6 +144,8 @@ type controller struct {
 	unWatchCh      chan *endpoint
 	unWatchCh      chan *endpoint
 	svcDb          map[string]svcMap
 	svcDb          map[string]svcMap
 	nmap           map[string]*netWatch
 	nmap           map[string]*netWatch
+	defOsSbox      osl.Sandbox
+	sboxOnce       sync.Once
 	sync.Mutex
 	sync.Mutex
 }
 }
 
 
@@ -492,12 +494,6 @@ func (c *controller) NewSandbox(containerID string, options ...SandboxOption) (S
 		config:      containerConfig{},
 		config:      containerConfig{},
 		controller:  c,
 		controller:  c,
 	}
 	}
-	// This sandbox may be using an existing osl sandbox, sharing it with another sandbox
-	var peerSb Sandbox
-	c.WalkSandboxes(SandboxKeyWalker(&peerSb, sb.Key()))
-	if peerSb != nil {
-		sb.osSbox = peerSb.(*sandbox).osSbox
-	}
 
 
 	heap.Init(&sb.endpoints)
 	heap.Init(&sb.endpoints)
 
 
@@ -507,14 +503,26 @@ func (c *controller) NewSandbox(containerID string, options ...SandboxOption) (S
 		return nil, err
 		return nil, err
 	}
 	}
 
 
-	c.Lock()
+	if sb.config.useDefaultSandBox {
+		c.sboxOnce.Do(func() {
+			c.defOsSbox, err = osl.NewSandbox(sb.Key(), false)
+		})
+
+		if err != nil {
+			c.sboxOnce = sync.Once{}
+			return nil, fmt.Errorf("failed to create default sandbox: %v", err)
+		}
+
+		sb.osSbox = c.defOsSbox
+	}
+
 	if sb.osSbox == nil && !sb.config.useExternalKey {
 	if sb.osSbox == nil && !sb.config.useExternalKey {
 		if sb.osSbox, err = osl.NewSandbox(sb.Key(), !sb.config.useDefaultSandBox); err != nil {
 		if sb.osSbox, err = osl.NewSandbox(sb.Key(), !sb.config.useDefaultSandBox); err != nil {
-			c.Unlock()
 			return nil, fmt.Errorf("failed to create new osl sandbox: %v", err)
 			return nil, fmt.Errorf("failed to create new osl sandbox: %v", err)
 		}
 		}
 	}
 	}
 
 
+	c.Lock()
 	c.sandboxes[sb.id] = sb
 	c.sandboxes[sb.id] = sb
 	c.Unlock()
 	c.Unlock()
 	defer func() {
 	defer func() {

+ 1 - 1
libnetwork/sandbox.go

@@ -197,7 +197,7 @@ func (sb *sandbox) Delete() error {
 	// likely not required any more. Drop it.
 	// likely not required any more. Drop it.
 	etchosts.Drop(sb.config.hostsPath)
 	etchosts.Drop(sb.config.hostsPath)
 
 
-	if sb.osSbox != nil {
+	if sb.osSbox != nil && !sb.config.useDefaultSandBox {
 		sb.osSbox.Destroy()
 		sb.osSbox.Destroy()
 	}
 	}