From a2cf25caf7ee0b1a9987975acb2672fa3a56bc5f Mon Sep 17 00:00:00 2001 From: Blake Mizerany Date: Sun, 7 Apr 2024 22:19:22 -0700 Subject: [PATCH] WIP: gross fix --- x/registry/server.go | 21 ++++++++++++++++++--- x/registry/server_test.go | 2 +- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/x/registry/server.go b/x/registry/server.go index 69eae4be..56fda9b2 100644 --- a/x/registry/server.go +++ b/x/registry/server.go @@ -6,11 +6,13 @@ import ( "cmp" "context" "errors" + "fmt" "log" "net/http" "net/url" "path" "strconv" + "strings" "time" "github.com/minio/minio-go/v7" @@ -109,7 +111,10 @@ func (s *Server) handlePush(w http.ResponseWriter, r *http.Request) error { queryPartNumber := q.Get("partNumber") partNumber, err := strconv.Atoi(queryPartNumber) if err != nil { - return oweb.Invalid("partNumber", queryPartNumber, "invalid or missing PartNumber") + return oweb.Invalid("partNumber", queryPartNumber, "") + } + if partNumber < 1 { + return oweb.Invalid("partNumber", queryPartNumber, "must be >= 1") } // ETag is required @@ -128,7 +133,12 @@ func (s *Server) handlePush(w http.ResponseWriter, r *http.Request) error { for uploadID, cp := range completePartsByUploadID { var zeroOpts minio.PutObjectOptions - _, err := mcc.CompleteMultipartUpload(r.Context(), bucketTODO, cp.key, uploadID, cp.parts, zeroOpts) + + // TODO: gross fix!!!!!!!!!!!!!!! + key := strings.TrimPrefix(cp.key, "/"+bucketTODO+"/") + + fmt.Printf("Completing multipart upload %s %s %v\n", bucketTODO, key, cp.parts) + _, err := mcc.CompleteMultipartUpload(r.Context(), bucketTODO, key, uploadID, cp.parts, zeroOpts) if err != nil { var e minio.ErrorResponse if errors.As(err, &e) && e.Code == "NoSuchUpload" { @@ -148,14 +158,17 @@ func (s *Server) handlePush(w http.ResponseWriter, r *http.Request) error { // TODO(bmizerany): "global" throttle of rate of transfer pushed, err := s.statObject(r.Context(), l.Digest) if err != nil { + println("ERROR:", "statObject", err) return err } if !pushed { key := path.Join("blobs", l.Digest) if l.Size < minimumMultipartSize { // single part upload + fmt.Printf("Presigning single %s %s\n", bucketTODO, key) signedURL, err := s.s3().PresignedPutObject(r.Context(), bucketTODO, key, 15*time.Minute) if err != nil { + println("ERROR:", "presign single", err) return err } requirements = append(requirements, apitype.Requirement{ @@ -168,14 +181,16 @@ func (s *Server) handlePush(w http.ResponseWriter, r *http.Request) error { if err != nil { return err } + fmt.Printf("Presigning multi %s %s %s\n", bucketTODO, key, uploadID) for partNumber, c := range upload.Chunks(l.Size, s.uploadChunkSize()) { const timeToStartUpload = 15 * time.Minute signedURL, err := s.s3().Presign(r.Context(), "PUT", bucketTODO, key, timeToStartUpload, url.Values{ - "uploadId": []string{uploadID}, "partNumber": []string{strconv.Itoa(partNumber)}, + "uploadId": []string{uploadID}, }) if err != nil { + println("ERROR:", "presign multi", err) return err } diff --git a/x/registry/server_test.go b/x/registry/server_test.go index 114eab79..0d2c6563 100644 --- a/x/registry/server_test.go +++ b/x/registry/server_test.go @@ -156,7 +156,7 @@ func TestPushBasic(t *testing.T) { Layers: []apitype.Layer{ {Digest: "sha256-1", Size: 1}, {Digest: "sha256-2", Size: 2}, - {Digest: "sha256-3", Size: 3}, + {Digest: "sha256-3", Size: 11000000}, }, })