diff --git a/pkg/donut/bucket.go b/pkg/donut/bucket.go index 6c9e0b8c8..464f69c91 100644 --- a/pkg/donut/bucket.go +++ b/pkg/donut/bucket.go @@ -417,13 +417,22 @@ func (b bucket) writeObjectData(k, m uint8, writers []io.WriteCloser, objectData return 0, 0, iodine.New(err, nil) } totalLength = totalLength + len(chunk.Data) - encodedBlocks, _ := encoder.Encode(chunk.Data) + encodedBlocks, err := encoder.Encode(chunk.Data) + if err != nil { + return 0, 0, iodine.New(err, nil) + } + sumMD5.Write(chunk.Data) sum256.Write(chunk.Data) sum512.Write(chunk.Data) for blockIndex, block := range encodedBlocks { - _, err := io.Copy(writers[blockIndex], bytes.NewBuffer(block)) - if err != nil { + errCh := make(chan error, 1) + go func(writer io.Writer, reader io.Reader) { + defer close(errCh) + _, err := io.Copy(writers[blockIndex], bytes.NewReader(block)) + errCh <- err + }(writers[blockIndex], bytes.NewReader(block)) + if err := <-errCh; err != nil { return 0, 0, iodine.New(err, nil) } } diff --git a/pkg/donut/multipart.go b/pkg/donut/multipart.go index a27e0d2c4..da9e3f1bf 100644 --- a/pkg/donut/multipart.go +++ b/pkg/donut/multipart.go @@ -281,12 +281,12 @@ func (donut API) CompleteMultipartUpload(bucket, key, uploadID string, data io.R } var size int64 var fullObject bytes.Buffer - for i := 1; i <= len(parts.Part); i++ { - recvMD5 := parts.Part[i-1].ETag - object, ok := donut.multiPartObjects[uploadID].Get(parts.Part[i-1].PartNumber) + for i := 0; i < len(parts.Part); i++ { + recvMD5 := parts.Part[i].ETag + object, ok := donut.multiPartObjects[uploadID].Get(parts.Part[i].PartNumber) if ok == false { donut.lock.Unlock() - return ObjectMetadata{}, iodine.New(errors.New("missing part: "+strconv.Itoa(i)), nil) + return ObjectMetadata{}, iodine.New(errors.New("missing part: "+strconv.Itoa(parts.Part[i].PartNumber)), nil) } size += int64(len(object)) calcMD5Bytes := md5.Sum(object)