diff options
| author | Chris Lu <chris.lu@gmail.com> | 2016-06-23 09:10:25 -0700 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2016-06-23 09:10:25 -0700 |
| commit | 101e784577f9ebdc38d530b64c92e09da76e11be (patch) | |
| tree | d3e990dc057984220fff31f4b9d8340169ce6ecc | |
| parent | 356b8048c57c7b6e676148892f5ff5031b2178b0 (diff) | |
| download | seaweedfs-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.go | 4 |
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 } |
