From 14bb969782f404ce009ec8c996cf141c8eee19ae Mon Sep 17 00:00:00 2001 From: Klaus Post Date: Mon, 21 Jun 2021 09:25:10 -0700 Subject: [PATCH] lock on multi pool object creation (#12541) Create write lock on PutObject and CopyObject when on multi-pool setup. Use the same lock as NewMultipartUpload so all creation calls share the same lock. --- cmd/erasure-server-pool.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/cmd/erasure-server-pool.go b/cmd/erasure-server-pool.go index 0758b7863..cdb479afb 100644 --- a/cmd/erasure-server-pool.go +++ b/cmd/erasure-server-pool.go @@ -783,6 +783,16 @@ func (z *erasureServerPools) PutObject(ctx context.Context, bucket string, objec } return z.serverPools[0].PutObject(ctx, bucket, object, data, opts) } + if !opts.NoLock { + ns := z.NewNSLock(minioMetaMultipartBucket, pathJoin(bucket, object, "newMultipartObject.lck")) + lkctx, err := ns.GetLock(ctx, globalOperationTimeout) + if err != nil { + return ObjectInfo{}, err + } + ctx = lkctx.Context() + defer ns.Unlock(lkctx.Cancel) + opts.NoLock = true + } idx, err := z.getPoolIdx(ctx, bucket, object, data.Size()) if err != nil { @@ -894,6 +904,17 @@ func (z *erasureServerPools) CopyObject(ctx context.Context, srcBucket, srcObjec cpSrcDstSame := isStringEqual(pathJoin(srcBucket, srcObject), pathJoin(dstBucket, dstObject)) + if !dstOpts.NoLock { + ns := z.NewNSLock(minioMetaMultipartBucket, pathJoin(dstBucket, dstObject, "newMultipartObject.lck")) + lkctx, err := ns.GetLock(ctx, globalOperationTimeout) + if err != nil { + return ObjectInfo{}, err + } + ctx = lkctx.Context() + defer ns.Unlock(lkctx.Cancel) + dstOpts.NoLock = true + } + poolIdx, err := z.getPoolIdx(ctx, dstBucket, dstObject, srcInfo.Size) if err != nil { return objInfo, err