Skip to content

Commit 4f1e623

Browse files
committed
fix races shown in comments, lets see if we can omit holding a lock for the whole function
Signed-off-by: Sandor Szücs <[email protected]>
1 parent e1bede3 commit 4f1e623

File tree

1 file changed

+15
-8
lines changed

1 file changed

+15
-8
lines changed

ring.go

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -241,18 +241,25 @@ func (c *ringShards) SetAddrs(addrs map[string]string) {
241241
if addr, ok := addrs[k]; ok && shard.addr == addr {
242242
shards[k] = shard
243243
} else {
244+
// close shards that are not reused
244245
defer func() {
245-
err := shard.Client.Close()
246-
if err != nil {
247-
internal.Logger.Printf(context.Background(), "Failed to close ring shard client %s %s: %v", k, shard.addr, err)
246+
c.mu.Lock()
247+
if !c.closed {
248+
err := shard.Client.Close()
249+
if err != nil {
250+
internal.Logger.Printf(context.Background(), "Failed to close ring shard client %s %s: %v", k, shard.addr, err)
251+
}
248252
}
253+
c.mu.Unlock()
249254
}()
250255
}
251256
}
252257

258+
newShardNames := make([]string, 0)
253259
for k, addr := range addrs {
254260
if shard, ok := c.shards[k]; !ok || shard.addr != addr {
255261
shards[k] = newRingShard(c.opt, k, addr)
262+
newShardNames = append(newShardNames, k)
256263
}
257264
}
258265

@@ -262,13 +269,13 @@ func (c *ringShards) SetAddrs(addrs map[string]string) {
262269
}
263270

264271
c.mu.Lock()
265-
if !c.closed {
272+
if c.closed {
273+
for _, k := range newShardNames {
274+
shards[k].Client.Close()
275+
}
276+
} else {
266277
c.shards = shards
267278
c.list = list
268-
} else {
269-
for _, shard := range shards {
270-
shard.Client.Close()
271-
}
272279
}
273280
c.mu.Unlock()
274281

0 commit comments

Comments
 (0)