summaryrefslogtreecommitdiff
path: root/pkg/api
diff options
context:
space:
mode:
authorOpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com>2021-03-27 00:05:47 +0000
committerGitHub <noreply@github.com>2021-03-27 00:05:47 +0000
commit4d0b583340c37efbf175c00d75d75107a0b23f00 (patch)
tree54f82597112522b14633bdf44aec412747aaf9ee /pkg/api
parentf3024b906ce717f7858c138a9c1daf72bdb8d132 (diff)
parentdcabf6dd717ad495ba71d2788a64255defb852fd (diff)
downloadpodman-4d0b583340c37efbf175c00d75d75107a0b23f00.tar.gz
podman-4d0b583340c37efbf175c00d75d75107a0b23f00.tar.bz2
podman-4d0b583340c37efbf175c00d75d75107a0b23f00.zip
Merge pull request #9833 from rhatdan/resize
Remove resize race condition
Diffstat (limited to 'pkg/api')
-rw-r--r--pkg/api/handlers/compat/resize.go22
-rw-r--r--pkg/api/server/register_containers.go5
-rw-r--r--pkg/api/server/register_exec.go5
3 files changed, 24 insertions, 8 deletions
diff --git a/pkg/api/handlers/compat/resize.go b/pkg/api/handlers/compat/resize.go
index 1bf7ad460..23ed33a22 100644
--- a/pkg/api/handlers/compat/resize.go
+++ b/pkg/api/handlers/compat/resize.go
@@ -19,8 +19,9 @@ func ResizeTTY(w http.ResponseWriter, r *http.Request) {
// /containers/{id}/resize
query := struct {
- Height uint16 `schema:"h"`
- Width uint16 `schema:"w"`
+ Height uint16 `schema:"h"`
+ Width uint16 `schema:"w"`
+ IgnoreNotRunning bool `schema:"running"`
}{
// override any golang type defaults
}
@@ -48,14 +49,17 @@ func ResizeTTY(w http.ResponseWriter, r *http.Request) {
if state, err := ctnr.State(); err != nil {
utils.InternalServerError(w, errors.Wrapf(err, "cannot obtain container state"))
return
- } else if state != define.ContainerStateRunning {
+ } else if state != define.ContainerStateRunning && !query.IgnoreNotRunning {
utils.Error(w, "Container not running", http.StatusConflict,
fmt.Errorf("container %q in wrong state %q", name, state.String()))
return
}
+ // If container is not running, ignore since this can be a race condition, and is expected
if err := ctnr.AttachResize(sz); err != nil {
- utils.InternalServerError(w, errors.Wrapf(err, "cannot resize container"))
- return
+ if errors.Cause(err) != define.ErrCtrStateInvalid || !query.IgnoreNotRunning {
+ utils.InternalServerError(w, errors.Wrapf(err, "cannot resize container"))
+ return
+ }
}
// This is not a 204, even though we write nothing, for compatibility
// reasons.
@@ -70,14 +74,16 @@ func ResizeTTY(w http.ResponseWriter, r *http.Request) {
if state, err := ctnr.State(); err != nil {
utils.InternalServerError(w, errors.Wrapf(err, "cannot obtain session container state"))
return
- } else if state != define.ContainerStateRunning {
+ } else if state != define.ContainerStateRunning && !query.IgnoreNotRunning {
utils.Error(w, "Container not running", http.StatusConflict,
fmt.Errorf("container %q in wrong state %q", name, state.String()))
return
}
if err := ctnr.ExecResize(name, sz); err != nil {
- utils.InternalServerError(w, errors.Wrapf(err, "cannot resize session"))
- return
+ if errors.Cause(err) != define.ErrCtrStateInvalid || !query.IgnoreNotRunning {
+ utils.InternalServerError(w, errors.Wrapf(err, "cannot resize session"))
+ return
+ }
}
// This is not a 204, even though we write nothing, for compatibility
// reasons.
diff --git a/pkg/api/server/register_containers.go b/pkg/api/server/register_containers.go
index 31196aa9e..b379d52ce 100644
--- a/pkg/api/server/register_containers.go
+++ b/pkg/api/server/register_containers.go
@@ -587,6 +587,11 @@ func (s *APIServer) registerContainersHandlers(r *mux.Router) error {
// type: integer
// required: false
// description: Width to set for the terminal, in characters
+ // - in: query
+ // name: running
+ // type: boolean
+ // required: false
+ // description: Ignore containers not running errors
// produces:
// - application/json
// responses:
diff --git a/pkg/api/server/register_exec.go b/pkg/api/server/register_exec.go
index 0f8c827c8..de437ab1a 100644
--- a/pkg/api/server/register_exec.go
+++ b/pkg/api/server/register_exec.go
@@ -136,6 +136,11 @@ func (s *APIServer) registerExecHandlers(r *mux.Router) error {
// name: w
// type: integer
// description: Width of the TTY session in characters
+ // - in: query
+ // name: running
+ // type: boolean
+ // required: false
+ // description: Ignore containers not running errors
// produces:
// - application/json
// responses: