Merge "rpc/...: deflake test cases for rpc errors."
diff --git a/profiles/internal/rpc/client.go b/profiles/internal/rpc/client.go
index d8f4c9b..ab268dc 100644
--- a/profiles/internal/rpc/client.go
+++ b/profiles/internal/rpc/client.go
@@ -642,17 +642,28 @@
suberrs := []verror.SubErr{}
topLevelError := verror.ErrNoServers
topLevelAction := verror.RetryRefetch
+ onlyErrNetwork := true
for _, r := range responses {
if r != nil && r.serverErr != nil && r.serverErr.Err != nil {
switch verror.ErrorID(r.serverErr.Err) {
case stream.ErrNotTrusted.ID, verror.ErrNotTrusted.ID, errServerAuthorizeFailed.ID:
topLevelError = verror.ErrNotTrusted
topLevelAction = verror.NoRetry
+ onlyErrNetwork = false
+ case stream.ErrNetwork.ID:
+ // do nothing
+ default:
+ onlyErrNetwork = false
}
suberrs = append(suberrs, *r.serverErr)
}
}
+ if onlyErrNetwork {
+ // If we only encountered network errors, then report ErrBadProtocol.
+ topLevelError = verror.ErrBadProtocol
+ }
+
// TODO(cnicolaou): we get system errors for things like dialing using
// the 'ws' protocol which can never succeed even if we retry the connection,
// hence we return RetryRefetch below except for the case where the servers
diff --git a/profiles/internal/rpc/stream/errors.go b/profiles/internal/rpc/stream/errors.go
index 82079e6..9d7e25b 100644
--- a/profiles/internal/rpc/stream/errors.go
+++ b/profiles/internal/rpc/stream/errors.go
@@ -22,6 +22,7 @@
ErrSecurity = verror.Register(pkgPath+".errSecurity", verror.NoRetry, "{:3}")
ErrNotTrusted = verror.Register(pkgPath+".errNotTrusted", verror.NoRetry, "{:3}")
ErrNetwork = verror.Register(pkgPath+".errNetwork", verror.NoRetry, "{:3}")
+ ErrDialFailed = verror.Register(pkgPath+".errDialFailed", verror.NoRetry, "{:3}")
ErrProxy = verror.Register(pkgPath+".errProxy", verror.NoRetry, "{:3}")
ErrBadArg = verror.Register(pkgPath+".errBadArg", verror.NoRetry, "{:3}")
ErrBadState = verror.Register(pkgPath+".errBadState", verror.NoRetry, "{:3}")
diff --git a/profiles/internal/rpc/stream/manager/error_test.go b/profiles/internal/rpc/stream/manager/error_test.go
index 7d6e27e..ff51fe6 100644
--- a/profiles/internal/rpc/stream/manager/error_test.go
+++ b/profiles/internal/rpc/stream/manager/error_test.go
@@ -100,7 +100,7 @@
// bad protocol
ep, _ := inaming.NewEndpoint(naming.FormatEndpoint("x", "127.0.0.1:2"))
_, err := client.Dial(ep, pclient)
- if verror.ErrorID(err) != stream.ErrBadArg.ID {
+ if verror.ErrorID(err) != stream.ErrDialFailed.ID {
t.Fatalf("wrong error: %s", err)
}
t.Log(err)
@@ -108,7 +108,7 @@
// no server
ep, _ = inaming.NewEndpoint(naming.FormatEndpoint("tcp", "127.0.0.1:2"))
_, err = client.Dial(ep, pclient)
- if verror.ErrorID(err) != stream.ErrNetwork.ID {
+ if verror.ErrorID(err) != stream.ErrDialFailed.ID {
t.Fatalf("wrong error: %s", err)
}
t.Log(err)
diff --git a/profiles/internal/rpc/stream/manager/manager.go b/profiles/internal/rpc/stream/manager/manager.go
index 5ee4fd0..ee05736 100644
--- a/profiles/internal/rpc/stream/manager/manager.go
+++ b/profiles/internal/rpc/stream/manager/manager.go
@@ -89,11 +89,11 @@
if d, _, _ := rpc.RegisteredProtocol(network); d != nil {
conn, err := d(network, address, timeout)
if err != nil {
- return nil, verror.New(stream.ErrNetwork, nil, err)
+ return nil, verror.New(stream.ErrDialFailed, nil, err)
}
return conn, nil
}
- return nil, verror.New(stream.ErrBadArg, nil, verror.New(errUnknownNetwork, nil, network))
+ return nil, verror.New(stream.ErrDialFailed, nil, verror.New(errUnknownNetwork, nil, network))
}
// FindOrDialVIF returns the network connection (VIF) to the provided address
diff --git a/profiles/internal/rpc/stream/vc/vc.go b/profiles/internal/rpc/stream/vc/vc.go
index d15482d..8f4a5eb 100644
--- a/profiles/internal/rpc/stream/vc/vc.go
+++ b/profiles/internal/rpc/stream/vc/vc.go
@@ -498,7 +498,7 @@
select {
case <-remotePubKeyChan:
case <-vc.closeCh:
- return verror.New(errClosedDuringHandshake, nil, vc.VCI)
+ return verror.New(stream.ErrNetwork, nil, verror.New(errClosedDuringHandshake, nil, vc.VCI))
}
}
return nil
@@ -530,13 +530,13 @@
case theirKey := <-remotePubKeyChan:
return theirKey, nil
case <-vc.closeCh:
- return nil, verror.New(errClosedDuringHandshake, nil, vc.VCI)
+ return nil, verror.New(stream.ErrNetwork, nil, verror.New(errClosedDuringHandshake, nil, vc.VCI))
}
}
var err error
crypter, err = crypto.NewBoxCrypter(exchange, vc.pool)
if err != nil {
- return vc.appendCloseReason(verror.New(stream.ErrNetwork, nil,
+ return vc.appendCloseReason(verror.New(stream.ErrSecurity, nil,
verror.New(errFailedToSetupEncryption, nil, err)))
}
// The version is set by FinishHandshakeDialedVC and exchange (called by
diff --git a/profiles/internal/rpc/test/client_test.go b/profiles/internal/rpc/test/client_test.go
index caf87ab..4561cc4 100644
--- a/profiles/internal/rpc/test/client_test.go
+++ b/profiles/internal/rpc/test/client_test.go
@@ -442,7 +442,7 @@
}
ns.SetRoots(brkRoot.Name())
- nctx, _ := context.WithTimeout(ctx, 100*time.Millisecond)
+ nctx, _ := context.WithTimeout(ctx, time.Minute)
call, err := client.StartCall(nctx, "name", "noname", nil, options.NoRetry{}, options.SecurityNone)
if verror.ErrorID(err) != verror.ErrBadProtocol.ID {
t.Fatalf("wrong error: %s", err)
@@ -458,7 +458,7 @@
defer fn()
call, err = client.StartCall(nctx, name, "noname", nil, options.NoRetry{})
- if verror.ErrorID(err) != verror.ErrNoServers.ID {
+ if verror.ErrorID(err) != verror.ErrBadProtocol.ID {
t.Fatalf("wrong error: %s", err)
}
if call != nil {