Skip to content

Commit b14f275

Browse files
authored
Merge pull request #104 from agin719/cos-v4-dev
fix multicopy and multiupload send on closed channel panic
2 parents 6df1acc + c0e4c78 commit b14f275

File tree

3 files changed

+24
-15
lines changed

3 files changed

+24
-15
lines changed

object.go

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,7 @@ func (s *ObjectService) DeleteMulti(ctx context.Context, opt *ObjectDeleteMultiO
513513
type Object struct {
514514
Key string `xml:",omitempty"`
515515
ETag string `xml:",omitempty"`
516-
Size int `xml:",omitempty"`
516+
Size int64 `xml:",omitempty"`
517517
PartNumber int `xml:",omitempty"`
518518
LastModified string `xml:",omitempty"`
519519
StorageClass string `xml:",omitempty"`
@@ -836,35 +836,43 @@ func (s *ObjectService) Upload(ctx context.Context, name string, filepath string
836836
}()
837837

838838
// 5.Recv the resp etag to complete
839+
err = nil
839840
for i := 0; i < partNum; i++ {
840841
if chunks[i].Done {
841842
optcom.Parts = append(optcom.Parts, Object{
842843
PartNumber: chunks[i].Number, ETag: chunks[i].ETag},
843844
)
844-
consumedBytes += chunks[i].Size
845-
event = newProgressEvent(ProgressDataEvent, chunks[i].Size, consumedBytes, totalBytes)
846-
progressCallback(listener, event)
845+
if err == nil {
846+
consumedBytes += chunks[i].Size
847+
event = newProgressEvent(ProgressDataEvent, chunks[i].Size, consumedBytes, totalBytes)
848+
progressCallback(listener, event)
849+
}
847850
continue
848851
}
849852
res := <-chresults
850853
// Notice one part fail can not get the etag according.
851854
if res.Resp == nil || res.err != nil {
852855
// Some part already fail, can not to get the header inside.
853-
err := fmt.Errorf("UploadID %s, part %d failed to get resp content. error: %s", uploadID, res.PartNumber, res.err.Error())
854-
event = newProgressEvent(ProgressFailedEvent, 0, consumedBytes, totalBytes, err)
855-
progressCallback(listener, event)
856-
return nil, nil, err
856+
err = fmt.Errorf("UploadID %s, part %d failed to get resp content. error: %s", uploadID, res.PartNumber, res.err.Error())
857+
continue
857858
}
858859
// Notice one part fail can not get the etag according.
859860
etag := res.Resp.Header.Get("ETag")
860861
optcom.Parts = append(optcom.Parts, Object{
861862
PartNumber: res.PartNumber, ETag: etag},
862863
)
863-
consumedBytes += chunks[res.PartNumber-1].Size
864-
event = newProgressEvent(ProgressDataEvent, chunks[res.PartNumber-1].Size, consumedBytes, totalBytes)
865-
progressCallback(listener, event)
864+
if err == nil {
865+
consumedBytes += chunks[res.PartNumber-1].Size
866+
event = newProgressEvent(ProgressDataEvent, chunks[res.PartNumber-1].Size, consumedBytes, totalBytes)
867+
progressCallback(listener, event)
868+
}
866869
}
867870
close(chresults)
871+
if err != nil {
872+
event = newProgressEvent(ProgressFailedEvent, 0, consumedBytes, totalBytes, err)
873+
progressCallback(listener, event)
874+
return nil, nil, err
875+
}
868876
sort.Sort(ObjectList(optcom.Parts))
869877

870878
event = newProgressEvent(ProgressCompletedEvent, 0, consumedBytes, totalBytes)

object_part.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"net/url"
1111
"sort"
1212
"strings"
13+
"time"
1314
)
1415

1516
// InitiateMultipartUploadOptions is the option of InitateMultipartUpload
@@ -349,6 +350,7 @@ func copyworker(s *ObjectService, jobs <-chan *CopyJobs, results chan<- *CopyRes
349350
results <- &copyres
350351
break
351352
}
353+
time.Sleep(10 * time.Millisecond)
352354
continue
353355
}
354356
results <- &copyres
@@ -389,7 +391,7 @@ func SplitCopyFileIntoChunks(totalBytes int64, partSize int64) ([]Chunk, int, er
389391
return nil, 0, errors.New("Too many parts, out of 10000")
390392
}
391393
} else {
392-
partNum, partSize = DividePart(totalBytes, 64)
394+
partNum, partSize = DividePart(totalBytes, 128)
393395
}
394396

395397
var chunks []Chunk
@@ -483,13 +485,12 @@ func (s *ObjectService) MultiCopy(ctx context.Context, name string, sourceURL st
483485
}
484486
close(chjobs)
485487
}()
486-
487488
err = nil
488489
for i := 0; i < partNum; i++ {
489490
res := <-chresults
490491
if res.res == nil || res.err != nil {
491492
err = fmt.Errorf("UploadID %s, part %d failed to get resp content. error: %s", uploadID, res.PartNumber, res.err.Error())
492-
break
493+
continue
493494
}
494495
etag := res.res.ETag
495496
optcom.Parts = append(optcom.Parts, Object{

object_select.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
)
1616

1717
type JSONInputSerialization struct {
18-
Type string `xml:"Type"`
18+
Type string `xml:"Type,omitempty"`
1919
}
2020

2121
type CSVInputSerialization struct {

0 commit comments

Comments
 (0)