mirror of
https://github.com/redis/go-redis.git
synced 2025-07-28 06:42:00 +03:00
fix: reduce SetAddrs
shards lock contention
Introduces a new lock to make `SetAddrs` calls exclusive. This allows release of shards lock for the duration of potentially long `newRingShards` call. `TestRingSetAddrsContention` observes number of pings increased from <1000 to ~40_000. See https://github.com/go-redis/redis/pull/2190#discussion_r953040289 Updates #2077
This commit is contained in:
12
ring_test.go
12
ring_test.go
@ -124,7 +124,7 @@ var _ = Describe("Redis Ring", func() {
|
||||
})
|
||||
Expect(ring.Len(), 1)
|
||||
gotShard := ring.ShardByName("ringShardOne")
|
||||
Expect(gotShard).To(Equal(wantShard))
|
||||
Expect(gotShard).To(BeIdenticalTo(wantShard))
|
||||
|
||||
ring.SetAddrs(map[string]string{
|
||||
"ringShardOne": ":" + ringShard1Port,
|
||||
@ -132,7 +132,7 @@ var _ = Describe("Redis Ring", func() {
|
||||
})
|
||||
Expect(ring.Len(), 2)
|
||||
gotShard = ring.ShardByName("ringShardOne")
|
||||
Expect(gotShard).To(Equal(wantShard))
|
||||
Expect(gotShard).To(BeIdenticalTo(wantShard))
|
||||
})
|
||||
|
||||
It("uses 3 shards after setting it to 3 shards", func() {
|
||||
@ -156,8 +156,8 @@ var _ = Describe("Redis Ring", func() {
|
||||
gotShard1 := ring.ShardByName(shardName1)
|
||||
gotShard2 := ring.ShardByName(shardName2)
|
||||
gotShard3 := ring.ShardByName(shardName3)
|
||||
Expect(gotShard1).To(Equal(wantShard1))
|
||||
Expect(gotShard2).To(Equal(wantShard2))
|
||||
Expect(gotShard1).To(BeIdenticalTo(wantShard1))
|
||||
Expect(gotShard2).To(BeIdenticalTo(wantShard2))
|
||||
Expect(gotShard3).ToNot(BeNil())
|
||||
|
||||
ring.SetAddrs(map[string]string{
|
||||
@ -168,8 +168,8 @@ var _ = Describe("Redis Ring", func() {
|
||||
gotShard1 = ring.ShardByName(shardName1)
|
||||
gotShard2 = ring.ShardByName(shardName2)
|
||||
gotShard3 = ring.ShardByName(shardName3)
|
||||
Expect(gotShard1).To(Equal(wantShard1))
|
||||
Expect(gotShard2).To(Equal(wantShard2))
|
||||
Expect(gotShard1).To(BeIdenticalTo(wantShard1))
|
||||
Expect(gotShard2).To(BeIdenticalTo(wantShard2))
|
||||
Expect(gotShard3).To(BeNil())
|
||||
})
|
||||
})
|
||||
|
Reference in New Issue
Block a user