From f234455b7653030a20d6cd2b1209e1035a1f87b9 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 1 Nov 2025 23:25:56 -0700 Subject: [PATCH] Filer: separate context for streaming (#7423) * separate context for streaming * Update weed/server/filer_server_handlers_read.go Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- weed/server/filer_server_handlers_read.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/weed/server/filer_server_handlers_read.go b/weed/server/filer_server_handlers_read.go index 92aadcfc8..5f886afa9 100644 --- a/weed/server/filer_server_handlers_read.go +++ b/weed/server/filer_server_handlers_read.go @@ -1,6 +1,7 @@ package weed_server import ( + "context" "encoding/base64" "encoding/hex" "errors" @@ -287,13 +288,20 @@ func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request) } } - streamFn, err := filer.PrepareStreamContentWithThrottler(ctx, fs.filer.MasterClient, fs.maybeGetVolumeReadJwtAuthorizationToken, chunks, offset, size, fs.option.DownloadMaxBytesPs) + // Use a detached context for streaming so client disconnects/cancellations don't abort volume server operations, + // while preserving request-scoped values like tracing IDs. + // Matches S3 API behavior. Request context (ctx) is used for metadata operations above. + streamCtx, streamCancel := context.WithCancel(context.WithoutCancel(ctx)) + + streamFn, err := filer.PrepareStreamContentWithThrottler(streamCtx, fs.filer.MasterClient, fs.maybeGetVolumeReadJwtAuthorizationToken, chunks, offset, size, fs.option.DownloadMaxBytesPs) if err != nil { + streamCancel() stats.FilerHandlerCounter.WithLabelValues(stats.ErrorReadStream).Inc() glog.ErrorfCtx(ctx, "failed to prepare stream content %s: %v", r.URL, err) return nil, err } return func(writer io.Writer) error { + defer streamCancel() err := streamFn(writer) if err != nil { stats.FilerHandlerCounter.WithLabelValues(stats.ErrorReadStream).Inc()