summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel J Walsh <dwalsh@redhat.com>2018-09-10 16:03:52 -0400
committerDaniel J Walsh <dwalsh@redhat.com>2018-09-13 10:11:00 -0400
commit9ec82caa3147d7afaf9361748661c8868194d132 (patch)
tree4de0f051226e638819f2d4e34174b39e4b203c8a
parent61eda671eca96b6fa32369572d9b49850895d37b (diff)
downloadpodman-9ec82caa3147d7afaf9361748661c8868194d132.tar.gz
podman-9ec82caa3147d7afaf9361748661c8868194d132.tar.bz2
podman-9ec82caa3147d7afaf9361748661c8868194d132.zip
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>
-rw-r--r--Makefile2
-rw-r--r--cmd/podman/run.go2
-rw-r--r--cmd/podman/start.go2
-rw-r--r--cmd/podman/wait.go16
-rw-r--r--completions/bash/podman4
-rw-r--r--docs/podman-wait.1.md3
-rw-r--r--libpod/container.go2
-rw-r--r--libpod/container_api.go5
-rw-r--r--pkg/varlinkapi/containers.go2
9 files changed, 28 insertions, 10 deletions
diff --git a/Makefile b/Makefile
index 0277c19b0..7a529f4d5 100644
--- a/Makefile
+++ b/Makefile
@@ -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
diff --git a/cmd/podman/run.go b/cmd/podman/run.go
index 3445daef5..7bdae3038 100644
--- a/cmd/podman/run.go
+++ b/cmd/podman/run.go
@@ -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
diff --git a/cmd/podman/start.go b/cmd/podman/start.go
index cb65ec6d4..a80d0e1e8 100644
--- a/cmd/podman/start.go
+++ b/cmd/podman/start.go
@@ -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)
diff --git a/cmd/podman/wait.go b/cmd/podman/wait.go
index e919ab3ca..48d3885e7 100644
--- a/cmd/podman/wait.go
+++ b/cmd/podman/wait.go
@@ -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)
diff --git a/completions/bash/podman b/completions/bash/podman
index d9af43d37..de535512f 100644
--- a/completions/bash/podman
+++ b/completions/bash/podman
@@ -2012,7 +2012,9 @@ _podman_wait() {
local boolean_options="
--help
-h
- -l
+ -i
+ -l
+ --interval
--latest"
case "$cur" in
-*)
diff --git a/docs/podman-wait.1.md b/docs/podman-wait.1.md
index 74ccdbe0c..dd5dc7907 100644
--- a/docs/podman-wait.1.md
+++ b/docs/podman-wait.1.md
@@ -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
diff --git a/libpod/container.go b/libpod/container.go
index e748cb84d..f68a3535e 100644
--- a/libpod/container.go
+++ b/libpod/container.go
@@ -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
diff --git a/libpod/container_api.go b/libpod/container_api.go
index 86e2370ea..437699bae 100644
--- a/libpod/container_api.go
+++ b/libpod/container_api.go
@@ -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 {
diff --git a/pkg/varlinkapi/containers.go b/pkg/varlinkapi/containers.go
index f517e9b6e..de9c23034 100644
--- a/pkg/varlinkapi/containers.go
+++ b/pkg/varlinkapi/containers.go
@@ -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())
}