mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
Merge pull request #14274 from lavacat/release-3.4-fix-TestRoundRobinBalancedResolvableFailoverFromServerFail
[3.4] clientv3/balancer: fixed flaky TestRoundRobinBalancedResolvableFailoverFromServerFail
This commit is contained in:
commit
314dcbf6f5
@ -91,7 +91,7 @@ func TestRoundRobinBalancedResolvableNoFailover(t *testing.T) {
|
|||||||
return picked, err
|
return picked, err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, picked, err := warmupConnections(reqFunc, tc.serverCount)
|
_, picked, err := warmupConnections(reqFunc, tc.serverCount, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Unexpected failure %v", err)
|
t.Fatalf("Unexpected failure %v", err)
|
||||||
}
|
}
|
||||||
@ -160,9 +160,11 @@ func TestRoundRobinBalancedResolvableFailoverFromServerFail(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// stop first server, loads should be redistributed
|
// stop first server, loads should be redistributed
|
||||||
// stopped server should never be picked
|
|
||||||
ms.StopAt(0)
|
ms.StopAt(0)
|
||||||
available, picked, err := warmupConnections(reqFunc, serverCount-1)
|
// stopped server will be transitioned into TRANSIENT_FAILURE state
|
||||||
|
// but it doesn't happen instantaneously and it can still be picked for a short period of time
|
||||||
|
// we ignore "transport is closing" in such case
|
||||||
|
available, picked, err := warmupConnections(reqFunc, serverCount-1, "transport is closing")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Unexpected failure %v", err)
|
t.Fatalf("Unexpected failure %v", err)
|
||||||
}
|
}
|
||||||
@ -171,8 +173,8 @@ func TestRoundRobinBalancedResolvableFailoverFromServerFail(t *testing.T) {
|
|||||||
prev, switches := picked, 0
|
prev, switches := picked, 0
|
||||||
for i := 0; i < reqN; i++ {
|
for i := 0; i < reqN; i++ {
|
||||||
picked, err = reqFunc(context.Background())
|
picked, err = reqFunc(context.Background())
|
||||||
if err != nil && strings.Contains(err.Error(), "transport is closing") {
|
if err != nil {
|
||||||
continue
|
t.Fatalf("#%d: unexpected failure %v", i, err)
|
||||||
}
|
}
|
||||||
if _, ok := available[picked]; !ok {
|
if _, ok := available[picked]; !ok {
|
||||||
t.Fatalf("picked unavailable address %q (available %v)", picked, available)
|
t.Fatalf("picked unavailable address %q (available %v)", picked, available)
|
||||||
@ -188,8 +190,7 @@ func TestRoundRobinBalancedResolvableFailoverFromServerFail(t *testing.T) {
|
|||||||
|
|
||||||
// now failed server comes back
|
// now failed server comes back
|
||||||
ms.StartAt(0)
|
ms.StartAt(0)
|
||||||
|
available, picked, err = warmupConnections(reqFunc, serverCount, "")
|
||||||
available, picked, err = warmupConnections(reqFunc, serverCount)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Unexpected failure %v", err)
|
t.Fatalf("Unexpected failure %v", err)
|
||||||
}
|
}
|
||||||
@ -266,7 +267,7 @@ func TestRoundRobinBalancedResolvableFailoverFromRequestFail(t *testing.T) {
|
|||||||
return picked, err
|
return picked, err
|
||||||
}
|
}
|
||||||
|
|
||||||
available, picked, err := warmupConnections(reqFunc, serverCount)
|
available, picked, err := warmupConnections(reqFunc, serverCount, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Unexpected failure %v", err)
|
t.Fatalf("Unexpected failure %v", err)
|
||||||
}
|
}
|
||||||
@ -301,7 +302,7 @@ func TestRoundRobinBalancedResolvableFailoverFromRequestFail(t *testing.T) {
|
|||||||
|
|
||||||
type reqFuncT = func(ctx context.Context) (picked string, err error)
|
type reqFuncT = func(ctx context.Context) (picked string, err error)
|
||||||
|
|
||||||
func warmupConnections(reqFunc reqFuncT, serverCount int) (map[string]struct{}, string, error) {
|
func warmupConnections(reqFunc reqFuncT, serverCount int, ignoreErr string) (map[string]struct{}, string, error) {
|
||||||
var picked string
|
var picked string
|
||||||
var err error
|
var err error
|
||||||
available := make(map[string]struct{})
|
available := make(map[string]struct{})
|
||||||
@ -310,6 +311,10 @@ func warmupConnections(reqFunc reqFuncT, serverCount int) (map[string]struct{},
|
|||||||
for len(available) < serverCount {
|
for len(available) < serverCount {
|
||||||
picked, err = reqFunc(context.Background())
|
picked, err = reqFunc(context.Background())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
if ignoreErr != "" && strings.Contains(err.Error(), ignoreErr) {
|
||||||
|
// skip ignored errors
|
||||||
|
continue
|
||||||
|
}
|
||||||
return available, picked, err
|
return available, picked, err
|
||||||
}
|
}
|
||||||
available[picked] = struct{}{}
|
available[picked] = struct{}{}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user