From d23c4b8b53bd75ae5d7b4c3757db9828b89cd34c Mon Sep 17 00:00:00 2001 From: Derek McGowan Date: Fri, 31 May 2024 11:03:58 -0700 Subject: [PATCH] Use unix and windows specific connection error checks Signed-off-by: Derek McGowan --- core/remotes/docker/resolver.go | 3 +-- core/remotes/docker/resolver_unix.go | 28 +++++++++++++++++++++++ core/remotes/docker/resolver_windows.go | 30 +++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 core/remotes/docker/resolver_unix.go create mode 100644 core/remotes/docker/resolver_windows.go diff --git a/core/remotes/docker/resolver.go b/core/remotes/docker/resolver.go index 873361dd1..0b559ea5f 100644 --- a/core/remotes/docker/resolver.go +++ b/core/remotes/docker/resolver.go @@ -28,7 +28,6 @@ import ( "os" "path" "strings" - "syscall" "github.com/containerd/errdefs" "github.com/containerd/log" @@ -778,7 +777,7 @@ func isTLSError(err error) bool { } func isPortError(err error, host string) bool { - if errors.Is(err, syscall.ECONNREFUSED) || os.IsTimeout(err) { + if isConnError(err) || os.IsTimeout(err) { if _, port, _ := net.SplitHostPort(host); port != "" { // Port is specified, will not retry on different port with scheme change return false diff --git a/core/remotes/docker/resolver_unix.go b/core/remotes/docker/resolver_unix.go new file mode 100644 index 000000000..4ef0e0062 --- /dev/null +++ b/core/remotes/docker/resolver_unix.go @@ -0,0 +1,28 @@ +//go:build !windows + +/* + Copyright The containerd 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 docker + +import ( + "errors" + "syscall" +) + +func isConnError(err error) bool { + return errors.Is(err, syscall.ECONNREFUSED) +} diff --git a/core/remotes/docker/resolver_windows.go b/core/remotes/docker/resolver_windows.go new file mode 100644 index 000000000..9c98df04b --- /dev/null +++ b/core/remotes/docker/resolver_windows.go @@ -0,0 +1,30 @@ +//go:build windows + +/* + Copyright The containerd 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 docker + +import ( + "errors" + "syscall" + + "golang.org/x/sys/windows" +) + +func isConnError(err error) bool { + return errors.Is(err, syscall.ECONNREFUSED) || errors.Is(err, windows.WSAECONNREFUSED) +}