From 3c5ce9b8bfabc737822861583ede4807f245d7ab Mon Sep 17 00:00:00 2001 From: Matthew Heon Date: Mon, 23 Jul 2018 16:30:23 -0400 Subject: 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 Closes: #1144 Approved by: baude --- libpod/container.go | 38 ++++++++++++++++++++++---------------- libpod/storage.go | 16 ++++++++++++++++ 2 files changed, 38 insertions(+), 16 deletions(-) (limited to 'libpod') 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 { -- cgit v1.2.3-54-g00ecf