Add --interval flag to podman wait

Waiting uses a lot of CPU, so drop back to checking once/second
and allow user to pass in the interval.

Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
This commit is contained in:
Daniel J Walsh
2018-09-10 16:03:52 -04:00
parent 61eda671ec
commit 9ec82caa31
9 changed files with 28 additions and 10 deletions

View File

@ -286,7 +286,7 @@ install.tools: .install.gitvalidation .install.gometalinter .install.md2man .ins
fi
.install.easyjson: .gopathok
if [ ! -x "$(GOBIN)/ffjson" ]; then\
if [ ! -x "$(GOBIN)/easyffjson" ]; then\
$(GO) get -u github.com/mailru/easyjson/...; \
fi

View File

@ -223,7 +223,7 @@ func runCmd(c *cli.Context) error {
return err
}
if ecode, err := ctr.Wait(); err != nil {
if ecode, err := ctr.Wait(libpod.WaitTimeout); err != nil {
if errors.Cause(err) == libpod.ErrNoSuchCtr {
// The container may have been removed
// Go looking for an exit file

View File

@ -115,7 +115,7 @@ func startCmd(c *cli.Context) error {
return errors.Wrapf(err, "unable to start container %s", ctr.ID())
}
if ecode, err := ctr.Wait(); err != nil {
if ecode, err := ctr.Wait(libpod.WaitTimeout); err != nil {
logrus.Errorf("unable to get exit code of container %s: %q", ctr.ID(), err)
} else {
exitCode = int(ecode)

View File

@ -3,8 +3,10 @@ package main
import (
"fmt"
"os"
"time"
"github.com/containers/libpod/cmd/podman/libpodruntime"
"github.com/containers/libpod/libpod"
"github.com/pkg/errors"
"github.com/urfave/cli"
)
@ -15,7 +17,14 @@ var (
Block until one or more containers stop and then print their exit codes
`
waitFlags = []cli.Flag{LatestFlag}
waitFlags = []cli.Flag{
cli.UintFlag{
Name: "interval, i",
Usage: "Milliseconds to wait before polling for completion",
Value: uint(libpod.WaitTimeout),
},
LatestFlag,
}
waitCommand = cli.Command{
Name: "wait",
Usage: "Block on one or more containers",
@ -57,7 +66,10 @@ func waitCmd(c *cli.Context) error {
if err != nil {
return errors.Wrapf(err, "unable to find container %s", container)
}
returnCode, err := ctr.Wait()
if c.Uint("interval") == 0 {
return errors.Errorf("interval must be greater then 0")
}
returnCode, err := ctr.Wait(time.Duration(c.Uint("interval")))
if err != nil {
if lastError != nil {
fmt.Fprintln(os.Stderr, lastError)

View File

@ -2012,7 +2012,9 @@ _podman_wait() {
local boolean_options="
--help
-h
-i
-l
--interval
--latest"
case "$cur" in
-*)

View File

@ -17,6 +17,9 @@ After the container stops, the container's return code is printed.
Print usage statement
**--interval, i**"
Microseconds to wait before polling for completion
**--latest, -l**
Instead of providing the container name or ID, use the last created container. If you use methods other than Podman

View File

@ -36,6 +36,8 @@ const (
ContainerStateStopped ContainerStatus = iota
// ContainerStatePaused indicates that the container has been paused
ContainerStatePaused ContainerStatus = iota
// WaitTimeout is the wait timeout before checking for container exit
WaitTimeout = time.Second / time.Millisecond
)
// CgroupfsDefaultCgroupParent is the cgroup parent for CGroupFS in libpod

View File

@ -592,12 +592,11 @@ func (c *Container) Inspect(size bool) (*inspect.ContainerInspectData, error) {
}
// Wait blocks on a container to exit and returns its exit code
func (c *Container) Wait() (int32, error) {
func (c *Container) Wait(waitTimeout time.Duration) (int32, error) {
if !c.valid {
return -1, ErrCtrRemoved
}
err := wait.PollImmediateInfinite(100*time.Millisecond,
err := wait.PollImmediateInfinite(waitTimeout*time.Millisecond,
func() (bool, error) {
stopped, err := c.isStopped()
if err != nil {

View File

@ -341,7 +341,7 @@ func (i *LibpodAPI) WaitContainer(call iopodman.VarlinkCall, name string) error
if err != nil {
return call.ReplyContainerNotFound(name)
}
exitCode, err := ctr.Wait()
exitCode, err := ctr.Wait(libpod.WaitTimeout)
if err != nil {
return call.ReplyErrorOccurred(err.Error())
}