Jelajahi Sumber

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 <[email protected]>
Sebastiaan van Stijn 4 tahun lalu
induk
melakukan
b4c8a9dc5f
3 mengubah file dengan 59 tambahan dan 2 penghapusan
  1. 7 2
      cli/mobycli/exec.go
  2. 29 0
      cli/mobycli/exec_unix.go
  3. 23 0
      cli/mobycli/exec_windows.go

+ 7 - 2
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
 			}

+ 29 - 0
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
+}

+ 23 - 0
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
+}