transport/local: configurable dial_timeout for connect, default 2s

This commit is contained in:
Christian Schwarz
2019-09-29 16:58:18 +02:00
parent a6b578b648
commit 5c95c21727
3 changed files with 19 additions and 5 deletions
+15 -3
View File
@@ -12,6 +12,7 @@ import (
type LocalConnecter struct {
listenerName string
clientIdentity string
dialTimeout time.Duration
}
func LocalConnecterFromConfig(in *config.LocalConnect) (*LocalConnecter, error) {
@@ -21,13 +22,24 @@ func LocalConnecterFromConfig(in *config.LocalConnect) (*LocalConnecter, error)
if in.ListenerName == "" {
return nil, fmt.Errorf("ListenerName must not be empty")
}
return &LocalConnecter{listenerName: in.ListenerName, clientIdentity: in.ClientIdentity}, nil
if in.DialTimeout < 0 {
return nil, fmt.Errorf("DialTimeout must be zero or positive")
}
cn := &LocalConnecter{
listenerName: in.ListenerName,
clientIdentity: in.ClientIdentity,
dialTimeout: in.DialTimeout,
}
return cn, nil
}
func (c *LocalConnecter) Connect(dialCtx context.Context) (transport.Wire, error) {
l := GetLocalListener(c.listenerName)
dialCtx, cancel := context.WithTimeout(dialCtx, 1*time.Second) // fail fast, config error by user is very likely
defer cancel()
if c.dialTimeout > 0 {
ctx, cancel := context.WithTimeout(dialCtx, c.dialTimeout)
defer cancel()
dialCtx = ctx // shadow
}
w, err := l.Connect(dialCtx, c.clientIdentity)
if err == context.DeadlineExceeded {
return nil, fmt.Errorf("local listener %q not reachable", c.listenerName)