From 8678b0dd0d85f42eb09d51a5b41de39d91ae9f35 Mon Sep 17 00:00:00 2001 From: David Calavera Date: Tue, 3 Nov 2015 11:42:08 -0500 Subject: [PATCH] Decouple daemon and container to manage volumes. Signed-off-by: David Calavera Upstream-commit: 2c72015ce3b78b45e33529368fb1c5a724415d87 Component: engine --- components/engine/daemon/container.go | 40 ----------------------- components/engine/daemon/create.go | 2 +- components/engine/daemon/daemon.go | 2 +- components/engine/daemon/delete.go | 2 +- components/engine/daemon/mounts.go | 46 +++++++++++++++++++++++++++ 5 files changed, 49 insertions(+), 43 deletions(-) create mode 100644 components/engine/daemon/mounts.go diff --git a/components/engine/daemon/container.go b/components/engine/daemon/container.go index e9c14c964e..9955b2123b 100644 --- a/components/engine/daemon/container.go +++ b/components/engine/daemon/container.go @@ -7,7 +7,6 @@ import ( "io" "os" "path/filepath" - "strings" "sync" "syscall" "time" @@ -31,7 +30,6 @@ import ( "github.com/docker/docker/pkg/system" "github.com/docker/docker/runconfig" "github.com/docker/docker/volume" - "github.com/docker/docker/volume/store" ) var ( @@ -667,44 +665,6 @@ func (container *Container) mountVolumes() error { return nil } -func (container *Container) prepareMountPoints() error { - for _, config := range container.MountPoints { - if len(config.Driver) > 0 { - v, err := container.daemon.createVolume(config.Name, config.Driver, nil) - if err != nil { - return err - } - config.Volume = v - } - } - return nil -} - -func (container *Container) removeMountPoints(rm bool) error { - var rmErrors []string - for _, m := range container.MountPoints { - if m.Volume == nil { - continue - } - container.daemon.volumes.Decrement(m.Volume) - if rm { - err := container.daemon.volumes.Remove(m.Volume) - // ErrVolumeInUse is ignored because having this - // volume being referenced by other container is - // not an error, but an implementation detail. - // This prevents docker from logging "ERROR: Volume in use" - // where there is another container using the volume. - if err != nil && err != store.ErrVolumeInUse { - rmErrors = append(rmErrors, err.Error()) - } - } - } - if len(rmErrors) > 0 { - return derr.ErrorCodeRemovingVolume.WithArgs(strings.Join(rmErrors, "\n")) - } - return nil -} - func (container *Container) unmountVolumes(forceSyscall bool) error { var ( volumeMounts []volume.MountPoint diff --git a/components/engine/daemon/create.go b/components/engine/daemon/create.go index 584d452f71..75fa775c53 100644 --- a/components/engine/daemon/create.go +++ b/components/engine/daemon/create.go @@ -109,7 +109,7 @@ func (daemon *Daemon) create(params *ContainerCreateConfig) (retC *Container, re } defer func() { if retErr != nil { - if err := container.removeMountPoints(true); err != nil { + if err := daemon.removeMountPoints(container, true); err != nil { logrus.Error(err) } } diff --git a/components/engine/daemon/daemon.go b/components/engine/daemon/daemon.go index 78e06d74da..3f17027095 100644 --- a/components/engine/daemon/daemon.go +++ b/components/engine/daemon/daemon.go @@ -246,7 +246,7 @@ func (daemon *Daemon) Register(container *Container) error { return err } - if err := container.prepareMountPoints(); err != nil { + if err := daemon.prepareMountPoints(container); err != nil { return err } diff --git a/components/engine/daemon/delete.go b/components/engine/daemon/delete.go index a2e7e5fa82..bf751ec2da 100644 --- a/components/engine/daemon/delete.go +++ b/components/engine/daemon/delete.go @@ -58,7 +58,7 @@ func (daemon *Daemon) ContainerRm(name string, config *ContainerRmConfig) error return err } - if err := container.removeMountPoints(config.RemoveVolume); err != nil { + if err := daemon.removeMountPoints(container, config.RemoveVolume); err != nil { logrus.Error(err) } diff --git a/components/engine/daemon/mounts.go b/components/engine/daemon/mounts.go new file mode 100644 index 0000000000..91d5c0953c --- /dev/null +++ b/components/engine/daemon/mounts.go @@ -0,0 +1,46 @@ +package daemon + +import ( + "strings" + + derr "github.com/docker/docker/errors" + "github.com/docker/docker/volume/store" +) + +func (daemon *Daemon) prepareMountPoints(container *Container) error { + for _, config := range container.MountPoints { + if len(config.Driver) > 0 { + v, err := daemon.createVolume(config.Name, config.Driver, nil) + if err != nil { + return err + } + config.Volume = v + } + } + return nil +} + +func (daemon *Daemon) removeMountPoints(container *Container, rm bool) error { + var rmErrors []string + for _, m := range container.MountPoints { + if m.Volume == nil { + continue + } + container.daemon.volumes.Decrement(m.Volume) + if rm { + err := daemon.volumes.Remove(m.Volume) + // ErrVolumeInUse is ignored because having this + // volume being referenced by other container is + // not an error, but an implementation detail. + // This prevents docker from logging "ERROR: Volume in use" + // where there is another container using the volume. + if err != nil && err != store.ErrVolumeInUse { + rmErrors = append(rmErrors, err.Error()) + } + } + } + if len(rmErrors) > 0 { + return derr.ErrorCodeRemovingVolume.WithArgs(strings.Join(rmErrors, "\n")) + } + return nil +}