aboutsummaryrefslogtreecommitdiff
path: root/libpod
diff options
context:
space:
mode:
authorGiuseppe Scrivano <gscrivan@redhat.com>2019-09-04 14:35:37 +0200
committerGiuseppe Scrivano <gscrivan@redhat.com>2019-09-04 19:55:54 +0200
commit8e337aff5ae755794d0d7844d146f5f8533152bb (patch)
tree6b052d4c1698af5dc7602acc73c67302fed84b81 /libpod
parentf1a3e02aea68a37f85cb924c934be1bcc4131d7d (diff)
downloadpodman-8e337aff5ae755794d0d7844d146f5f8533152bb.tar.gz
podman-8e337aff5ae755794d0d7844d146f5f8533152bb.tar.bz2
podman-8e337aff5ae755794d0d7844d146f5f8533152bb.zip
libpod: avoid polling container status
use the inotify backend to be notified on the container exit instead of polling continuosly the runtime. Polling the runtime slowns significantly down the podman execution time for short lived processes: $ time bin/podman run --rm -ti fedora true real 0m0.324s user 0m0.088s sys 0m0.064s from: $ time podman run --rm -ti fedora true real 0m4.199s user 0m5.339s sys 0m0.344s Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
Diffstat (limited to 'libpod')
-rw-r--r--libpod/container_api.go36
-rw-r--r--libpod/util.go6
2 files changed, 23 insertions, 19 deletions
diff --git a/libpod/container_api.go b/libpod/container_api.go
index 9e59104cc..9bf97c5d4 100644
--- a/libpod/container_api.go
+++ b/libpod/container_api.go
@@ -14,7 +14,6 @@ import (
"github.com/opentracing/opentracing-go"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
- "k8s.io/apimachinery/pkg/util/wait"
"k8s.io/client-go/tools/remotecommand"
)
@@ -524,24 +523,25 @@ func (c *Container) WaitWithInterval(waitTimeout time.Duration) (int32, error) {
if !c.valid {
return -1, define.ErrCtrRemoved
}
- err := wait.PollImmediateInfinite(waitTimeout,
- func() (bool, error) {
- logrus.Debugf("Checking container %s status...", c.ID())
- stopped, err := c.isStopped()
- if err != nil {
- return false, err
- }
- if !stopped {
- return false, nil
- }
- return true, nil
- },
- )
- if err != nil {
- return 0, err
+
+ exitFile := c.exitFilePath()
+ chWait := make(chan error, 1)
+
+ defer close(chWait)
+
+ for {
+ // ignore errors here, it is only used to avoid waiting
+ // too long.
+ _, _ = WaitForFile(exitFile, chWait, waitTimeout)
+
+ stopped, err := c.isStopped()
+ if err != nil {
+ return -1, err
+ }
+ if stopped {
+ return c.state.ExitCode, nil
+ }
}
- exitCode := c.state.ExitCode
- return exitCode, nil
}
// Cleanup unmounts all mount points in container and cleans up container storage
diff --git a/libpod/util.go b/libpod/util.go
index b60575264..164800af4 100644
--- a/libpod/util.go
+++ b/libpod/util.go
@@ -69,7 +69,11 @@ func WaitForFile(path string, chWait chan error, timeout time.Duration) (bool, e
defer watcher.Close()
}
- timeoutChan := time.After(timeout)
+ var timeoutChan <-chan time.Time
+
+ if timeout != 0 {
+ timeoutChan = time.After(timeout)
+ }
for {
select {