From 83b2ad418b15ff0fa78175e2014d78d02046edd8 Mon Sep 17 00:00:00 2001 From: jiuker <2818723467@qq.com> Date: Sat, 19 Jul 2025 14:25:44 +0800 Subject: [PATCH] fix: restrict SinglePool by the minimum free drive threshold (#21115) --- cmd/erasure-server-pool.go | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/cmd/erasure-server-pool.go b/cmd/erasure-server-pool.go index 288273728..4a3f095d9 100644 --- a/cmd/erasure-server-pool.go +++ b/cmd/erasure-server-pool.go @@ -635,15 +635,18 @@ func (z *erasureServerPools) getPoolIdxNoLock(ctx context.Context, bucket, objec // if none are found falls back to most available space pool, this function is // designed to be only used by PutObject, CopyObject (newObject creation) and NewMultipartUpload. func (z *erasureServerPools) getPoolIdx(ctx context.Context, bucket, object string, size int64) (idx int, err error) { - idx, err = z.getPoolIdxExistingWithOpts(ctx, bucket, object, ObjectOptions{ + pinfo, _, err := z.getPoolInfoExistingWithOpts(ctx, bucket, object, ObjectOptions{ SkipDecommissioned: true, SkipRebalancing: true, }) + if err != nil && !isErrObjectNotFound(err) { - return idx, err + return -1, err } - if isErrObjectNotFound(err) { + idx = pinfo.Index + if isErrObjectNotFound(err) || pinfo.Err == nil { + // will generate a temp object idx = z.getAvailablePoolIdx(ctx, bucket, object, size) if idx < 0 { return -1, toObjectErr(errDiskFull) @@ -1089,6 +1092,10 @@ func (z *erasureServerPools) PutObject(ctx context.Context, bucket string, objec object = encodeDirObject(object) if z.SinglePool() { + _, err := z.getPoolIdx(ctx, bucket, object, data.Size()) + if err != nil { + return ObjectInfo{}, err + } return z.serverPools[0].PutObject(ctx, bucket, object, data, opts) } @@ -1816,6 +1823,10 @@ func (z *erasureServerPools) PutObjectPart(ctx context.Context, bucket, object, } if z.SinglePool() { + _, err := z.getPoolIdx(ctx, bucket, object, data.Size()) + if err != nil { + return PartInfo{}, err + } return z.serverPools[0].PutObjectPart(ctx, bucket, object, uploadID, partID, data, opts) }