diff --git a/pkg/dialer/dialer_windows.go b/pkg/dialer/dialer_windows.go index 64d30dea0..4dd296ebc 100644 --- a/pkg/dialer/dialer_windows.go +++ b/pkg/dialer/dialer_windows.go @@ -19,21 +19,13 @@ package dialer import ( "net" "os" - "syscall" "time" winio "github.com/Microsoft/go-winio" ) func isNoent(err error) bool { - if err != nil { - if oerr, ok := err.(*os.PathError); ok { - if oerr.Err == syscall.ENOENT { - return true - } - } - } - return false + return os.IsNotExist(err) } func dialer(address string, timeout time.Duration) (net.Conn, error) { diff --git a/pkg/ttrpcutil/client.go b/pkg/ttrpcutil/client.go index ba3d51d51..5edb19dc3 100644 --- a/pkg/ttrpcutil/client.go +++ b/pkg/ttrpcutil/client.go @@ -21,6 +21,7 @@ import ( "time" v1 "github.com/containerd/containerd/api/services/ttrpc/events/v1" + "github.com/containerd/containerd/pkg/dialer" "github.com/containerd/ttrpc" "github.com/pkg/errors" ) @@ -40,7 +41,7 @@ type Client struct { // NewClient returns a new containerd TTRPC client that is connected to the containerd instance provided by address func NewClient(address string, opts ...ttrpc.ClientOpts) (*Client, error) { connector := func() (*ttrpc.Client, error) { - conn, err := ttrpcDial(address, ttrpcDialTimeout) + conn, err := dialer.Dialer(address, ttrpcDialTimeout) if err != nil { return nil, errors.Wrap(err, "failed to connect") } diff --git a/pkg/ttrpcutil/client_unix.go b/pkg/ttrpcutil/client_unix.go deleted file mode 100644 index 16fb64954..000000000 --- a/pkg/ttrpcutil/client_unix.go +++ /dev/null @@ -1,30 +0,0 @@ -// +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 ttrpcutil - -import ( - "net" - "strings" - "time" -) - -func ttrpcDial(address string, timeout time.Duration) (net.Conn, error) { - address = strings.TrimPrefix(address, "unix://") - return net.DialTimeout("unix", address, timeout) -} diff --git a/pkg/ttrpcutil/client_windows.go b/pkg/ttrpcutil/client_windows.go deleted file mode 100644 index b8c69ef0a..000000000 --- a/pkg/ttrpcutil/client_windows.go +++ /dev/null @@ -1,59 +0,0 @@ -// +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 ttrpcutil - -import ( - "context" - "net" - "os" - "time" - - winio "github.com/Microsoft/go-winio" - "github.com/pkg/errors" -) - -func ttrpcDial(address string, timeout time.Duration) (net.Conn, error) { - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - - // If there is nobody serving the pipe we limit the timeout for this case to - // 5 seconds because any shim that would serve this endpoint should serve it - // within 5 seconds. - serveTimer := time.NewTimer(5 * time.Second) - defer serveTimer.Stop() - for { - c, err := winio.DialPipeContext(ctx, address) - if err != nil { - if os.IsNotExist(err) { - select { - case <-serveTimer.C: - return nil, errors.Wrap(os.ErrNotExist, "pipe not found before timeout") - default: - // Wait 10ms for the shim to serve and try again. - time.Sleep(10 * time.Millisecond) - continue - } - } else if err == context.DeadlineExceeded { - return nil, errors.Wrapf(err, "timed out waiting for npipe %s", address) - } - return nil, err - } - return c, nil - } -} diff --git a/runtime/v1/shim/client/client.go b/runtime/v1/shim/client/client.go index 7c68248c5..116e84083 100644 --- a/runtime/v1/shim/client/client.go +++ b/runtime/v1/shim/client/client.go @@ -40,6 +40,7 @@ import ( "github.com/containerd/containerd/events" "github.com/containerd/containerd/log" + "github.com/containerd/containerd/pkg/dialer" v1 "github.com/containerd/containerd/runtime/v1" "github.com/containerd/containerd/runtime/v1/shim" shimapi "github.com/containerd/containerd/runtime/v1/shim/v1" @@ -228,7 +229,7 @@ func connect(address string, d func(string, time.Duration) (net.Conn, error)) (n func annonDialer(address string, timeout time.Duration) (net.Conn, error) { address = strings.TrimPrefix(address, "unix://") - return net.DialTimeout("unix", "\x00"+address, timeout) + return dialer.Dialer("\x00"+address, timeout) } // WithConnect connects to an existing shim diff --git a/runtime/v2/shim/util_unix.go b/runtime/v2/shim/util_unix.go index 7ca65033f..093a66239 100644 --- a/runtime/v2/shim/util_unix.go +++ b/runtime/v2/shim/util_unix.go @@ -30,6 +30,7 @@ import ( "time" "github.com/containerd/containerd/namespaces" + "github.com/containerd/containerd/pkg/dialer" "github.com/containerd/containerd/sys" "github.com/pkg/errors" ) @@ -75,7 +76,7 @@ func SocketAddress(ctx context.Context, id string) (string, error) { // AnonDialer returns a dialer for an abstract socket func AnonDialer(address string, timeout time.Duration) (net.Conn, error) { address = strings.TrimPrefix(address, "unix://") - return net.DialTimeout("unix", "\x00"+address, timeout) + return dialer.Dialer("\x00"+address, timeout) } func AnonReconnectDialer(address string, timeout time.Duration) (net.Conn, error) {