mirror of https://github.com/containers/podman.git
				
				
				
			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:
		
							parent
							
								
									61eda671ec
								
							
						
					
					
						commit
						9ec82caa31
					
				
							
								
								
									
										2
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										2
									
								
								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 | ||||
| 
 | ||||
|  |  | |||
|  | @ -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
 | ||||
|  |  | |||
|  | @ -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) | ||||
|  |  | |||
|  | @ -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) | ||||
|  |  | |||
|  | @ -2012,7 +2012,9 @@ _podman_wait() { | |||
|      local boolean_options=" | ||||
|         --help | ||||
|         -h | ||||
|         -l | ||||
|         -i | ||||
| 	-l | ||||
|         --interval | ||||
|         --latest" | ||||
|     case "$cur" in | ||||
|         -*) | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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
 | ||||
|  |  | |||
|  | @ -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 { | ||||
|  |  | |||
|  | @ -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()) | ||||
| 	} | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue