ClickHouse/src/IO/WriteBufferFromAzureBlobStorage.cpp

81 lines
1.9 KiB
C++
Raw Normal View History

#if !defined(ARCADIA_BUILD)
#include <Common/config.h>
#endif
#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>
namespace DB
{
2021-12-22 09:46:48 +00:00
namespace ErrorCodes
{
extern const int AZURE_BLOB_STORAGE_ERROR;
}
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-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;
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-16 22:57:08 +00:00
void WriteBufferFromAzureBlobStorage::finalizeImpl()
2021-11-30 15:44:28 +00:00
{
2021-11-05 15:32:19 +00:00
next();
2021-12-22 09:46:48 +00:00
try
{
auto block_blob_client = blob_container_client->GetBlockBlobClient(blob_path);
block_blob_client.CommitBlockList(block_ids);
}
catch (const Azure::core::RequestFailedException & e)
{
throw Exception(ErrorCodes::AZURE_BLOB_STORAGE_ERROR, "Azure blob storage commit block list failed: {}", e.message);
}
finalized = true;
}
}
#endif