in sdk/src/resumable/ResumableCopier.cc [334:389]
int ResumableCopier::getPartsToUploadCopy(OssError &err, PartList &partsCopied, PartList &partsToUploadCopy)
{
std::set<uint64_t> partNumbersUploaded;
if (hasRecord_) {
uint32_t marker = 0;
auto listPartsRequest = ListPartsRequest(request_.Bucket(), request_.Key(), uploadID_);
if (!request_.EncodingType().empty()) {
listPartsRequest.setEncodingType(request_.EncodingType());
}
if (request_.RequestPayer() == RequestPayer::Requester) {
listPartsRequest.setRequestPayer(request_.RequestPayer());
}
while (true) {
listPartsRequest.setPartNumberMarker(marker);
auto outcome = client_->ListParts(listPartsRequest);
if (!outcome.isSuccess()) {
err = outcome.error();
return -1;
}
auto parts = outcome.result().PartList();
for (auto iter = parts.begin(); iter != parts.end(); iter++) {
partNumbersUploaded.insert(iter->PartNumber());
partsCopied.emplace_back(*iter);
consumedSize_ += iter->Size();
}
if (outcome.result().IsTruncated()) {
marker = outcome.result().NextPartNumberMarker();
}
else {
break;
}
}
}
int32_t partCount = (int32_t)((objectSize_ - 1) / partSize_ + 1);
for (int32_t i = 0; i < partCount; i++) {
Part part;
part.partNumber_ = i + 1;
if (i == partCount - 1) {
part.size_ = objectSize_ - partSize_ * (partCount - 1);
}
else {
part.size_ = partSize_;
}
auto iterNum = partNumbersUploaded.find(part.PartNumber());
if (iterNum == partNumbersUploaded.end()) {
partsToUploadCopy.push_back(part);
}
}
return 0;
}