Skip to content

Commit d3d828e

Browse files
authored
Add support to progress function to abort operation (minio#128)
Signed-off-by: Bala.FA <[email protected]>
1 parent 0eb2a19 commit d3d828e

File tree

5 files changed

+19
-9
lines changed

5 files changed

+19
-9
lines changed

examples/GetObjectProgress.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,15 @@ int main() {
3737
<< std::endl;
3838
return true;
3939
};
40-
args.progressfunc = [](minio::http::ProgressFunctionArgs args) -> void {
40+
args.progressfunc = [](minio::http::ProgressFunctionArgs args) -> bool {
4141
if (args.download_speed > 0) {
4242
std::cout << "downloaded speed: " << (long)args.download_speed << " bps"
4343
<< std::endl;
4444
} else {
4545
std::cout << "downloaded: " << (long)args.downloaded_bytes << " bytes of "
4646
<< (long)args.download_total_bytes << " bytes" << std::endl;
4747
}
48+
return true;
4849
};
4950

5051
// Call get object.

examples/PutObjectProgress.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,15 @@ int main() {
4343
minio::s3::PutObjectArgs args(file, 47615315, 15728640);
4444
args.bucket = "my-bucket";
4545
args.object = "my-object";
46-
args.progressfunc = [](minio::http::ProgressFunctionArgs args) -> void {
46+
args.progressfunc = [](minio::http::ProgressFunctionArgs args) -> bool {
4747
if (args.upload_speed > 0) {
4848
std::cout << "uploaded speed: " << (long)args.upload_speed << " bps"
4949
<< std::endl;
5050
} else {
5151
std::cout << "uploaded: " << (long)args.uploaded_bytes << " bytes of "
5252
<< (long)args.upload_total_bytes << " bytes" << std::endl;
5353
}
54+
return true;
5455
};
5556

5657
// Call put object.

include/miniocpp/http.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ using DataFunction = std::function<bool(DataFunctionArgs)>;
6969

7070
struct ProgressFunctionArgs;
7171

72-
using ProgressFunction = std::function<void(ProgressFunctionArgs)>;
72+
using ProgressFunction = std::function<bool(ProgressFunctionArgs)>;
7373

7474
struct Response;
7575

src/client.cc

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -484,21 +484,21 @@ PutObjectResponse Client::PutObject(PutObjectArgs args, std::string& upload_id,
484484
[&object_size = object_size, &uploaded_bytes = uploaded_bytes,
485485
&upload_speed = upload_speed, &progressfunc = args.progressfunc,
486486
&progress_userdata = args.progress_userdata](
487-
http::ProgressFunctionArgs args) -> void {
487+
http::ProgressFunctionArgs args) -> bool {
488488
if (args.upload_speed > 0) {
489489
if (upload_speed == -1) {
490490
upload_speed = args.upload_speed;
491491
} else {
492492
upload_speed = (upload_speed + args.upload_speed) / 2;
493493
}
494-
return;
494+
return true;
495495
}
496496

497497
http::ProgressFunctionArgs actual_args;
498498
actual_args.upload_total_bytes = static_cast<double>(object_size);
499499
actual_args.uploaded_bytes = uploaded_bytes + args.uploaded_bytes;
500500
actual_args.userdata = progress_userdata;
501-
progressfunc(actual_args);
501+
return progressfunc(actual_args);
502502
};
503503
}
504504
if (args.sse != nullptr) {
@@ -514,7 +514,10 @@ PutObjectResponse Client::PutObject(PutObjectArgs args, std::string& upload_id,
514514
actual_args.upload_total_bytes = static_cast<double>(object_size);
515515
actual_args.uploaded_bytes = uploaded_bytes;
516516
actual_args.userdata = args.progress_userdata;
517-
args.progressfunc(actual_args);
517+
if (!args.progressfunc(actual_args)) {
518+
return UploadPartResponse(
519+
error::Error("aborted by progress function"));
520+
}
518521
}
519522
parts.push_back(Part(part_number, std::move(resp.etag)));
520523
} else {
@@ -533,6 +536,7 @@ PutObjectResponse Client::PutObject(PutObjectArgs args, std::string& upload_id,
533536
http::ProgressFunctionArgs actual_args;
534537
actual_args.upload_speed = upload_speed;
535538
actual_args.userdata = args.progress_userdata;
539+
// ignore the return value as we completed the upload
536540
args.progressfunc(actual_args);
537541
}
538542
return PutObjectResponse(resp);
@@ -792,6 +796,8 @@ UploadObjectResponse Client::UploadObject(UploadObjectArgs args) {
792796
po_args.retention = std::move(args.retention);
793797
po_args.legal_hold = std::move(args.legal_hold);
794798
po_args.content_type = std::move(args.content_type);
799+
po_args.progressfunc = std::move(args.progressfunc);
800+
po_args.progress_userdata = std::move(args.progress_userdata);
795801

796802
PutObjectResponse resp = PutObject(std::move(po_args));
797803
file.close();

src/http.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -411,8 +411,10 @@ Response Request::execute() {
411411
args.upload_total_bytes = ultotal;
412412
args.uploaded_bytes = ulnow;
413413
args.userdata = progress_userdata;
414-
progressfunc(args);
415-
return CURL_PROGRESSFUNC_CONTINUE;
414+
if (progressfunc(args)) {
415+
return CURL_PROGRESSFUNC_CONTINUE;
416+
}
417+
return 1;
416418
};
417419
if (progressfunc != nullptr) {
418420
request.setOpt(new curlpp::options::NoProgress(false));

0 commit comments

Comments
 (0)