ClickHouse/src/IO/WriteBufferFromAzureBlobStorage.cpp

80 lines
2.1 KiB
C++
Raw Normal View History

#include <Common/config.h>
#if USE_AZURE_BLOB_STORAGE
2021-12-16 22:57:08 +00:00
#include <IO/WriteBufferFromAzureBlobStorage.h>
2021-12-01 12:31:25 +00:00
#include <Disks/RemoteDisksCommon.h>
2021-12-14 12:34:20 +00:00
#include <Common/getRandomASCIIString.h>
2022-04-27 15:05:45 +00:00
#include <Common/logger_useful.h>
namespace DB
{
2021-12-16 22:57:08 +00:00
WriteBufferFromAzureBlobStorage::WriteBufferFromAzureBlobStorage(
std::shared_ptr<Azure::Storage::Blobs::BlobContainerClient> blob_container_client_,
const String & blob_path_,
2021-11-17 11:28:30 +00:00
size_t max_single_part_upload_size_,
size_t buf_size_) :
BufferWithOwnMemory<WriteBuffer>(buf_size_, nullptr, 0),
blob_container_client(blob_container_client_),
max_single_part_upload_size(max_single_part_upload_size_),
blob_path(blob_path_) {}
2021-12-16 22:57:08 +00:00
WriteBufferFromAzureBlobStorage::~WriteBufferFromAzureBlobStorage()
2021-11-30 15:44:28 +00:00
{
finalize();
}
2021-12-24 12:40:54 +00:00
void WriteBufferFromAzureBlobStorage::finalizeImpl()
{
const size_t max_tries = 3;
for (size_t i = 0; i < max_tries; ++i)
{
try
{
next();
break;
}
catch (const Azure::Core::RequestFailedException & e)
{
if (i == max_tries - 1)
throw;
LOG_INFO(&Poco::Logger::get("WriteBufferFromAzureBlobStorage"),
"Exception caught during finalizing azure storage write at attempt {}: {}", i + 1, e.Message);
2021-12-24 12:40:54 +00:00
}
}
}
2021-11-30 15:44:28 +00:00
2021-12-16 22:57:08 +00:00
void WriteBufferFromAzureBlobStorage::nextImpl()
{
if (!offset())
return;
2021-12-08 13:32:00 +00:00
auto * buffer_begin = working_buffer.begin();
auto len = offset();
auto block_blob_client = blob_container_client->GetBlockBlobClient(blob_path);
size_t read = 0;
2021-12-22 11:21:35 +00:00
std::vector<std::string> block_ids;
while (read < len)
{
auto part_len = std::min(len - read, max_single_part_upload_size);
2021-12-14 12:34:20 +00:00
auto block_id = getRandomASCIIString(64);
block_ids.push_back(block_id);
2021-12-08 13:32:00 +00:00
Azure::Core::IO::MemoryBodyStream tmp_buffer(reinterpret_cast<uint8_t *>(buffer_begin + read), part_len);
2021-11-05 15:32:19 +00:00
block_blob_client.StageBlock(block_id, tmp_buffer);
read += part_len;
}
2021-12-22 11:21:35 +00:00
block_blob_client.CommitBlockList(block_ids);
}
}
#endif