【问题标题】:How to cancel resumable UploadChunk with google-cloud-cpp如何使用 google-cloud-cpp 取消可恢复的 UploadChunk
【发布时间】:2020-06-15 17:54:25
【问题描述】:
namespace gcs = google::cloud::storage;
using ::google::cloud::StatusOr;

auto client_options = 
gcs::ClientOptions::CreateDefaultClientOptions();

auto client = gcs::internal::CurlClient::Create(*client_options);
StatusOr<std::unique_ptr<gcs::internal::ResumableUploadSession>> session;
std::uint64_t total_size = 0;
void performresumableupload(std::string& bucket_name,
                        std::string& object_name,
                        std::string& data, std::uint64_t data_size, bool isFinal) {

gcs::internal::ResumableUploadRequest request(bucket_name, object_name);


StatusOr<gcs::internal::ResumableUploadResponse> response;
total_size += data_size;
if (!isFinal) {
    session = client->CreateResumableSession(request);
    response = (*session)->UploadChunk(data);

}
else {
    std::cout << "Uploading total size " << total_size << "\n";
    response = (*session)->UploadFinalChunk(data, total_size);

}
std::cout << "Response Status: " << response.status() << "\n";
}

我正在使用 curlclient 以 5MB 的块(256K 的倍数)上传一个巨大的对象,它可以工作。但是,我希望能够在调用 UploadFinalChunk 并提交对象之前取消此操作并删除部分上传的块。通过查看文档here,我看到要取消可恢复的上传请求,我必须发送一个删除请求。但是,我在 CurlClient 中看不到任何可以帮助我做同样事情的方法。感谢任何帮助。

【问题讨论】:

    标签: google-cloud-storage google-cloud-cpp


    【解决方案1】:

    我们从未实施过用于取消可恢复上传的 API。我刚刚创建了一个功能请求#4404,如果您想在 GitHub 问题中添加任何内容,请随时。

    另外,我很好奇你为什么直接使用storage::internal::CurlClient?通常storage::Client 中的 API 更友好,正如命名空间所暗示的,storage::internal::CurlClient 是一个内部 API,我们可能会更改或删除它,恕不另行通知。如果您愿意,请随时直接与我联系(我的电子邮件应该很容易找到)。

    【讨论】:

    • 感谢您提出功能请求。我期待着尽快使用它。我使用 CurlClient 是因为我上面的 API 层已经为我提供了对象的一部分。我希望能够单独上传这些块并在上传最后一个块后形成一个对象。而我认为,带有 ResumableUploadSession 的 WriteObject 接口旨在实现一个不同的用例,它允许从上传巨大对象失败的点继续。这与我们想要的不同。
    • 我之前尝试使用WriteObject接口实现“多部分”上传行为,但无法实现。当我使用 gcs::ObjectWriteStream stream = client.WriteObject(bucket_name, object_name, gcs::IfGenerationMatch(0), gcs::NewResumableUploadSession()); 上传 chunks 并通过调用 std::move(stream).Suspend(); 来暂停流小于 8MB 的块时,对象被提交,下次我尝试恢复会话以写入下一个块前一个块被覆盖。
    • 对于大于 8MB 的块大小,它可以工作,但我必须通过使用 next_expected_byte() 找出暂停上传的位置。 CurlClient 的 uploadChunk 和 uploadFinalChunk 准确地为我们提供了 AWS 的 Aws::S3::Model::UploadPartRequest 接口所提供的功能。当我们在“多部分”上传期间收到任何错误时,我们希望取消它。 AWS 提供docs.aws.amazon.com/AmazonS3/latest/API/… 能够中止操作。我们正在寻找类似中止 Google 方面的操作。
    • > 我希望能够单独上传这些块并在上传最后一个块后形成一个对象。您可能需要考虑将每个块上传到真实对象,然后执行 ComposeMany()。它有缺点(您需要删除组件),但您也可以乱序上传。
    • 谢谢!我将研究 ComposeMany()。我非常感谢您的快速回复。我只有几个澄清问题,但在 ComposeMany() 文档中没有找到任何答案。首先,使用 ComposeMany 会对性能产生负面影响吗?从现在开始,我会将块作为真实对象上传,然后将它们组合成一个新对象,并在组合后删除单个块。另一个问题是成本。这不是需要两倍的存储空间和两倍的成本吗?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2019-02-27
    • 2019-02-09
    • 2011-02-20
    • 2018-04-20
    相关资源
    最近更新 更多