diff --git a/.github/workflows/helm-lint.yml b/.github/workflows/helm-lint.yml index 17aaba380..75928bcb1 100644 --- a/.github/workflows/helm-lint.yml +++ b/.github/workflows/helm-lint.yml @@ -14,9 +14,6 @@ concurrency: permissions: contents: read -permissions: - contents: read - jobs: release: runs-on: ubuntu-latest diff --git a/.github/workflows/vulncheck.yml b/.github/workflows/vulncheck.yml index 28664412b..c6f443100 100644 --- a/.github/workflows/vulncheck.yml +++ b/.github/workflows/vulncheck.yml @@ -20,7 +20,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.19.10 + go-version: 1.19.11 check-latest: true - name: Get official govulncheck run: go install golang.org/x/vuln/cmd/govulncheck@latest diff --git a/cmd/erasure-metadata.go b/cmd/erasure-metadata.go index 277986e4f..5b24467fc 100644 --- a/cmd/erasure-metadata.go +++ b/cmd/erasure-metadata.go @@ -350,8 +350,11 @@ func findFileInfoInQuorum(ctx context.Context, metaArr []FileInfo, modTime time. for _, part := range meta.Parts { fmt.Fprintf(h, "part.%d", part.Number) } - fmt.Fprintf(h, "%v+%v", meta.Erasure.DataBlocks, meta.Erasure.ParityBlocks) - fmt.Fprintf(h, "%v", meta.Erasure.Distribution) + + if !meta.Deleted && meta.Size != 0 { + fmt.Fprintf(h, "%v+%v", meta.Erasure.DataBlocks, meta.Erasure.ParityBlocks) + fmt.Fprintf(h, "%v", meta.Erasure.Distribution) + } // ILM transition fields fmt.Fprint(h, meta.TransitionStatus) @@ -499,7 +502,8 @@ func listObjectParities(partsMetadata []FileInfo, errs []error) (parities []int) parities[index] = -1 continue } - if metadata.Deleted { + // Delete marker or zero byte objects take highest parity. + if metadata.Deleted || metadata.Size == 0 { parities[index] = len(partsMetadata) / 2 } else { parities[index] = metadata.Erasure.ParityBlocks diff --git a/cmd/erasure-object.go b/cmd/erasure-object.go index 7bd7c0993..52c081a18 100644 --- a/cmd/erasure-object.go +++ b/cmd/erasure-object.go @@ -278,6 +278,11 @@ func (er erasureObjects) GetObjectNInfo(ctx context.Context, bucket, object stri return gr.WithCleanupFuncs(nsUnlocker), nil } + if objInfo.Size == 0 { + // Zero byte objects don't even need to further initialize pipes etc. + return NewGetObjectReaderFromReader(bytes.NewReader(nil), objInfo, opts) + } + fn, off, length, err := NewGetObjectReader(rs, objInfo, opts) if err != nil { return nil, err