1
0
mirror of https://github.com/minio/minio-cpp.git synced 2025-04-18 08:24:00 +03:00

Add support to progress function to abort operation (#128)

Signed-off-by: Bala.FA <bala@minio.io>
This commit is contained in:
Bala FA 2024-04-02 19:10:06 +05:30 committed by GitHub
parent 0eb2a19df1
commit d3d828eddc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 19 additions and 9 deletions

View File

@ -37,7 +37,7 @@ int main() {
<< std::endl;
return true;
};
args.progressfunc = [](minio::http::ProgressFunctionArgs args) -> void {
args.progressfunc = [](minio::http::ProgressFunctionArgs args) -> bool {
if (args.download_speed > 0) {
std::cout << "downloaded speed: " << (long)args.download_speed << " bps"
<< std::endl;
@ -45,6 +45,7 @@ int main() {
std::cout << "downloaded: " << (long)args.downloaded_bytes << " bytes of "
<< (long)args.download_total_bytes << " bytes" << std::endl;
}
return true;
};
// Call get object.

View File

@ -43,7 +43,7 @@ int main() {
minio::s3::PutObjectArgs args(file, 47615315, 15728640);
args.bucket = "my-bucket";
args.object = "my-object";
args.progressfunc = [](minio::http::ProgressFunctionArgs args) -> void {
args.progressfunc = [](minio::http::ProgressFunctionArgs args) -> bool {
if (args.upload_speed > 0) {
std::cout << "uploaded speed: " << (long)args.upload_speed << " bps"
<< std::endl;
@ -51,6 +51,7 @@ int main() {
std::cout << "uploaded: " << (long)args.uploaded_bytes << " bytes of "
<< (long)args.upload_total_bytes << " bytes" << std::endl;
}
return true;
};
// Call put object.

View File

@ -69,7 +69,7 @@ using DataFunction = std::function<bool(DataFunctionArgs)>;
struct ProgressFunctionArgs;
using ProgressFunction = std::function<void(ProgressFunctionArgs)>;
using ProgressFunction = std::function<bool(ProgressFunctionArgs)>;
struct Response;

View File

@ -484,21 +484,21 @@ PutObjectResponse Client::PutObject(PutObjectArgs args, std::string& upload_id,
[&object_size = object_size, &uploaded_bytes = uploaded_bytes,
&upload_speed = upload_speed, &progressfunc = args.progressfunc,
&progress_userdata = args.progress_userdata](
http::ProgressFunctionArgs args) -> void {
http::ProgressFunctionArgs args) -> bool {
if (args.upload_speed > 0) {
if (upload_speed == -1) {
upload_speed = args.upload_speed;
} else {
upload_speed = (upload_speed + args.upload_speed) / 2;
}
return;
return true;
}
http::ProgressFunctionArgs actual_args;
actual_args.upload_total_bytes = static_cast<double>(object_size);
actual_args.uploaded_bytes = uploaded_bytes + args.uploaded_bytes;
actual_args.userdata = progress_userdata;
progressfunc(actual_args);
return progressfunc(actual_args);
};
}
if (args.sse != nullptr) {
@ -514,7 +514,10 @@ PutObjectResponse Client::PutObject(PutObjectArgs args, std::string& upload_id,
actual_args.upload_total_bytes = static_cast<double>(object_size);
actual_args.uploaded_bytes = uploaded_bytes;
actual_args.userdata = args.progress_userdata;
args.progressfunc(actual_args);
if (!args.progressfunc(actual_args)) {
return UploadPartResponse(
error::Error("aborted by progress function"));
}
}
parts.push_back(Part(part_number, std::move(resp.etag)));
} else {
@ -533,6 +536,7 @@ PutObjectResponse Client::PutObject(PutObjectArgs args, std::string& upload_id,
http::ProgressFunctionArgs actual_args;
actual_args.upload_speed = upload_speed;
actual_args.userdata = args.progress_userdata;
// ignore the return value as we completed the upload
args.progressfunc(actual_args);
}
return PutObjectResponse(resp);
@ -792,6 +796,8 @@ UploadObjectResponse Client::UploadObject(UploadObjectArgs args) {
po_args.retention = std::move(args.retention);
po_args.legal_hold = std::move(args.legal_hold);
po_args.content_type = std::move(args.content_type);
po_args.progressfunc = std::move(args.progressfunc);
po_args.progress_userdata = std::move(args.progress_userdata);
PutObjectResponse resp = PutObject(std::move(po_args));
file.close();

View File

@ -411,8 +411,10 @@ Response Request::execute() {
args.upload_total_bytes = ultotal;
args.uploaded_bytes = ulnow;
args.userdata = progress_userdata;
progressfunc(args);
return CURL_PROGRESSFUNC_CONTINUE;
if (progressfunc(args)) {
return CURL_PROGRESSFUNC_CONTINUE;
}
return 1;
};
if (progressfunc != nullptr) {
request.setOpt(new curlpp::options::NoProgress(false));