From bdd9274aaa08fe9edf66afba1a5ded23a83d9f46 Mon Sep 17 00:00:00 2001 From: Andrey Petrov Date: Sat, 15 Dec 2018 20:37:46 -0500 Subject: [PATCH] set: Fix race condition --- set/set.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/set/set.go b/set/set.go index 1b489ad..7a50d4d 100644 --- a/set/set.go +++ b/set/set.go @@ -156,19 +156,21 @@ func (s *Set) Replace(oldKey string, item Item) error { // Each loops over every item while holding a read lock and applies fn to each // element. func (s *Set) Each(fn IterFunc) error { + var err error s.RLock() - defer s.RUnlock() for key, item := range s.lookup { if item.Value() == nil { + // Expired defer s.cleanup(key) continue } - if err := fn(key, item); err != nil { + if err = fn(key, item); err != nil { // Abort early - return err + break } } - return nil + s.RUnlock() + return err } // ListPrefix returns a list of items with a prefix, normalized.