diff options
| author | Chris Lu <chris.lu@gmail.com> | 2020-12-25 02:32:52 -0800 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2020-12-25 02:32:55 -0800 |
| commit | 0a067944cc5fb022943aaf9b7afcffb1ce6dba51 (patch) | |
| tree | 6b6aebe4483fced2fc88022827870734c9e70c43 | |
| parent | 1b1d18246962b89b9d2339e0611a8789d7e4423b (diff) | |
| download | seaweedfs-0a067944cc5fb022943aaf9b7afcffb1ce6dba51.tar.xz seaweedfs-0a067944cc5fb022943aaf9b7afcffb1ce6dba51.zip | |
filer: add retries during volume moving
fix https://github.com/chrislusf/seaweedfs/issues/1704
| -rw-r--r-- | weed/server/filer_server_handlers_write_autochunk.go | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/weed/server/filer_server_handlers_write_autochunk.go b/weed/server/filer_server_handlers_write_autochunk.go index 82c6c11b4..eee39152b 100644 --- a/weed/server/filer_server_handlers_write_autochunk.go +++ b/weed/server/filer_server_handlers_write_autochunk.go @@ -209,17 +209,36 @@ func (fs *FilerServer) uploadReaderToChunks(w http.ResponseWriter, r *http.Reque for { limitedReader := io.LimitReader(partReader, int64(chunkSize)) - // assign one file id for one chunk - fileId, urlLocation, auth, assignErr := fs.assignNewFileInfo(so) - if assignErr != nil { - return nil, nil, 0, assignErr, nil + data, err := ioutil.ReadAll(limitedReader) + if err != nil { + return nil, nil, 0, err, nil } + dataReader := util.NewBytesReader(data) + + // retry to assign a different file id + var fileId, urlLocation string + var auth security.EncodedJwt + var assignErr, uploadErr error + var uploadResult *operation.UploadResult + for i := 0; i < 3; i++ { + // assign one file id for one chunk + fileId, urlLocation, auth, assignErr = fs.assignNewFileInfo(so) + if assignErr != nil { + return nil, nil, 0, assignErr, nil + } - // upload the chunk to the volume server - uploadResult, uploadErr, data := fs.doUpload(urlLocation, w, r, limitedReader, fileName, contentType, nil, auth) + // upload the chunk to the volume server + uploadResult, uploadErr, _ = fs.doUpload(urlLocation, w, r, dataReader, fileName, contentType, nil, auth) + if uploadErr != nil { + time.Sleep(251 * time.Millisecond) + continue + } + break + } if uploadErr != nil { return nil, nil, 0, uploadErr, nil } + content = data // if last chunk exhausted the reader exactly at the border |
