From 342eaca3ed8ce71f3c9a6a503a56b436719829b0 Mon Sep 17 00:00:00 2001 From: ningmingxiao Date: Wed, 9 Jul 2025 14:43:58 +0800 Subject: [PATCH] fix:fifo leak Signed-off-by: ningmingxiao --- cmd/nerdctl/container/container_run_test.go | 45 +++++++++++++++++++++ pkg/cioutil/container_io.go | 4 +- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/cmd/nerdctl/container/container_run_test.go b/cmd/nerdctl/container/container_run_test.go index 0eaa72b0ac9..64692a3ead7 100644 --- a/cmd/nerdctl/container/container_run_test.go +++ b/cmd/nerdctl/container/container_run_test.go @@ -40,6 +40,7 @@ import ( "github.com/containerd/nerdctl/mod/tigron/tig" "github.com/containerd/nerdctl/v2/cmd/nerdctl/helpers" + "github.com/containerd/nerdctl/v2/pkg/rootlessutil" "github.com/containerd/nerdctl/v2/pkg/testutil" "github.com/containerd/nerdctl/v2/pkg/testutil/nerdtest" ) @@ -1058,3 +1059,47 @@ HEALTHCHECK --interval=30s --timeout=10s CMD wget -q --spider http://localhost:8 testCase.Run(t) } + +func countFIFOFiles(root string) (int, error) { + count := 0 + err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if info.Mode()&os.ModeNamedPipe != 0 { + count++ + } + return nil + }) + return count, err +} +func TestCleanupFIFOs(t *testing.T) { + if rootlessutil.IsRootless() { + t.Skip("/run/containerd/fifo/ doesn't exist on rootless") + } + if runtime.GOOS == "windows" { + t.Skip("test is not compatible with windows") + } + testutil.DockerIncompatible(t) + testCase := nerdtest.Setup() + testCase.NoParallel = true + testCase.Setup = func(data test.Data, helpers test.Helpers) { + cmd := helpers.Command("run", "-it", "--rm", testutil.CommonImage, "date") + cmd.WithPseudoTTY() + cmd.Run(&test.Expected{ + ExitCode: 0, + }) + oldNumFifos, err := countFIFOFiles("/run/containerd/fifo/") + assert.NilError(t, err) + + cmd = helpers.Command("run", "-it", "--rm", testutil.CommonImage, "date") + cmd.WithPseudoTTY() + cmd.Run(&test.Expected{ + ExitCode: 0, + }) + newNumFifos, err := countFIFOFiles("/run/containerd/fifo/") + assert.NilError(t, err) + assert.Equal(t, oldNumFifos, newNumFifos) + } + testCase.Run(t) +} diff --git a/pkg/cioutil/container_io.go b/pkg/cioutil/container_io.go index c69bfda4888..22dd6b4a0a5 100644 --- a/pkg/cioutil/container_io.go +++ b/pkg/cioutil/container_io.go @@ -85,7 +85,9 @@ func (c *ncio) Close() error { select { case err := <-done: - return err + if err != nil { + lastErr = fmt.Errorf("faied to run cmd.wait: %w", err) + } case <-time.After(binaryIOProcTermTimeout): err := c.cmd.Process.Kill()