diff --git a/weed/server/filer_server_handlers_write_upload.go b/weed/server/filer_server_handlers_write_upload.go index 79f794110..e34fe27e6 100644 --- a/weed/server/filer_server_handlers_write_upload.go +++ b/weed/server/filer_server_handlers_write_upload.go @@ -64,6 +64,16 @@ func (fs *FilerServer) uploadReaderToChunks(reader io.Reader, startOffset int64, // need to throttle used byte buffer bytesBufferLimitChan <- struct{}{} + // As long as there is an error in the upload of one chunk, it can be terminated early + // uploadErr may be modified in other go routines, lock is needed to avoid race condition + uploadErrLock.Lock() + if uploadErr != nil { + <-bytesBufferLimitChan + uploadErrLock.Unlock() + break + } + uploadErrLock.Unlock() + bytesBuffer := bufPool.Get().(*bytes.Buffer) limitedReader := io.LimitReader(partReader, int64(chunkSize))