diff --git a/go.mod b/go.mod index ab8797e6f..87ba388b4 100644 --- a/go.mod +++ b/go.mod @@ -22,6 +22,7 @@ require ( github.com/gofrs/flock v0.12.1 github.com/gosuri/uitable v0.0.4 github.com/jmoiron/sqlx v1.4.0 + github.com/klauspost/compress v1.18.0 github.com/lib/pq v1.10.9 github.com/mattn/go-shellwords v1.0.12 github.com/mitchellh/copystructure v1.2.0 @@ -101,7 +102,6 @@ require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.18.0 // indirect github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect diff --git a/helm b/helm new file mode 100755 index 000000000..a981ec48b Binary files /dev/null and b/helm differ diff --git a/pkg/storage/driver/util.go b/pkg/storage/driver/util.go index ca8e23cc2..498ae7b3a 100644 --- a/pkg/storage/driver/util.go +++ b/pkg/storage/driver/util.go @@ -24,24 +24,29 @@ import ( "io" "slices" - rspb "helm.sh/helm/v4/pkg/release/v1" + "github.com/klauspost/compress/zstd" + + rspb "helm.sh/helm/v3/pkg/release" ) var b64 = base64.StdEncoding -var magicGzip = []byte{0x1f, 0x8b, 0x08} +var ( + magicGzip = []byte{0x1f, 0x8b, 0x08} + magicZstd = []byte{0x28, 0xb5, 0x2f, 0xfd} +) var systemLabels = []string{"name", "owner", "status", "version", "createdAt", "modifiedAt"} // encodeRelease encodes a release returning a base64 encoded -// gzipped string representation, or error. +// zstded string representation, or error. func encodeRelease(rls *rspb.Release) (string, error) { b, err := json.Marshal(rls) if err != nil { return "", err } var buf bytes.Buffer - w, err := gzip.NewWriterLevel(&buf, gzip.BestCompression) + w, err := zstd.NewWriter(&buf, zstd.WithEncoderLevel(zstd.SpeedBestCompression)) if err != nil { return "", err } @@ -63,10 +68,21 @@ func decodeRelease(data string) (*rspb.Release, error) { return nil, err } - // For backwards compatibility with releases that were stored before - // compression was introduced we skip decompression if the - // gzip magic header is not found - if len(b) > 3 && bytes.Equal(b[0:3], magicGzip) { + switch { + case len(b) > 4 && bytes.Equal(b[0:4], magicZstd): + // Handle zstd compressed data + r, err := zstd.NewReader(bytes.NewReader(b)) + if err != nil { + return nil, err + } + defer r.Close() + b2, err := io.ReadAll(r) + if err != nil { + return nil, err + } + b = b2 + case len(b) > 3 && bytes.Equal(b[0:3], magicGzip): + // Handle gzip compressed data r, err := gzip.NewReader(bytes.NewReader(b)) if err != nil { return nil, err @@ -77,6 +93,8 @@ func decodeRelease(data string) (*rspb.Release, error) { return nil, err } b = b2 + default: + // Handle uncompressed data for backwards compatibility } var rls rspb.Release