in oss/uploader.go [264:333]
func (u *uploaderDelegate) adjustSource() error {
// resume from upload id
if u.uploadId != "" {
// if the body supports seek
r, ok := u.body.(io.Seeker)
// not support
if !ok {
u.uploadId = ""
return nil
}
// if upload id is valid
paginator := NewListPartsPaginator(u.client, &ListPartsRequest{
Bucket: u.request.Bucket,
Key: u.request.Key,
UploadId: Ptr(u.uploadId),
})
// find consecutive sequence from min part number
var (
checkPartNumber int32 = 1
updateCRC64 bool = ((u.base.featureFlags & FeatureEnableCRC64CheckUpload) > 0)
hashCRC64 uint64 = 0
page *ListPartsResult
err error
uploadedParts []Part
)
outerLoop:
for paginator.HasNext() {
page, err = paginator.NextPage(u.context, u.options.ClientOptions...)
if err != nil {
u.uploadId = ""
return nil
}
for _, p := range page.Parts {
if p.PartNumber != checkPartNumber ||
p.Size != u.options.PartSize {
break outerLoop
}
checkPartNumber++
uploadedParts = append(uploadedParts, p)
if updateCRC64 && p.HashCRC64 != nil {
value, _ := strconv.ParseUint(ToString(p.HashCRC64), 10, 64)
hashCRC64 = CRC64Combine(hashCRC64, value, uint64(p.Size))
}
}
}
partNumber := checkPartNumber - 1
newOffset := int64(partNumber) * u.options.PartSize
if _, err := r.Seek(newOffset, io.SeekStart); err != nil {
u.uploadId = ""
return nil
}
cseContext, err := u.resumeCSEContext(page)
if err != nil {
u.uploadId = ""
return nil
}
u.partNumber = partNumber
u.readerPos = newOffset
u.hashCRC64 = hashCRC64
u.cseContext = cseContext
u.uploadedParts = uploadedParts
}
return nil
}