From b4c8a9dc5f84ba27aab879c8613d3323fee6b3e9 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Mon, 7 Jun 2021 12:44:55 +0200 Subject: [PATCH] mobycli: ignore SIGURG on Linux and Darwin Equivalent of https://github.com/docker/cli/commit/fff164c22e8dc904291fecb62307312fd4ca153e and https://github.com/docker/cli/commit/cedaf44ea2e8b25b5298bac5f432d90033e5ad6a In go1.14+, SIGURG is used by the runtime to handle preemtable system calls. In practice this signal is caught *frequently*. For reference: https://go.googlesource.com/proposal/+/master/design/24543-non-cooperative-preemption.md golang/go#37942 Signed-off-by: Sebastiaan van Stijn --- cli/mobycli/exec.go | 9 +++++++-- cli/mobycli/exec_unix.go | 29 +++++++++++++++++++++++++++++ cli/mobycli/exec_windows.go | 23 +++++++++++++++++++++++ 3 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 cli/mobycli/exec_unix.go create mode 100644 cli/mobycli/exec_windows.go diff --git a/cli/mobycli/exec.go b/cli/mobycli/exec.go index de01215c8..f6f2cdc6e 100644 --- a/cli/mobycli/exec.go +++ b/cli/mobycli/exec.go @@ -106,8 +106,13 @@ func RunDocker(childExit chan bool, args ...string) error { if cmd.Process == nil { continue // can happen if receiving signal before the process is actually started } - // nolint errcheck - cmd.Process.Signal(sig) + // In go1.14+, the go runtime issues SIGURG as an interrupt to + // support preemptable system calls on Linux. Since we can't + // forward that along we'll check that here. + if isRuntimeSig(sig) { + continue + } + _ = cmd.Process.Signal(sig) case <-childExit: return } diff --git a/cli/mobycli/exec_unix.go b/cli/mobycli/exec_unix.go new file mode 100644 index 000000000..5d3f447b6 --- /dev/null +++ b/cli/mobycli/exec_unix.go @@ -0,0 +1,29 @@ +// +build !windows + +/* + Copyright 2020 Docker Compose CLI authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package mobycli + +import ( + "os" + + "golang.org/x/sys/unix" +) + +func isRuntimeSig(s os.Signal) bool { + return s == unix.SIGURG +} diff --git a/cli/mobycli/exec_windows.go b/cli/mobycli/exec_windows.go new file mode 100644 index 000000000..9111ec579 --- /dev/null +++ b/cli/mobycli/exec_windows.go @@ -0,0 +1,23 @@ +/* + Copyright 2020 Docker Compose CLI authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package mobycli + +import "os" + +func isRuntimeSig(s os.Signal) bool { + return false +}