From 1e037883b0d61439ca8c8569969c3c3f8ff7544f Mon Sep 17 00:00:00 2001 From: Anis Elleuch Date: Tue, 10 May 2022 15:47:40 +0100 Subject: [PATCH] pools: GetObjectNInfo should cover locking during object read (#14887) In case of multi-pools setup, GetObjectNInfo returns a GetObjectReader but it unlocks the read lock when quitting GetObjectNInfo. This should not happen, unlock should only happen when GetObjectReader is closed. --- cmd/erasure-server-pool.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/cmd/erasure-server-pool.go b/cmd/erasure-server-pool.go index aa97b8372..03af7844e 100644 --- a/cmd/erasure-server-pool.go +++ b/cmd/erasure-server-pool.go @@ -774,7 +774,16 @@ func (z *erasureServerPools) GetObjectNInfo(ctx context.Context, bucket, object } lockType = noLock // do not take locks at lower levels for GetObjectNInfo() - return z.serverPools[zIdx].GetObjectNInfo(ctx, bucket, object, rs, h, lockType, opts) + gr, err = z.serverPools[zIdx].GetObjectNInfo(ctx, bucket, object, rs, h, lockType, opts) + if err != nil { + return nil, err + } + + if unlockOnDefer { + unlockOnDefer = false + return gr.WithCleanupFuncs(nsUnlocker), nil + } + return gr, nil } // getLatestObjectInfoWithIdx returns the objectInfo of the latest object from multiple pools (this function