Merge pull request #3802 from vladimiroff/unify-dialers
Unify dialer implementations
This commit is contained in:
commit
ebec675a8d
@ -19,21 +19,13 @@ package dialer
|
|||||||
import (
|
import (
|
||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
"syscall"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
winio "github.com/Microsoft/go-winio"
|
winio "github.com/Microsoft/go-winio"
|
||||||
)
|
)
|
||||||
|
|
||||||
func isNoent(err error) bool {
|
func isNoent(err error) bool {
|
||||||
if err != nil {
|
return os.IsNotExist(err)
|
||||||
if oerr, ok := err.(*os.PathError); ok {
|
|
||||||
if oerr.Err == syscall.ENOENT {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func dialer(address string, timeout time.Duration) (net.Conn, error) {
|
func dialer(address string, timeout time.Duration) (net.Conn, error) {
|
||||||
|
@ -21,6 +21,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
v1 "github.com/containerd/containerd/api/services/ttrpc/events/v1"
|
v1 "github.com/containerd/containerd/api/services/ttrpc/events/v1"
|
||||||
|
"github.com/containerd/containerd/pkg/dialer"
|
||||||
"github.com/containerd/ttrpc"
|
"github.com/containerd/ttrpc"
|
||||||
"github.com/pkg/errors"
|
"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
|
// 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) {
|
func NewClient(address string, opts ...ttrpc.ClientOpts) (*Client, error) {
|
||||||
connector := func() (*ttrpc.Client, error) {
|
connector := func() (*ttrpc.Client, error) {
|
||||||
conn, err := ttrpcDial(address, ttrpcDialTimeout)
|
conn, err := dialer.Dialer(address, ttrpcDialTimeout)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "failed to connect")
|
return nil, errors.Wrap(err, "failed to connect")
|
||||||
}
|
}
|
||||||
|
@ -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)
|
|
||||||
}
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
@ -40,6 +40,7 @@ import (
|
|||||||
|
|
||||||
"github.com/containerd/containerd/events"
|
"github.com/containerd/containerd/events"
|
||||||
"github.com/containerd/containerd/log"
|
"github.com/containerd/containerd/log"
|
||||||
|
"github.com/containerd/containerd/pkg/dialer"
|
||||||
v1 "github.com/containerd/containerd/runtime/v1"
|
v1 "github.com/containerd/containerd/runtime/v1"
|
||||||
"github.com/containerd/containerd/runtime/v1/shim"
|
"github.com/containerd/containerd/runtime/v1/shim"
|
||||||
shimapi "github.com/containerd/containerd/runtime/v1/shim/v1"
|
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) {
|
func annonDialer(address string, timeout time.Duration) (net.Conn, error) {
|
||||||
address = strings.TrimPrefix(address, "unix://")
|
address = strings.TrimPrefix(address, "unix://")
|
||||||
return net.DialTimeout("unix", "\x00"+address, timeout)
|
return dialer.Dialer("\x00"+address, timeout)
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithConnect connects to an existing shim
|
// WithConnect connects to an existing shim
|
||||||
|
@ -30,6 +30,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/containerd/containerd/namespaces"
|
"github.com/containerd/containerd/namespaces"
|
||||||
|
"github.com/containerd/containerd/pkg/dialer"
|
||||||
"github.com/containerd/containerd/sys"
|
"github.com/containerd/containerd/sys"
|
||||||
"github.com/pkg/errors"
|
"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
|
// AnonDialer returns a dialer for an abstract socket
|
||||||
func AnonDialer(address string, timeout time.Duration) (net.Conn, error) {
|
func AnonDialer(address string, timeout time.Duration) (net.Conn, error) {
|
||||||
address = strings.TrimPrefix(address, "unix://")
|
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) {
|
func AnonReconnectDialer(address string, timeout time.Duration) (net.Conn, error) {
|
||||||
|
Loading…
Reference in New Issue
Block a user