From 53cc4b4c6c34edbfbfdd03e510a5655e1358d9d4 Mon Sep 17 00:00:00 2001 From: Monkey Date: Fri, 16 Dec 2022 23:34:43 +0800 Subject: [PATCH] test: `TestRingSetAddrsContention` changed to Benchmark (#2316) --- .gitignore | 2 +- bench_test.go | 75 ++++++++++++++++++++++++++++++++++++++++++++ ring_test.go | 87 --------------------------------------------------- 3 files changed, 76 insertions(+), 88 deletions(-) diff --git a/.gitignore b/.gitignore index b975a7b4..dc322f9b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ *.rdb -testdata/*/ +testdata/* .idea/ diff --git a/bench_test.go b/bench_test.go index 5ddd82e4..cb29a7a8 100644 --- a/bench_test.go +++ b/bench_test.go @@ -365,3 +365,78 @@ func BenchmarkClusterSetString(b *testing.B) { } }) } + +func BenchmarkExecRingSetAddrsCmd(b *testing.B) { + const ( + ringShard1Name = "ringShardOne" + ringShard2Name = "ringShardTwo" + ) + + for _, port := range []string{ringShard1Port, ringShard2Port} { + if _, err := startRedis(port); err != nil { + b.Fatal(err) + } + } + + b.Cleanup(func() { + for _, p := range processes { + if err := p.Close(); err != nil { + b.Errorf("Failed to stop redis process: %v", err) + } + } + processes = nil + }) + + ring := redis.NewRing(&redis.RingOptions{ + Addrs: map[string]string{ + "ringShardOne": ":" + ringShard1Port, + }, + NewClient: func(opt *redis.Options) *redis.Client { + // Simulate slow shard creation + time.Sleep(100 * time.Millisecond) + return redis.NewClient(opt) + }, + }) + defer ring.Close() + + if _, err := ring.Ping(context.Background()).Result(); err != nil { + b.Fatal(err) + } + + // Continuously update addresses by adding and removing one address + updatesDone := make(chan struct{}) + defer func() { close(updatesDone) }() + go func() { + ticker := time.NewTicker(10 * time.Millisecond) + defer ticker.Stop() + for i := 0; ; i++ { + select { + case <-ticker.C: + if i%2 == 0 { + ring.SetAddrs(map[string]string{ + ringShard1Name: ":" + ringShard1Port, + }) + } else { + ring.SetAddrs(map[string]string{ + ringShard1Name: ":" + ringShard1Port, + ringShard2Name: ":" + ringShard2Port, + }) + } + case <-updatesDone: + return + } + } + }() + + b.ResetTimer() + for i := 0; i < b.N; i++ { + if _, err := ring.Ping(context.Background()).Result(); err != nil { + if err == redis.ErrClosed { + // The shard client could be closed while ping command is in progress + continue + } else { + b.Fatal(err) + } + } + } +} diff --git a/ring_test.go b/ring_test.go index ba4fa8a3..7caa8689 100644 --- a/ring_test.go +++ b/ring_test.go @@ -7,7 +7,6 @@ import ( "net" "strconv" "sync" - "testing" "time" . "github.com/onsi/ginkgo" @@ -740,89 +739,3 @@ var _ = Describe("Ring Tx timeout", func() { testTimeout() }) }) - -func TestRingSetAddrsContention(t *testing.T) { - const ( - ringShard1Name = "ringShardOne" - ringShard2Name = "ringShardTwo" - ) - - for _, port := range []string{ringShard1Port, ringShard2Port} { - if _, err := startRedis(port); err != nil { - t.Fatal(err) - } - } - - t.Cleanup(func() { - for _, p := range processes { - if err := p.Close(); err != nil { - t.Errorf("Failed to stop redis process: %v", err) - } - } - processes = nil - }) - - ring := redis.NewRing(&redis.RingOptions{ - Addrs: map[string]string{ - "ringShardOne": ":" + ringShard1Port, - }, - NewClient: func(opt *redis.Options) *redis.Client { - // Simulate slow shard creation - time.Sleep(100 * time.Millisecond) - return redis.NewClient(opt) - }, - }) - defer ring.Close() - - if _, err := ring.Ping(context.Background()).Result(); err != nil { - t.Fatal(err) - } - - // Continuously update addresses by adding and removing one address - updatesDone := make(chan struct{}) - defer func() { close(updatesDone) }() - go func() { - ticker := time.NewTicker(10 * time.Millisecond) - defer ticker.Stop() - for i := 0; ; i++ { - select { - case <-ticker.C: - if i%2 == 0 { - ring.SetAddrs(map[string]string{ - ringShard1Name: ":" + ringShard1Port, - }) - } else { - ring.SetAddrs(map[string]string{ - ringShard1Name: ":" + ringShard1Port, - ringShard2Name: ":" + ringShard2Port, - }) - } - case <-updatesDone: - return - } - } - }() - - var pings, errClosed int - timer := time.NewTimer(1 * time.Second) - for running := true; running; pings++ { - select { - case <-timer.C: - running = false - default: - if _, err := ring.Ping(context.Background()).Result(); err != nil { - if err == redis.ErrClosed { - // The shard client could be closed while ping command is in progress - errClosed++ - } else { - t.Fatal(err) - } - } - } - } - - t.Logf("Number of pings: %d, errClosed: %d", pings, errClosed) - if pings < 10_000 { - t.Errorf("Expected at least 10k pings, got: %d", pings) - } -}