Browse Source

Merge pull request #19500 from cpuguy83/fix_loading_with_containerized_plugins

Fix loading with containerized plugins
Tibor Vass 9 years ago
parent
commit
757d686700
3 changed files with 32 additions and 8 deletions
  1. 17 4
      daemon/daemon.go
  2. 0 1
      daemon/volumes.go
  3. 15 3
      volume/drivers/extpoint.go

+ 17 - 4
daemon/daemon.go

@@ -282,10 +282,6 @@ func (daemon *Daemon) Register(container *container.Container) error {
 		}
 	}
 
-	if err := daemon.prepareMountPoints(container); err != nil {
-		return err
-	}
-
 	return nil
 }
 
@@ -408,6 +404,23 @@ func (daemon *Daemon) restore() error {
 	}
 	group.Wait()
 
+	// any containers that were started above would already have had this done,
+	// however we need to now prepare the mountpoints for the rest of the containers as well.
+	// This shouldn't cause any issue running on the containers that already had this run.
+	// This must be run after any containers with a restart policy so that containerized plugins
+	// can have a chance to be running before we try to initialize them.
+	for _, c := range containers {
+		group.Add(1)
+		go func(c *container.Container) {
+			defer group.Done()
+			if err := daemon.prepareMountPoints(c); err != nil {
+				logrus.Error(err)
+			}
+		}(c)
+	}
+
+	group.Wait()
+
 	if !debug {
 		if logrus.GetLevel() == logrus.InfoLevel {
 			fmt.Println()

+ 0 - 1
daemon/volumes.go

@@ -159,7 +159,6 @@ func (daemon *Daemon) registerMountPoints(container *container.Container, hostCo
 func (daemon *Daemon) lazyInitializeVolume(containerID string, m *volume.MountPoint) error {
 	if len(m.Driver) > 0 && m.Volume == nil {
 		v, err := daemon.volumes.GetWithRef(m.Name, m.Driver, containerID)
-
 		if err != nil {
 			return err
 		}

+ 15 - 3
volume/drivers/extpoint.go

@@ -6,6 +6,7 @@ import (
 	"fmt"
 	"sync"
 
+	"github.com/docker/docker/pkg/locker"
 	"github.com/docker/docker/pkg/plugins"
 	"github.com/docker/docker/volume"
 )
@@ -13,7 +14,7 @@ import (
 // currently created by hand. generation tool would generate this like:
 // $ extpoint-gen Driver > volume/extpoint.go
 
-var drivers = &driverExtpoint{extensions: make(map[string]volume.Driver)}
+var drivers = &driverExtpoint{extensions: make(map[string]volume.Driver), driverLock: &locker.Locker{}}
 
 const extName = "VolumeDriver"
 
@@ -49,16 +50,19 @@ type volumeDriver interface {
 type driverExtpoint struct {
 	extensions map[string]volume.Driver
 	sync.Mutex
+	driverLock *locker.Locker
 }
 
 // Register associates the given driver to the given name, checking if
 // the name is already associated
 func Register(extension volume.Driver, name string) bool {
-	drivers.Lock()
-	defer drivers.Unlock()
 	if name == "" {
 		return false
 	}
+
+	drivers.Lock()
+	defer drivers.Unlock()
+
 	_, exists := drivers.extensions[name]
 	if exists {
 		return false
@@ -71,6 +75,7 @@ func Register(extension volume.Driver, name string) bool {
 func Unregister(name string) bool {
 	drivers.Lock()
 	defer drivers.Unlock()
+
 	_, exists := drivers.extensions[name]
 	if !exists {
 		return false
@@ -83,12 +88,16 @@ func Unregister(name string) bool {
 // driver with the given name has not been registered it checks if
 // there is a VolumeDriver plugin available with the given name.
 func Lookup(name string) (volume.Driver, error) {
+	drivers.driverLock.Lock(name)
+	defer drivers.driverLock.Unlock(name)
+
 	drivers.Lock()
 	ext, ok := drivers.extensions[name]
 	drivers.Unlock()
 	if ok {
 		return ext, nil
 	}
+
 	pl, err := plugins.Get(name, extName)
 	if err != nil {
 		return nil, fmt.Errorf("Error looking up volume plugin %s: %v", name, err)
@@ -118,9 +127,11 @@ func GetDriver(name string) (volume.Driver, error) {
 // If no driver is registered, empty string list will be returned.
 func GetDriverList() []string {
 	var driverList []string
+	drivers.Lock()
 	for driverName := range drivers.extensions {
 		driverList = append(driverList, driverName)
 	}
+	drivers.Unlock()
 	return driverList
 }
 
@@ -144,6 +155,7 @@ func GetAllDrivers() ([]volume.Driver, error) {
 		if ok {
 			continue
 		}
+
 		ext = NewVolumeDriver(p.Name, p.Client)
 		drivers.extensions[p.Name] = ext
 		ds = append(ds, ext)