in sdk/src/resumable/ResumableUploader.cc [325:381]
int ResumableUploader::getPartsToUpload(OssError &err, PartList &partsUploaded, PartList &partsToUpload)
{
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 = ListPartsWrap(listPartsRequest);
if(!outcome.isSuccess()){
err = outcome.error();
return -1;
}
auto parts = outcome.result().PartList();
for(auto iter = parts.begin(); iter != parts.end(); iter++){
if (iter->Size() != static_cast<int64_t>(partSize_)) {
continue;
}
partNumbersUploaded.insert(iter->PartNumber());
partsUploaded.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()){
partsToUpload.push_back(part);
}
}
return 0;
}