diff options
author | Matthew Heon <matthew.heon@gmail.com> | 2018-07-23 16:30:23 -0400 |
---|---|---|
committer | Atomic Bot <atomic-devel@projectatomic.io> | 2018-07-24 02:25:11 +0000 |
commit | 3c5ce9b8bfabc737822861583ede4807f245d7ab (patch) | |
tree | 0375ea08b7bf397ba7037201891744711dcf8dd7 | |
parent | 9a18681ba62d1a297809c243607a7b3763131c36 (diff) | |
download | podman-3c5ce9b8bfabc737822861583ede4807f245d7ab.tar.gz podman-3c5ce9b8bfabc737822861583ede4807f245d7ab.tar.bz2 podman-3c5ce9b8bfabc737822861583ede4807f245d7ab.zip |
Update container Mounted() and Mountpoint() functions
Addresses a regression in `podman mount` due to our mount changes
to allow concurrency by letting c/storage handle mounting and
unmounting.
Combine Mounted() and Mountpoint() into one function and query
c/storage directly to ensure we get accurate information.
Fixes: #1143
Signed-off-by: Matthew Heon <matthew.heon@gmail.com>
Closes: #1144
Approved by: baude
-rw-r--r-- | cmd/podman/mount.go | 6 | ||||
-rw-r--r-- | libpod/container.go | 38 | ||||
-rw-r--r-- | libpod/storage.go | 16 |
3 files changed, 42 insertions, 18 deletions
diff --git a/cmd/podman/mount.go b/cmd/podman/mount.go index b053ef1e8..df1bacc5f 100644 --- a/cmd/podman/mount.go +++ b/cmd/podman/mount.go @@ -105,13 +105,15 @@ func mountCmd(c *cli.Context) error { return errors.Wrapf(err2, "error reading list of all containers") } for _, container := range containers { - mountPoint, err := container.Mountpoint() + mounted, mountPoint, err := container.Mounted() if err != nil { return errors.Wrapf(err, "error getting mountpoint for %q", container.ID()) } - if mountPoint == "" { + + if !mounted { continue } + if json { jsonMountPoints = append(jsonMountPoints, jsonMountPoint{ID: container.ID(), Names: []string{container.Name()}, MountPoint: mountPoint}) continue diff --git a/libpod/container.go b/libpod/container.go index 38f07bd5b..b4a1eeb12 100644 --- a/libpod/container.go +++ b/libpod/container.go @@ -617,31 +617,37 @@ func (c *Container) State() (ContainerStatus, error) { return c.state.State, nil } -// Mounted returns a bool as to if the container's storage -// is mounted -func (c *Container) Mounted() (bool, error) { +// Mounted returns whether the container is mounted and the path it is mounted +// at (if it is mounted). +// If the container is not mounted, no error is returned, and the mountpoint +// will be set to "". +func (c *Container) Mounted() (bool, string, error) { if !c.batched { c.lock.Lock() defer c.lock.Unlock() if err := c.syncContainer(); err != nil { - return false, errors.Wrapf(err, "error updating container %s state", c.ID()) + return false, "", errors.Wrapf(err, "error updating container %s state", c.ID()) } } - return c.state.Mounted, nil -} + // We cannot directly return c.state.Mountpoint as it is not guaranteed + // to be set if the container is mounted, only if the container has been + // prepared with c.prepare(). + // Instead, let's call into c/storage + mountedTimes, err := c.runtime.storageService.MountedContainerImage(c.ID()) + if err != nil { + return false, "", err + } -// Mountpoint returns the path to the container's mounted storage as a string -// If the container is not mounted, no error is returned, but the mountpoint -// will be "" -func (c *Container) Mountpoint() (string, error) { - if !c.batched { - c.lock.Lock() - defer c.lock.Unlock() - if err := c.syncContainer(); err != nil { - return "", errors.Wrapf(err, "error updating container %s state", c.ID()) + if mountedTimes > 0 { + mountPoint, err := c.runtime.storageService.GetMountpoint(c.ID()) + if err != nil { + return false, "", err } + + return true, mountPoint, nil } - return c.state.Mountpoint, nil + + return false, "", nil } // StartedTime is the time the container was started diff --git a/libpod/storage.go b/libpod/storage.go index 76aa9efa4..9c5fc858e 100644 --- a/libpod/storage.go +++ b/libpod/storage.go @@ -263,6 +263,22 @@ func (r *storageService) MountedContainerImage(idOrName string) (int, error) { return mounted, nil } +func (r *storageService) GetMountpoint(id string) (string, error) { + container, err := r.store.Container(id) + if err != nil { + if errors.Cause(err) == storage.ErrContainerUnknown { + return "", ErrNoSuchCtr + } + return "", err + } + layer, err := r.store.Layer(container.LayerID) + if err != nil { + return "", err + } + + return layer.MountPoint, nil +} + func (r *storageService) GetWorkDir(id string) (string, error) { container, err := r.store.Container(id) if err != nil { |