Merge pull request #14274 from lavacat/release-3.4-fix-TestRoundRobinBalancedResolvableFailoverFromServerFail

[3.4] clientv3/balancer: fixed flaky TestRoundRobinBalancedResolvableFailoverFromServerFail
This commit is contained in:
Benjamin Wang 2022-07-27 04:59:38 +08:00 committed by GitHub
commit 314dcbf6f5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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{}{}