From 59812446adb49beb23e557cc70b071dc721743f3 Mon Sep 17 00:00:00 2001 From: Feng Ruohang Date: Wed, 2 Sep 2026 01:32:27 +0800 Subject: [PATCH] fix: surface metadata migration failures after locking Degrade to the loaded in-memory configuration only when the short migration lock cannot be acquired. Preserve parse, I/O, KMS, and persistence errors once the lock is held. Signed-off-by: Feng Ruohang --- cmd/bucket-metadata.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/cmd/bucket-metadata.go b/cmd/bucket-metadata.go index 9a3024357..c311b048e 100644 --- a/cmd/bucket-metadata.go +++ b/cmd/bucket-metadata.go @@ -254,6 +254,9 @@ func loadBucketMetadataParse(ctx context.Context, objectAPI ObjectLayer, bucket if lockErr == nil { return migrated, nil } + if !errors.Is(lockErr, errBucketMetadataMigrationLockUnavailable) { + return b, lockErr + } internalLogOnceIf(ctx, fmt.Errorf("unable to persist bucket metadata migration for %s, using the legacy configuration in memory: %w", bucket, lockErr), "bucket-metadata-migration-lock-"+bucket) b.applyLegacyConfigs(configs) } else if err = b.convertLegacyConfigs(ctx, objectAPI, configs); err != nil { @@ -281,6 +284,9 @@ func loadBucketMetadataParse(ctx context.Context, objectAPI ObjectLayer, bucket if lockErr == nil { return migrated, nil } + if !errors.Is(lockErr, errBucketMetadataMigrationLockUnavailable) { + return b, lockErr + } internalLogOnceIf(ctx, fmt.Errorf("unable to persist encrypted bucket target metadata for %s, using the existing configuration in memory: %w", bucket, lockErr), "bucket-metadata-migration-lock-"+bucket) return b, nil } @@ -294,13 +300,14 @@ func loadBucketMetadataParse(ctx context.Context, objectAPI ObjectLayer, bucket func loadBucketMetadataParseUnderLock(ctx context.Context, objectAPI ObjectLayer, bucket string, parse bool) (BucketMetadata, error) { ctx, unlock, err := lockBucketMetadataWithTimeout(ctx, objectAPI, bucket, bucketMetadataMigrationTimeout) if err != nil { - return newBucketMetadata(bucket), err + return newBucketMetadata(bucket), fmt.Errorf("%w: %v", errBucketMetadataMigrationLockUnavailable, err) } defer unlock() return loadBucketMetadataParse(ctx, objectAPI, bucket, parse) } var bucketMetadataMigrationTimeout = newDynamicTimeout(5*time.Second, time.Second) +var errBucketMetadataMigrationLockUnavailable = errors.New("bucket metadata migration lock unavailable") // loadBucketMetadata loads and migrates to bucket metadata. func loadBucketMetadata(ctx context.Context, objectAPI ObjectLayer, bucket string) (BucketMetadata, error) {