in oss/lib/cp.go [2695:2761]
func (cc *CopyCommand) objectStatistic(bucket *oss.Bucket, cloudURL CloudURL) {
if cc.cpOption.recursive {
pre := oss.Prefix(cloudURL.object)
marker := oss.Marker("")
//while the src object is end with "/", use object key as marker, exclude the object itself
if strings.HasSuffix(cloudURL.object, "/") {
marker = oss.Marker(cloudURL.object)
}
del := oss.Delimiter("")
if cc.cpOption.onlyCurrentDir {
del = oss.Delimiter("/")
}
listOptions := append(cc.cpOption.payerOptions, pre, marker, del)
fnvIns := fnv.New64()
for {
lor, err := cc.command.ossListObjectsRetry(bucket, listOptions...)
if err != nil {
cc.monitor.setScanError(err)
return
}
for _, object := range lor.Objects {
if doesSingleObjectMatchPatterns(object.Key, cc.cpOption.filters) {
if cc.cpOption.partitionIndex == 0 || (cc.cpOption.partitionIndex > 0 && matchHash(fnvIns, object.Key, cc.cpOption.partitionIndex-1, cc.cpOption.partitionCount)) {
if strings.ToLower(object.Type) == "symlink" && cc.cpOption.opType == operationTypeGet {
props, _ := cc.command.ossGetObjectStatRetry(bucket, object.Key, cc.cpOption.payerOptions...)
size, err := strconv.ParseInt(props.Get(oss.HTTPHeaderContentLength), 10, 64)
if err == nil {
object.Size = size
}
}
cc.monitor.updateScanSizeNum(cc.getRangeSize(object.Size), 1)
}
}
}
pre = oss.Prefix(lor.Prefix)
marker = oss.Marker(lor.NextMarker)
listOptions = append(cc.cpOption.payerOptions, pre, marker)
if !lor.IsTruncated {
break
}
}
} else {
statOptions := cc.cpOption.payerOptions
if cc.cpOption.versionId != "" {
statOptions = append(statOptions, oss.VersionId(cc.cpOption.versionId))
}
props, err := cc.command.ossGetObjectStatRetry(bucket, cloudURL.object, statOptions...)
if err != nil {
cc.monitor.setScanError(err)
return
}
size, err := strconv.ParseInt(props.Get(oss.HTTPHeaderContentLength), 10, 64)
if err != nil {
cc.monitor.setScanError(err)
return
}
cc.monitor.updateScanSizeNum(cc.getRangeSize(size), 1)
}
cc.monitor.setScanEnd()
freshProgress()
}