Selaa lähdekoodia

Merge pull request #877 from sanimej/restart

Setup embedded DNS server correctly on container restart
Madhu Venugopal 9 vuotta sitten
vanhempi
commit
ef508a21ed
3 muutettua tiedostoa jossa 21 lisäystä ja 5 poistoa
  1. 3 0
      libnetwork/CHANGELOG.md
  2. 4 1
      libnetwork/resolver.go
  3. 14 4
      libnetwork/sandbox.go

+ 3 - 0
libnetwork/CHANGELOG.md

@@ -1,5 +1,8 @@
 # Changelog
 # Changelog
 
 
+## 0.5.6 (2016-01-14)
+- Setup embedded DNS server correctly on container restart. Fixes docker/docker#19354
+
 ## 0.5.5 (2016-01-14)
 ## 0.5.5 (2016-01-14)
 - Allow network-scoped alias to be resolved for anonymous endpoint
 - Allow network-scoped alias to be resolved for anonymous endpoint
 - Self repair corrupted IP database that could happen in 1.9.0 & 1.9.1
 - Self repair corrupted IP database that could happen in 1.9.0 & 1.9.1

+ 4 - 1
libnetwork/resolver.go

@@ -15,7 +15,8 @@ import (
 type Resolver interface {
 type Resolver interface {
 	// Start starts the name server for the container
 	// Start starts the name server for the container
 	Start() error
 	Start() error
-	// Stop stops the name server for the container
+	// Stop stops the name server for the container. Stopped resolver
+	// can be reused after running the SetupFunc again.
 	Stop()
 	Stop()
 	// SetupFunc() provides the setup function that should be run
 	// SetupFunc() provides the setup function that should be run
 	// in the container's network namespace.
 	// in the container's network namespace.
@@ -102,6 +103,8 @@ func (r *resolver) Stop() {
 	if r.server != nil {
 	if r.server != nil {
 		r.server.Shutdown()
 		r.server.Shutdown()
 	}
 	}
+	r.conn = nil
+	r.err = fmt.Errorf("setup not done yet")
 }
 }
 
 
 func (r *resolver) SetExtServers(dns []string) {
 func (r *resolver) SetExtServers(dns []string) {

+ 14 - 4
libnetwork/sandbox.go

@@ -488,23 +488,22 @@ func (sb *sandbox) resolveName(req string, networkName string, epList []*endpoin
 }
 }
 
 
 func (sb *sandbox) SetKey(basePath string) error {
 func (sb *sandbox) SetKey(basePath string) error {
-	var err error
 	if basePath == "" {
 	if basePath == "" {
 		return types.BadRequestErrorf("invalid sandbox key")
 		return types.BadRequestErrorf("invalid sandbox key")
 	}
 	}
 
 
 	sb.Lock()
 	sb.Lock()
-	osSbox := sb.osSbox
+	oldosSbox := sb.osSbox
 	sb.Unlock()
 	sb.Unlock()
 
 
-	if osSbox != nil {
+	if oldosSbox != nil {
 		// If we already have an OS sandbox, release the network resources from that
 		// If we already have an OS sandbox, release the network resources from that
 		// and destroy the OS snab. We are moving into a new home further down. Note that none
 		// and destroy the OS snab. We are moving into a new home further down. Note that none
 		// of the network resources gets destroyed during the move.
 		// of the network resources gets destroyed during the move.
 		sb.releaseOSSbox()
 		sb.releaseOSSbox()
 	}
 	}
 
 
-	osSbox, err = osl.GetSandboxForExternalKey(basePath, sb.Key())
+	osSbox, err := osl.GetSandboxForExternalKey(basePath, sb.Key())
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
@@ -520,6 +519,17 @@ func (sb *sandbox) SetKey(basePath string) error {
 		}
 		}
 	}()
 	}()
 
 
+	// If the resolver was setup before stop it and set it up in the
+	// new osl sandbox.
+	if oldosSbox != nil && sb.resolver != nil {
+		sb.resolver.Stop()
+
+		sb.osSbox.InvokeFunc(sb.resolver.SetupFunc())
+		if err := sb.resolver.Start(); err != nil {
+			log.Errorf("Resolver Setup/Start failed for container %s, %q", sb.ContainerID(), err)
+		}
+	}
+
 	for _, ep := range sb.getConnectedEndpoints() {
 	for _, ep := range sb.getConnectedEndpoints() {
 		if err = sb.populateNetworkResources(ep); err != nil {
 		if err = sb.populateNetworkResources(ep); err != nil {
 			return err
 			return err