Browse Source

avoid concurrent access to map object

fix https://github.com/chrislusf/seaweedfs/issues/2866
pull/2869/head
chrislu 3 years ago
parent
commit
e8d7bb42e2
  1. 7
      weed/mount/page_writer/page_chunk_swapfile.go

7
weed/mount/page_writer/page_chunk_swapfile.go

@ -5,6 +5,7 @@ import (
"github.com/chrislusf/seaweedfs/weed/util" "github.com/chrislusf/seaweedfs/weed/util"
"github.com/chrislusf/seaweedfs/weed/util/mem" "github.com/chrislusf/seaweedfs/weed/util/mem"
"os" "os"
"sync"
) )
var ( var (
@ -17,6 +18,7 @@ type SwapFile struct {
dir string dir string
file *os.File file *os.File
logicToActualChunkIndex map[LogicChunkIndex]ActualChunkIndex logicToActualChunkIndex map[LogicChunkIndex]ActualChunkIndex
logicToActualChunkIndexLock sync.Mutex
chunkSize int64 chunkSize int64
freeActualChunkList []ActualChunkIndex freeActualChunkList []ActualChunkIndex
} }
@ -52,6 +54,8 @@ func (sf *SwapFile) NewTempFileChunk(logicChunkIndex LogicChunkIndex) (tc *SwapF
return nil return nil
} }
} }
sf.logicToActualChunkIndexLock.Lock()
defer sf.logicToActualChunkIndexLock.Unlock()
actualChunkIndex, found := sf.logicToActualChunkIndex[logicChunkIndex] actualChunkIndex, found := sf.logicToActualChunkIndex[logicChunkIndex]
if !found { if !found {
if len(sf.freeActualChunkList) > 0 { if len(sf.freeActualChunkList) > 0 {
@ -72,6 +76,9 @@ func (sf *SwapFile) NewTempFileChunk(logicChunkIndex LogicChunkIndex) (tc *SwapF
} }
func (sc *SwapFileChunk) FreeResource() { func (sc *SwapFileChunk) FreeResource() {
sc.swapfile.logicToActualChunkIndexLock.Lock()
defer sc.swapfile.logicToActualChunkIndexLock.Unlock()
sc.swapfile.freeActualChunkList = append(sc.swapfile.freeActualChunkList, sc.actualChunkIndex) sc.swapfile.freeActualChunkList = append(sc.swapfile.freeActualChunkList, sc.actualChunkIndex)
delete(sc.swapfile.logicToActualChunkIndex, sc.logicChunkIndex) delete(sc.swapfile.logicToActualChunkIndex, sc.logicChunkIndex)
} }

Loading…
Cancel
Save