diff options
| author | Sébastien <s.berthier@bee-buzziness.com> | 2024-01-29 19:35:52 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-01-29 10:35:52 -0800 |
| commit | 0775d05a23b61a23f9a7f3fb180ec6d96fa94430 (patch) | |
| tree | c5cd1d9bbb914e511f2243f471a7a8b1f5c02708 /weed/server/filer_server_handlers_read.go | |
| parent | e5c0680dbcd250f69ab414cd14ee3ecc859c5dcf (diff) | |
| download | seaweedfs-0775d05a23b61a23f9a7f3fb180ec6d96fa94430.tar.xz seaweedfs-0775d05a23b61a23f9a7f3fb180ec6d96fa94430.zip | |
fix: http range request return status 500 (#5251)
When volume server unavailable for at least one chunk; was returning status 206.
Split `StreamContent` in two parts,
- first prepare, to get chunk info and return stream function
- then write chunk, with that stream function
That allow to catch error in first step before setting response status code in `processRangeRequest`
Diffstat (limited to 'weed/server/filer_server_handlers_read.go')
| -rw-r--r-- | weed/server/filer_server_handlers_read.go | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/weed/server/filer_server_handlers_read.go b/weed/server/filer_server_handlers_read.go index f5f652f83..d1cd3beae 100644 --- a/weed/server/filer_server_handlers_read.go +++ b/weed/server/filer_server_handlers_read.go @@ -231,14 +231,16 @@ func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request) } } - processRangeRequest(r, w, totalSize, mimeType, func(writer io.Writer, offset int64, size int64) error { + processRangeRequest(r, w, totalSize, mimeType, func(offset int64, size int64) (filer.DoStreamContent, error) { if offset+size <= int64(len(entry.Content)) { - _, err := writer.Write(entry.Content[offset : offset+size]) - if err != nil { - stats.FilerHandlerCounter.WithLabelValues(stats.ErrorWriteEntry).Inc() - glog.Errorf("failed to write entry content: %v", err) - } - return err + return func(writer io.Writer) error { + _, err := writer.Write(entry.Content[offset : offset+size]) + if err != nil { + stats.FilerHandlerCounter.WithLabelValues(stats.ErrorWriteEntry).Inc() + glog.Errorf("failed to write entry content: %v", err) + } + return err + }, nil } chunks := entry.GetChunks() if entry.IsInRemoteOnly() { @@ -249,17 +251,25 @@ func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request) }); err != nil { stats.FilerHandlerCounter.WithLabelValues(stats.ErrorReadCache).Inc() glog.Errorf("CacheRemoteObjectToLocalCluster %s: %v", entry.FullPath, err) - return fmt.Errorf("cache %s: %v", entry.FullPath, err) + return nil, fmt.Errorf("cache %s: %v", entry.FullPath, err) } else { chunks = resp.Entry.GetChunks() } } - err = filer.StreamContentWithThrottler(fs.filer.MasterClient, writer, chunks, offset, size, fs.option.DownloadMaxBytesPs) + streamFn, err := filer.PrepareStreamContentWithThrottler(fs.filer.MasterClient, chunks, offset, size, fs.option.DownloadMaxBytesPs) if err != nil { stats.FilerHandlerCounter.WithLabelValues(stats.ErrorReadStream).Inc() - glog.Errorf("failed to stream content %s: %v", r.URL, err) + glog.Errorf("failed to prepare stream content %s: %v", r.URL, err) + return nil, err } - return err + return func(writer io.Writer) error { + err := streamFn(writer) + if err != nil { + stats.FilerHandlerCounter.WithLabelValues(stats.ErrorReadStream).Inc() + glog.Errorf("failed to stream content %s: %v", r.URL, err) + } + return err + }, nil }) } |
