WIP: gross fix
This commit is contained in:
parent
aca112a308
commit
a2cf25caf7
@ -6,11 +6,13 @@ import (
|
|||||||
"cmp"
|
"cmp"
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"path"
|
"path"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/minio/minio-go/v7"
|
"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")
|
queryPartNumber := q.Get("partNumber")
|
||||||
partNumber, err := strconv.Atoi(queryPartNumber)
|
partNumber, err := strconv.Atoi(queryPartNumber)
|
||||||
if err != nil {
|
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
|
// ETag is required
|
||||||
@ -128,7 +133,12 @@ func (s *Server) handlePush(w http.ResponseWriter, r *http.Request) error {
|
|||||||
|
|
||||||
for uploadID, cp := range completePartsByUploadID {
|
for uploadID, cp := range completePartsByUploadID {
|
||||||
var zeroOpts minio.PutObjectOptions
|
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 {
|
if err != nil {
|
||||||
var e minio.ErrorResponse
|
var e minio.ErrorResponse
|
||||||
if errors.As(err, &e) && e.Code == "NoSuchUpload" {
|
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
|
// TODO(bmizerany): "global" throttle of rate of transfer
|
||||||
pushed, err := s.statObject(r.Context(), l.Digest)
|
pushed, err := s.statObject(r.Context(), l.Digest)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
println("ERROR:", "statObject", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if !pushed {
|
if !pushed {
|
||||||
key := path.Join("blobs", l.Digest)
|
key := path.Join("blobs", l.Digest)
|
||||||
if l.Size < minimumMultipartSize {
|
if l.Size < minimumMultipartSize {
|
||||||
// single part upload
|
// single part upload
|
||||||
|
fmt.Printf("Presigning single %s %s\n", bucketTODO, key)
|
||||||
signedURL, err := s.s3().PresignedPutObject(r.Context(), bucketTODO, key, 15*time.Minute)
|
signedURL, err := s.s3().PresignedPutObject(r.Context(), bucketTODO, key, 15*time.Minute)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
println("ERROR:", "presign single", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
requirements = append(requirements, apitype.Requirement{
|
requirements = append(requirements, apitype.Requirement{
|
||||||
@ -168,14 +181,16 @@ func (s *Server) handlePush(w http.ResponseWriter, r *http.Request) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
fmt.Printf("Presigning multi %s %s %s\n", bucketTODO, key, uploadID)
|
||||||
for partNumber, c := range upload.Chunks(l.Size, s.uploadChunkSize()) {
|
for partNumber, c := range upload.Chunks(l.Size, s.uploadChunkSize()) {
|
||||||
const timeToStartUpload = 15 * time.Minute
|
const timeToStartUpload = 15 * time.Minute
|
||||||
|
|
||||||
signedURL, err := s.s3().Presign(r.Context(), "PUT", bucketTODO, key, timeToStartUpload, url.Values{
|
signedURL, err := s.s3().Presign(r.Context(), "PUT", bucketTODO, key, timeToStartUpload, url.Values{
|
||||||
"uploadId": []string{uploadID},
|
|
||||||
"partNumber": []string{strconv.Itoa(partNumber)},
|
"partNumber": []string{strconv.Itoa(partNumber)},
|
||||||
|
"uploadId": []string{uploadID},
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
println("ERROR:", "presign multi", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -156,7 +156,7 @@ func TestPushBasic(t *testing.T) {
|
|||||||
Layers: []apitype.Layer{
|
Layers: []apitype.Layer{
|
||||||
{Digest: "sha256-1", Size: 1},
|
{Digest: "sha256-1", Size: 1},
|
||||||
{Digest: "sha256-2", Size: 2},
|
{Digest: "sha256-2", Size: 2},
|
||||||
{Digest: "sha256-3", Size: 3},
|
{Digest: "sha256-3", Size: 11000000},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user