From cb85461c420d87107a63c469a7fcc1400cedd774 Mon Sep 17 00:00:00 2001 From: Julien Laurenceau Date: Mon, 12 Oct 2026 17:24:40 +0200 Subject: [PATCH] test: cover renameData commit-metadata-missing conversion Drive renameData() with stub disks to assert that an in-quorum errCommitMetaMissing is converted to errErasureWriteQuorum (HTTP 503) and that an in-quorum errFileNotFound still surfaces unchanged so PutObject() keeps returning IncompleteBody for client disconnects. Signed-off-by: Julien Laurenceau --- cmd/erasure-metadata-utils_test.go | 43 ++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/cmd/erasure-metadata-utils_test.go b/cmd/erasure-metadata-utils_test.go index 8fc1b4be9..917d8249b 100644 --- a/cmd/erasure-metadata-utils_test.go +++ b/cmd/erasure-metadata-utils_test.go @@ -140,6 +140,49 @@ func TestReduceWriteQuorumErrsCommitMetaMissing(t *testing.T) { } } +// renameDataFailingDisk is a StorageAPI stub returning a fixed error +// from RenameData, enough to drive renameData() in unit tests. +type renameDataFailingDisk struct { + StorageAPI + err error +} + +func (d *renameDataFailingDisk) RenameData(context.Context, string, string, FileInfo, string, string, RenameOptions) (RenameDataResp, error) { + return RenameDataResp{}, d.err +} + +func (d *renameDataFailingDisk) DeleteVersion(context.Context, string, string, FileInfo, bool, DeleteOptions) error { + return nil +} + +// TestRenameDataCommitMetaMissing verifies that renameData() converts an +// in-quorum errCommitMetaMissing into errErasureWriteQuorum (HTTP 503), +// while an in-quorum errFileNotFound keeps its meaning so that +// PutObject() still reports IncompleteBody for client disconnects. +func TestRenameDataCommitMetaMissing(t *testing.T) { + metadata := make([]FileInfo, 16) + for i := range metadata { + metadata[i] = FileInfo{Deleted: true} // valid without erasure info + } + + disks := make([]StorageAPI, 16) + for i := range disks { + disks[i] = &renameDataFailingDisk{err: errCommitMetaMissing} + } + _, _, _, err := renameData(t.Context(), disks, minioMetaTmpBucket, "tmp", metadata, "bucket", "object", 9) + if !errors.Is(err, errErasureWriteQuorum) { + t.Fatalf("expected %s for in-quorum commit failure, got %v", errErasureWriteQuorum, err) + } + + for i := range disks { + disks[i] = &renameDataFailingDisk{err: errFileNotFound} + } + _, _, _, err = renameData(t.Context(), disks, minioMetaTmpBucket, "tmp", metadata, "bucket", "object", 9) + if !errors.Is(err, errFileNotFound) { + t.Fatalf("expected %s for in-quorum staging failure, got %v", errFileNotFound, err) + } +} + // TestHashOrder - test order of ints in array func TestHashOrder(t *testing.T) { testCases := []struct {