From 2d00f7d825e9874e901e324b6799db9835dc72c2 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Fri, 3 Jun 2022 05:59:02 -0700 Subject: [PATCH] honor canceled context and do not leak on mergeChannels (#15034) 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 c3eec6738c6da..b500f473faf5f 100644 --- a/cmd/metacache-entries.go +++ b/cmd/metacache-entries.go @@ -686,8 +686,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 b443167f9833e..32a176f8c3204 100644 --- a/cmd/metacache-server-pool.go +++ b/cmd/metacache-server-pool.go @@ -273,11 +273,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 { @@ -328,6 +328,7 @@ func (z *erasureServerPools) listMerged(ctx context.Context, o listPathOptions, if err != nil { return err } + if contextCanceled(ctx) { return ctx.Err() }