aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2016-06-23 09:10:25 -0700
committerChris Lu <chris.lu@gmail.com>2016-06-23 09:10:25 -0700
commit101e784577f9ebdc38d530b64c92e09da76e11be (patch)
treed3e990dc057984220fff31f4b9d8340169ce6ecc
parent356b8048c57c7b6e676148892f5ff5031b2178b0 (diff)
downloadseaweedfs-101e784577f9ebdc38d530b64c92e09da76e11be.tar.xz
seaweedfs-101e784577f9ebdc38d530b64c92e09da76e11be.zip
add locking on possible concurrent map access
fix https://github.com/chrislusf/seaweedfs/issues/328
-rw-r--r--weed/storage/compact_map.go4
1 files changed, 4 insertions, 0 deletions
diff --git a/weed/storage/compact_map.go b/weed/storage/compact_map.go
index d4438d044..6afaf7df8 100644
--- a/weed/storage/compact_map.go
+++ b/weed/storage/compact_map.go
@@ -190,18 +190,22 @@ func (cm *CompactMap) binarySearchCompactSection(key Key) int {
// Visit visits all entries or stop if any error when visiting
func (cm *CompactMap) Visit(visit func(NeedleValue) error) error {
for _, cs := range cm.list {
+ cs.RLock()
for _, v := range cs.overflow {
if err := visit(v); err != nil {
+ cs.RUnlock()
return err
}
}
for _, v := range cs.values {
if _, found := cs.overflow[v.Key]; !found {
if err := visit(v); err != nil {
+ cs.RUnlock()
return err
}
}
}
+ cs.RUnlock()
}
return nil
}