From 3611125a5087f8e3635c25925e869c082c906c77 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Thu, 2 Jun 2022 20:55:50 -0700 Subject: [PATCH] honor canceled context and do not leak on mergeChannels mergeEntryChannels has the potential to perpetually wait on the results channel, context might be closed and we did not honor the caller context canceling. --- cmd/metacache-entries.go | 8 ++++++-- cmd/metacache-server-pool.go | 7 ++++--- 2 files changed, 10 insertions(+), 5 deletions(-) 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() }