diff --git a/cmd/metacache-entries.go b/cmd/metacache-entries.go index 41c3da3b1a9f4..3bad979cffc02 100644 --- a/cmd/metacache-entries.go +++ b/cmd/metacache-entries.go @@ -695,8 +695,12 @@ func mergeEntryChannels(ctx context.Context, in []chan metaCacheEntry, out chan< } } if best.name > last { - out <- *best - last = best.name + select { + case <-ctxDone: + return ctx.Err() + case out <- *best: + last = best.name + } } else if serverDebugLog { console.Debugln("mergeEntryChannels: discarding duplicate", best.name, "<=", last) } diff --git a/cmd/metacache-server-pool.go b/cmd/metacache-server-pool.go index 82998f86f7397..b4b782ad1ef0d 100644 --- a/cmd/metacache-server-pool.go +++ b/cmd/metacache-server-pool.go @@ -554,11 +554,11 @@ func (z *erasureServerPools) listMerged(ctx context.Context, o listPathOptions, for _, pool := range z.serverPools { for _, set := range pool.sets { wg.Add(1) - results := make(chan metaCacheEntry, 100) - inputs = append(inputs, results) + innerResults := make(chan metaCacheEntry, 100) + inputs = append(inputs, innerResults) go func(i int, set *erasureObjects) { defer wg.Done() - err := set.listPath(listCtx, o, results) + err := set.listPath(listCtx, o, innerResults) mu.Lock() defer mu.Unlock() if err == nil { @@ -609,6 +609,7 @@ func (z *erasureServerPools) listMerged(ctx context.Context, o listPathOptions, if err != nil { return err } + if contextCanceled(ctx) { return ctx.Err() }