From abd999f64afb22770626630aed471cdfd8d40d67 Mon Sep 17 00:00:00 2001 From: Klaus Post Date: Thu, 2 Jul 2020 10:29:50 -0700 Subject: [PATCH] fix: list object versions in distributed setup (#9958) Remove calls to `WalkVersions` was calling the wrong endpoint, so unless quorum could be reached with local disks no results would ever be returned. --- cmd/erasure-sets.go | 1 + cmd/storage-rest-client.go | 6 ++++-- cmd/storage-rest-server.go | 9 +++------ cmd/xl-storage.go | 12 ++---------- 4 files changed, 10 insertions(+), 18 deletions(-) diff --git a/cmd/erasure-sets.go b/cmd/erasure-sets.go index 42462decd..731841186 100644 --- a/cmd/erasure-sets.go +++ b/cmd/erasure-sets.go @@ -942,6 +942,7 @@ func (s *erasureSets) startMergeWalksVersionsN(ctx context.Context, bucket, pref } entryCh, err := disk.WalkVersions(bucket, prefix, marker, recursive, endWalkCh) if err != nil { + logger.LogIf(ctx, err) // Disk walk returned error, ignore it. continue } diff --git a/cmd/storage-rest-client.go b/cmd/storage-rest-client.go index 924f32c09..7e35ed6fb 100644 --- a/cmd/storage-rest-client.go +++ b/cmd/storage-rest-client.go @@ -454,7 +454,7 @@ func (client *storageRESTClient) WalkVersions(volume, dirPath, marker string, re values.Set(storageRESTDirPath, dirPath) values.Set(storageRESTMarkerPath, marker) values.Set(storageRESTRecursive, strconv.FormatBool(recursive)) - respBody, err := client.call(storageRESTMethodWalk, values, nil, -1) + respBody, err := client.call(storageRESTMethodWalkVersions, values, nil, -1) if err != nil { return nil, err } @@ -469,6 +469,9 @@ func (client *storageRESTClient) WalkVersions(volume, dirPath, marker string, re var fi FileInfoVersions if gerr := decoder.Decode(&fi); gerr != nil { // Upon error return + if gerr != io.EOF { + logger.LogIf(context.Background(), gerr) + } return } select { @@ -476,7 +479,6 @@ func (client *storageRESTClient) WalkVersions(volume, dirPath, marker string, re case <-endWalkCh: return } - } }() diff --git a/cmd/storage-rest-server.go b/cmd/storage-rest-server.go index fb4ba8400..d5c016851 100644 --- a/cmd/storage-rest-server.go +++ b/cmd/storage-rest-server.go @@ -526,7 +526,6 @@ func (s *storageRESTServer) WalkSplunkHandler(w http.ResponseWriter, r *http.Req for fi := range fch { encoder.Encode(&fi) } - w.(http.Flusher).Flush() } // WalkVersionsHandler - remote caller to start walking at a requested directory path. @@ -553,9 +552,8 @@ func (s *storageRESTServer) WalkVersionsHandler(w http.ResponseWriter, r *http.R return } for fi := range fch { - encoder.Encode(&fi) + logger.LogIf(r.Context(), encoder.Encode(&fi)) } - w.(http.Flusher).Flush() } // WalkHandler - remote caller to start walking at a requested directory path. @@ -582,9 +580,8 @@ func (s *storageRESTServer) WalkHandler(w http.ResponseWriter, r *http.Request) return } for fi := range fch { - encoder.Encode(&fi) + logger.LogIf(r.Context(), encoder.Encode(&fi)) } - w.(http.Flusher).Flush() } // ListDirHandler - list a directory. @@ -889,7 +886,7 @@ func registerStorageRESTHandlers(router *mux.Router, endpointZones EndpointZones subrouter.Methods(http.MethodPost).Path(storageRESTVersionPrefix + storageRESTMethodWalkSplunk).HandlerFunc(httpTraceHdrs(server.WalkSplunkHandler)). Queries(restQueries(storageRESTVolume, storageRESTDirPath, storageRESTMarkerPath)...) subrouter.Methods(http.MethodPost).Path(storageRESTVersionPrefix + storageRESTMethodWalkVersions).HandlerFunc(httpTraceHdrs(server.WalkVersionsHandler)). - Queries(restQueries(storageRESTVolume, storageRESTDirPath, storageRESTMarkerPath)...) + Queries(restQueries(storageRESTVolume, storageRESTDirPath, storageRESTMarkerPath, storageRESTRecursive)...) subrouter.Methods(http.MethodPost).Path(storageRESTVersionPrefix + storageRESTMethodDeleteVersions).HandlerFunc(httpTraceHdrs(server.DeleteVersionsHandler)). Queries(restQueries(storageRESTVolume, storageRESTTotalVersions)...) diff --git a/cmd/xl-storage.go b/cmd/xl-storage.go index 4dbef0fae..5bed6908f 100644 --- a/cmd/xl-storage.go +++ b/cmd/xl-storage.go @@ -901,11 +901,7 @@ func (s *xlStorage) WalkVersions(volume, dirPath, marker string, recursive bool, } walkResultCh := startTreeWalk(GlobalContext, volume, dirPath, marker, recursive, listDir, endWalkCh) - for { - walkResult, ok := <-walkResultCh - if !ok { - return - } + for walkResult := range walkResultCh { var fiv FileInfoVersions if HasSuffix(walkResult.entry, SlashSeparator) { fiv = FileInfoVersions{ @@ -981,11 +977,7 @@ func (s *xlStorage) Walk(volume, dirPath, marker string, recursive bool, endWalk } walkResultCh := startTreeWalk(GlobalContext, volume, dirPath, marker, recursive, listDir, endWalkCh) - for { - walkResult, ok := <-walkResultCh - if !ok { - return - } + for walkResult := range walkResultCh { var fi FileInfo if HasSuffix(walkResult.entry, SlashSeparator) { fi = FileInfo{