aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhoverseu <529079728@qq.com>2025-03-10 11:38:26 +0800
committerGitHub <noreply@github.com>2025-03-09 20:38:26 -0700
commit14cb8a24c68ce3fd0d3df716295805a8c5c1b8ef (patch)
tree2a9814c561f0879aad1cdd4d7bf52f6e0e55fb3b
parent271505717e8292e909b2daf7d63c56babdb17e00 (diff)
downloadseaweedfs-14cb8a24c68ce3fd0d3df716295805a8c5c1b8ef.tar.xz
seaweedfs-14cb8a24c68ce3fd0d3df716295805a8c5c1b8ef.zip
[filer] UploadRequestToChunks: terminate the upload of remaining chunks as early as possible might be more reasonable when one chunk upload goroutine encounters a failure. (#6610)
-rw-r--r--weed/server/filer_server_handlers_write_upload.go10
1 files changed, 10 insertions, 0 deletions
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))