mirror of
https://github.com/redis/go-redis.git
synced 2025-06-05 06:42:39 +03:00
perf: avoid unnecessary copy operation (#3376)
* optime: reduce unnecessary copy operations * add a comment * trigger CI without code changes, because the bug of docker * add comments
This commit is contained in:
parent
ba26e35a2c
commit
bc70b52b42
21
ring.go
21
ring.go
@ -349,17 +349,16 @@ func (c *ringSharding) newRingShards(
|
||||
return
|
||||
}
|
||||
|
||||
// Warning: External exposure of `c.shards.list` may cause data races.
|
||||
// So keep internal or implement deep copy if exposed.
|
||||
func (c *ringSharding) List() []*ringShard {
|
||||
var list []*ringShard
|
||||
|
||||
c.mu.RLock()
|
||||
if !c.closed {
|
||||
list = make([]*ringShard, len(c.shards.list))
|
||||
copy(list, c.shards.list)
|
||||
}
|
||||
c.mu.RUnlock()
|
||||
defer c.mu.RUnlock()
|
||||
|
||||
return list
|
||||
if c.closed {
|
||||
return nil
|
||||
}
|
||||
return c.shards.list
|
||||
}
|
||||
|
||||
func (c *ringSharding) Hash(key string) string {
|
||||
@ -423,6 +422,7 @@ func (c *ringSharding) Heartbeat(ctx context.Context, frequency time.Duration) {
|
||||
case <-ticker.C:
|
||||
var rebalance bool
|
||||
|
||||
// note: `c.List()` return a shadow copy of `[]*ringShard`.
|
||||
for _, shard := range c.List() {
|
||||
err := shard.Client.Ping(ctx).Err()
|
||||
isUp := err == nil || err == pool.ErrPoolTimeout
|
||||
@ -582,6 +582,7 @@ func (c *Ring) retryBackoff(attempt int) time.Duration {
|
||||
|
||||
// PoolStats returns accumulated connection pool stats.
|
||||
func (c *Ring) PoolStats() *PoolStats {
|
||||
// note: `c.List()` return a shadow copy of `[]*ringShard`.
|
||||
shards := c.sharding.List()
|
||||
var acc PoolStats
|
||||
for _, shard := range shards {
|
||||
@ -651,6 +652,7 @@ func (c *Ring) ForEachShard(
|
||||
ctx context.Context,
|
||||
fn func(ctx context.Context, client *Client) error,
|
||||
) error {
|
||||
// note: `c.List()` return a shadow copy of `[]*ringShard`.
|
||||
shards := c.sharding.List()
|
||||
var wg sync.WaitGroup
|
||||
errCh := make(chan error, 1)
|
||||
@ -682,6 +684,7 @@ func (c *Ring) ForEachShard(
|
||||
}
|
||||
|
||||
func (c *Ring) cmdsInfo(ctx context.Context) (map[string]*CommandInfo, error) {
|
||||
// note: `c.List()` return a shadow copy of `[]*ringShard`.
|
||||
shards := c.sharding.List()
|
||||
var firstErr error
|
||||
for _, shard := range shards {
|
||||
@ -810,7 +813,7 @@ func (c *Ring) Watch(ctx context.Context, fn func(*Tx) error, keys ...string) er
|
||||
|
||||
for _, key := range keys {
|
||||
if key != "" {
|
||||
shard, err := c.sharding.GetByKey(hashtag.Key(key))
|
||||
shard, err := c.sharding.GetByKey(key)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user