fix(filer): propagate proxyChunkId query params to volume server (#10036)

* fix(filer): propagate proxyChunkId query params to volume server

When weed mount reads via filer proxy mode (-volumeServerAccess=filerProxy),
the mount adds query params like readDeleted=true to chunk read requests.

Two bugs prevented these from working:

1. filer_server_handlers.go extracted fileId from the raw RequestURI, which
   includes query params, corrupting the fileId (e.g. '6,abc&readDeleted=true').
   Fix: use r.URL.Query().Get("proxyChunkId") for clean extraction.

2. filer_server_handlers_proxy.go didn't forward query params to the volume
   server. The urlStrings from LookupFileId already contain the fileId in the
   path, so just append the original query string.

* filer: match chunk proxy by query param, not URI prefix order

Order-dependent prefix slicing missed proxyChunkId when it wasn't the
first query param. Gate on root path and read the parsed query value.

* filer: drop internal proxyChunkId from proxied volume query

Lookup URLs already carry the fileId in the path, so forwarding the raw
query duplicated proxyChunkId onto the volume server. Strip it and only
append the remaining caller params (e.g. readDeleted).

---------

Co-authored-by: Chris Lu <chris.lu@gmail.com>
This commit is contained in:
MorezMartin
2026-06-22 11:21:29 -07:00
committed by GitHub
co-authored by Chris Lu
parent 16ba8af0b7
commit 6f1d4af035
2 changed files with 14 additions and 4 deletions
+2 -2
View File
@@ -58,8 +58,8 @@ func (fs *FilerServer) filerHandler(w http.ResponseWriter, r *http.Request) {
// proxy to volume servers
var fileId string
if strings.HasPrefix(r.RequestURI, "/?proxyChunkId=") {
fileId = r.RequestURI[len("/?proxyChunkId="):]
if r.URL.Path == "/" {
fileId = r.URL.Query().Get("proxyChunkId")
}
if fileId != "" {
fs.proxyToVolumeServer(w, r, fileId)
+12 -2
View File
@@ -61,9 +61,19 @@ func (fs *FilerServer) proxyToVolumeServer(w http.ResponseWriter, r *http.Reques
return
}
proxyReq, err := http.NewRequest(r.Method, urlStrings[rand.IntN(len(urlStrings))], r.Body)
// urlStrings from LookupFileId already contain the fileId in the path
// (e.g. http://server:8080/6,08136bdce4). Forward the caller's query params
// (e.g. readDeleted=true from weed mount) but drop the internal proxyChunkId.
targetURL := urlStrings[rand.IntN(len(urlStrings))]
query := r.URL.Query()
query.Del("proxyChunkId")
if encoded := query.Encode(); encoded != "" {
targetURL += "?" + encoded
}
proxyReq, err := http.NewRequest(r.Method, targetURL, r.Body)
if err != nil {
glog.ErrorfCtx(ctx, "NewRequest %s: %v", urlStrings[0], err)
glog.ErrorfCtx(ctx, "NewRequest %s: %v", targetURL, err)
w.WriteHeader(http.StatusInternalServerError)
return
}