summaryrefslogtreecommitdiff
path: root/libpod
diff options
context:
space:
mode:
authorMatthew Heon <mheon@redhat.com>2021-02-15 11:58:24 -0500
committerMatthew Heon <mheon@redhat.com>2021-02-16 09:21:49 -0500
commit759fc933438dead681a0c4f3d9e17826b0dc18cc (patch)
tree1953cad9d200147d202b8033de5597b8f9ca8001 /libpod
parent6639b218a28301e6e8d075cceb18c56ea62fcade (diff)
downloadpodman-759fc933438dead681a0c4f3d9e17826b0dc18cc.tar.gz
podman-759fc933438dead681a0c4f3d9e17826b0dc18cc.tar.bz2
podman-759fc933438dead681a0c4f3d9e17826b0dc18cc.zip
Fix an issue where copyup could fail with ENOENT
This one is rather bizarre because it triggers only on some systems. I've included a CI test, for example, but I'm 99% sure we use images in CI that have volumes over empty directories, and the earlier patch to change copy-up implementation passed CI without complaint. I can reproduce this on a stock F33 VM, but that's the only place I have been able to see it. Regardless, the issue: under certain as-yet-unidentified environmental conditions, the copier.Get method will return an ENOENT attempting to stream a directory that is empty. Work around this by avoiding the copy altogether in this case. Signed-off-by: Matthew Heon <mheon@redhat.com>
Diffstat (limited to 'libpod')
-rw-r--r--libpod/container_internal.go11
1 files changed, 11 insertions, 0 deletions
diff --git a/libpod/container_internal.go b/libpod/container_internal.go
index ced357096..ca0e082ff 100644
--- a/libpod/container_internal.go
+++ b/libpod/container_internal.go
@@ -1617,6 +1617,17 @@ func (c *Container) mountNamedVolume(v *ContainerNamedVolume, mountpoint string)
if !srcStat.IsDir() {
return vol, nil
}
+ // Read contents, do not bother continuing if it's empty. Fixes
+ // a bizarre issue where something copier.Get will ENOENT on
+ // empty directories and sometimes it will not.
+ // RHBZ#1928643
+ srcContents, err := ioutil.ReadDir(srcDir)
+ if err != nil {
+ return nil, errors.Wrapf(err, "error reading contents of source directory for copy up into volume %s", vol.Name())
+ }
+ if len(srcContents) == 0 {
+ return vol, nil
+ }
// Buildah Copier accepts a reader, so we'll need a pipe.
reader, writer := io.Pipe()