func()

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
}