Skip to content

Commit 8d9d1e7

Browse files
committed
fix progress bug in resumable upload/download.
1 parent bd607ea commit 8d9d1e7

File tree

3 files changed

+32
-7
lines changed

3 files changed

+32
-7
lines changed

sdk/src/resumable/ResumableDownloader.cc

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@
2929

3030
using namespace AlibabaCloud::OSS;
3131

32+
struct DownloaderTransferState {
33+
int64_t transfered;
34+
void *userData;
35+
};
36+
3237
GetObjectOutcome ResumableDownloader::Download()
3338
{
3439
OssError err;
@@ -79,9 +84,12 @@ GetObjectOutcome ResumableDownloader::Download()
7984
getObjectReq.setRange(start, end);
8085
getObjectReq.setFlags(getObjectReq.Flags() | REQUEST_FLAG_CHECK_CRC64 | REQUEST_FLAG_SAVE_CLIENT_CRC64);
8186

87+
DownloaderTransferState transferState;
8288
auto process = request_.TransferProgress();
8389
if (process.Handler) {
84-
TransferProgress uploadPartProcess = { DownloadPartProcessCallback, (void *)this };
90+
transferState.transfered = 0;
91+
transferState.userData = (void *)this;
92+
TransferProgress uploadPartProcess = { DownloadPartProcessCallback, (void *)&transferState };
8593
getObjectReq.setTransferProgress(uploadPartProcess);
8694
}
8795
if (request_.RequestPayer() == RequestPayer::Requester) {
@@ -468,10 +476,14 @@ void ResumableDownloader::initRecord()
468476

469477
void ResumableDownloader::DownloadPartProcessCallback(size_t increment, int64_t transfered, int64_t total, void *userData)
470478
{
471-
UNUSED_PARAM(transfered);
472479
UNUSED_PARAM(total);
480+
auto transferState = (DownloaderTransferState *)userData;
481+
auto downloader = (ResumableDownloader*)transferState->userData;
482+
auto inc = transfered - transferState->transfered;
483+
transferState->transfered = std::max(transfered, transferState->transfered);
484+
inc = std::max(inc, static_cast<int64_t>(0));
485+
increment = static_cast<size_t>(inc);
473486

474-
auto downloader = (ResumableDownloader*)userData;
475487
std::lock_guard<std::mutex> lck(downloader->lock_);
476488
downloader->consumedSize_ += increment;
477489

sdk/src/resumable/ResumableUploader.cc

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@
3535

3636
using namespace AlibabaCloud::OSS;
3737

38+
struct UploaderTransferState {
39+
int64_t transfered;
40+
void *userData;
41+
};
3842

3943
ResumableUploader::ResumableUploader(const UploadObjectRequest& request, const OssClientImpl *client) :
4044
ResumableBaseWorker(request.ObjectSize(), request.PartSize()),
@@ -101,9 +105,12 @@ PutObjectOutcome ResumableUploader::Upload()
101105
UploadPartRequest uploadPartRequest(request_.Bucket(), request_.Key(), part.PartNumber(), uploadID_, content);
102106
uploadPartRequest.setContentLength(length);
103107

108+
UploaderTransferState transferState;
104109
auto process = request_.TransferProgress();
105110
if (process.Handler) {
106-
TransferProgress uploadPartProcess = { UploadPartProcessCallback, (void *)this };
111+
transferState.transfered = 0;
112+
transferState.userData = (void *)this;
113+
TransferProgress uploadPartProcess = { UploadPartProcessCallback, (void *)&transferState };
107114
uploadPartRequest.setTransferProgress(uploadPartProcess);
108115
}
109116
if (request_.RequestPayer() == RequestPayer::Requester) {
@@ -409,10 +416,14 @@ void ResumableUploader::dumpRecordInfo(AlibabaCloud::OSS::Json::Value& root)
409416

410417
void ResumableUploader::UploadPartProcessCallback(size_t increment, int64_t transfered, int64_t total, void *userData)
411418
{
412-
UNUSED_PARAM(transfered);
413419
UNUSED_PARAM(total);
420+
auto transferState = (UploaderTransferState *)userData;
421+
auto uploader = (ResumableUploader*)transferState->userData;
422+
auto inc = transfered - transferState->transfered;
423+
transferState->transfered = std::max(transfered, transferState->transfered);
424+
inc = std::max(inc, static_cast<int64_t>(0));
425+
increment = static_cast<size_t>(inc);
414426

415-
auto uploader = (ResumableUploader*)userData;
416427
std::lock_guard<std::mutex> lck(uploader->lock_);
417428
uploader->consumedSize_ += increment;
418429

test/src/MultipartUpload/ResumableObjectTest.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,7 @@ class ResumableObjectTest : public::testing::Test {
664664
EXPECT_EQ(CreateDirectory(checkpointDir), true);
665665
EXPECT_EQ(IsDirectoryExist(checkpointDir), true);
666666

667+
std::cout << "this ptr:" << this << std::endl;
667668
TransferProgress progressCallback = { ProgressCallback, this };
668669
UploadObjectRequest request(BucketName, key, tmpFile, checkpointDir, 102400, 1);
669670
request.setTransferProgress(progressCallback);
@@ -1325,6 +1326,7 @@ class ResumableObjectTest : public::testing::Test {
13251326
EXPECT_EQ(putObjectOutcome.isSuccess(), true);
13261327
EXPECT_EQ(Client->DoesObjectExist(BucketName, sourceKey), true);
13271328

1329+
std::cout << "this ptr:" << this << std::endl;
13281330
TransferProgress progressCallback = { ProgressCallback, this };
13291331
DownloadObjectRequest request(BucketName, sourceKey, targetKey);
13301332
request.setTransferProgress(progressCallback);
@@ -2354,7 +2356,7 @@ class ResumableObjectTest : public::testing::Test {
23542356
std::string checkpointDir = TestUtils::GetTargetFileName("checkpoint");
23552357
EXPECT_EQ(CreateDirectory(checkpointDir), true);
23562358
EXPECT_EQ(IsDirectoryExist(checkpointDir), true);
2357-
2359+
std::cout << "this ptr:" << this << std::endl;
23582360
TransferProgress progressCallback = { ProgressCallback, this };
23592361
UploadObjectRequest request(BucketName, key, tmpFile, checkpointDir, 102400, 1);
23602362
request.setTransferProgress(progressCallback);

0 commit comments

Comments
 (0)