Browse Source

avoid data race access to uploadReaderToChunks.uploadErr (#3550)

avoid data race access to uploadErr
https://github.com/seaweedfs/seaweedfs/issues/3549
pull/3551/merge
Konstantin Lebedev 2 years ago
committed by GitHub
parent
commit
105702ebe0
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 9
      weed/server/filer_server_handlers_write_upload.go

9
weed/server/filer_server_handlers_write_upload.go

@ -52,6 +52,7 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque
var bytesBufferCounter int64 var bytesBufferCounter int64
bytesBufferLimitCond := sync.NewCond(new(sync.Mutex)) bytesBufferLimitCond := sync.NewCond(new(sync.Mutex))
var fileChunksLock sync.Mutex var fileChunksLock sync.Mutex
var uploadErrLock sync.Mutex
for { for {
// need to throttle used byte buffer // need to throttle used byte buffer
@ -77,7 +78,9 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque
bufPool.Put(bytesBuffer) bufPool.Put(bytesBuffer)
atomic.AddInt64(&bytesBufferCounter, -1) atomic.AddInt64(&bytesBufferCounter, -1)
bytesBufferLimitCond.Signal() bytesBufferLimitCond.Signal()
uploadErrLock.Lock()
uploadErr = err uploadErr = err
uploadErrLock.Unlock()
break break
} }
if chunkOffset == 0 && !isAppend { if chunkOffset == 0 && !isAppend {
@ -105,9 +108,13 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque
}() }()
chunk, toChunkErr := fs.dataToChunk(fileName, contentType, bytesBuffer.Bytes(), offset, so) chunk, toChunkErr := fs.dataToChunk(fileName, contentType, bytesBuffer.Bytes(), offset, so)
if uploadErr == nil && toChunkErr != nil {
if toChunkErr != nil {
uploadErrLock.Lock()
if uploadErr == nil {
uploadErr = toChunkErr uploadErr = toChunkErr
} }
uploadErrLock.Unlock()
}
if chunk != nil { if chunk != nil {
fileChunksLock.Lock() fileChunksLock.Lock()
fileChunks = append(fileChunks, chunk) fileChunks = append(fileChunks, chunk)

Loading…
Cancel
Save