mirror of
https://github.com/containers/podman.git
synced 2025-08-06 03:19:52 +08:00
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>
This commit is contained in:
@ -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
|
||||
|
Reference in New Issue
Block a user