mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-27 01:51:59 +00:00
Fixes for disk web
This commit is contained in:
parent
3e74b783c2
commit
cb442a3ad7
@ -2,6 +2,7 @@
|
|||||||
#include <Disks/IDisk.h>
|
#include <Disks/IDisk.h>
|
||||||
#include <Common/filesystemHelpers.h>
|
#include <Common/filesystemHelpers.h>
|
||||||
#include <Common/logger_useful.h>
|
#include <Common/logger_useful.h>
|
||||||
|
#include <Common/escapeForFileName.h>
|
||||||
#include <IO/WriteHelpers.h>
|
#include <IO/WriteHelpers.h>
|
||||||
|
|
||||||
|
|
||||||
@ -53,7 +54,23 @@ const std::string & MetadataStorageFromStaticFilesWebServer::getPath() const
|
|||||||
|
|
||||||
bool MetadataStorageFromStaticFilesWebServer::exists(const std::string & path) const
|
bool MetadataStorageFromStaticFilesWebServer::exists(const std::string & path) const
|
||||||
{
|
{
|
||||||
return object_storage.files.contains(path);
|
fs::path fs_path(path);
|
||||||
|
if (fs_path.has_extension())
|
||||||
|
fs_path = fs_path.parent_path();
|
||||||
|
|
||||||
|
initializeIfNeeded(fs_path, false);
|
||||||
|
|
||||||
|
if (object_storage.files.empty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (object_storage.files.contains(path))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
for (const auto & [object_path, _] : object_storage.files)
|
||||||
|
if (startsWith(object_path, path))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MetadataStorageFromStaticFilesWebServer::assertExists(const std::string & path) const
|
void MetadataStorageFromStaticFilesWebServer::assertExists(const std::string & path) const
|
||||||
@ -98,7 +115,10 @@ uint64_t MetadataStorageFromStaticFilesWebServer::getFileSize(const String & pat
|
|||||||
StoredObjects MetadataStorageFromStaticFilesWebServer::getStorageObjects(const std::string & path) const
|
StoredObjects MetadataStorageFromStaticFilesWebServer::getStorageObjects(const std::string & path) const
|
||||||
{
|
{
|
||||||
assertExists(path);
|
assertExists(path);
|
||||||
return {StoredObject::create(object_storage, path, object_storage.files.at(path).size, true)};
|
auto fs_path = fs::path(object_storage.url) / path;
|
||||||
|
std::string remote_path = fs_path.parent_path() / (escapeForFileName(fs_path.stem()) + fs_path.extension().string());
|
||||||
|
remote_path = remote_path.substr(object_storage.url.size());
|
||||||
|
return {StoredObject::create(object_storage, remote_path, object_storage.files.at(path).size, true)};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::string> MetadataStorageFromStaticFilesWebServer::listDirectory(const std::string & path) const
|
std::vector<std::string> MetadataStorageFromStaticFilesWebServer::listDirectory(const std::string & path) const
|
||||||
@ -112,7 +132,7 @@ std::vector<std::string> MetadataStorageFromStaticFilesWebServer::listDirectory(
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MetadataStorageFromStaticFilesWebServer::initializeIfNeeded(const std::string & path) const
|
bool MetadataStorageFromStaticFilesWebServer::initializeIfNeeded(const std::string & path, std::optional<bool> throw_on_error) const
|
||||||
{
|
{
|
||||||
if (object_storage.files.find(path) == object_storage.files.end())
|
if (object_storage.files.find(path) == object_storage.files.end())
|
||||||
{
|
{
|
||||||
@ -123,7 +143,7 @@ bool MetadataStorageFromStaticFilesWebServer::initializeIfNeeded(const std::stri
|
|||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
const auto message = getCurrentExceptionMessage(false);
|
const auto message = getCurrentExceptionMessage(false);
|
||||||
bool can_throw = CurrentThread::isInitialized() && CurrentThread::get().getQueryContext();
|
bool can_throw = throw_on_error.has_value() ? *throw_on_error : CurrentThread::isInitialized() && CurrentThread::get().getQueryContext();
|
||||||
if (can_throw)
|
if (can_throw)
|
||||||
throw Exception(ErrorCodes::NETWORK_ERROR, "Cannot load disk metadata. Error: {}", message);
|
throw Exception(ErrorCodes::NETWORK_ERROR, "Cannot load disk metadata. Error: {}", message);
|
||||||
|
|
||||||
@ -140,13 +160,17 @@ DirectoryIteratorPtr MetadataStorageFromStaticFilesWebServer::iterateDirectory(c
|
|||||||
std::vector<fs::path> dir_file_paths;
|
std::vector<fs::path> dir_file_paths;
|
||||||
|
|
||||||
if (!initializeIfNeeded(path))
|
if (!initializeIfNeeded(path))
|
||||||
|
{
|
||||||
return std::make_unique<DiskWebServerDirectoryIterator>(std::move(dir_file_paths));
|
return std::make_unique<DiskWebServerDirectoryIterator>(std::move(dir_file_paths));
|
||||||
|
}
|
||||||
|
|
||||||
assertExists(path);
|
assertExists(path);
|
||||||
|
|
||||||
for (const auto & [file_path, _] : object_storage.files)
|
for (const auto & [file_path, _] : object_storage.files)
|
||||||
if (parentPath(file_path) == path)
|
{
|
||||||
|
if (fs::path(parentPath(file_path)) / "" == fs::path(path) / "")
|
||||||
dir_file_paths.emplace_back(file_path);
|
dir_file_paths.emplace_back(file_path);
|
||||||
|
}
|
||||||
|
|
||||||
LOG_TRACE(object_storage.log, "Iterate directory {} with {} files", path, dir_file_paths.size());
|
LOG_TRACE(object_storage.log, "Iterate directory {} with {} files", path, dir_file_paths.size());
|
||||||
return std::make_unique<DiskWebServerDirectoryIterator>(std::move(dir_file_paths));
|
return std::make_unique<DiskWebServerDirectoryIterator>(std::move(dir_file_paths));
|
||||||
|
@ -19,7 +19,7 @@ private:
|
|||||||
|
|
||||||
void assertExists(const std::string & path) const;
|
void assertExists(const std::string & path) const;
|
||||||
|
|
||||||
bool initializeIfNeeded(const std::string & path) const;
|
bool initializeIfNeeded(const std::string & path, std::optional<bool> throw_on_error = std::nullopt) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit MetadataStorageFromStaticFilesWebServer(const WebObjectStorage & object_storage_);
|
explicit MetadataStorageFromStaticFilesWebServer(const WebObjectStorage & object_storage_);
|
||||||
|
@ -153,20 +153,6 @@ std::unique_ptr<ReadBufferFromFileBase> WebObjectStorage::readObject( /// NOLINT
|
|||||||
std::optional<size_t>,
|
std::optional<size_t>,
|
||||||
std::optional<size_t>) const
|
std::optional<size_t>) const
|
||||||
{
|
{
|
||||||
const auto & path = object.absolute_path;
|
|
||||||
LOG_TRACE(log, "Read from path: {}", path);
|
|
||||||
|
|
||||||
auto iter = files.find(path);
|
|
||||||
if (iter == files.end())
|
|
||||||
throw Exception(ErrorCodes::FILE_DOESNT_EXIST, "File path {} does not exist", path);
|
|
||||||
|
|
||||||
auto fs_path = fs::path(url) / path;
|
|
||||||
auto remote_path = fs_path.parent_path() / (escapeForFileName(fs_path.stem()) + fs_path.extension().string());
|
|
||||||
remote_path = remote_path.string().substr(url.size());
|
|
||||||
|
|
||||||
StoredObjects objects;
|
|
||||||
objects.emplace_back(remote_path, iter->second.size);
|
|
||||||
|
|
||||||
auto read_buffer_creator =
|
auto read_buffer_creator =
|
||||||
[this, read_settings]
|
[this, read_settings]
|
||||||
(const std::string & path_, size_t read_until_position) -> std::shared_ptr<ReadBufferFromFileBase>
|
(const std::string & path_, size_t read_until_position) -> std::shared_ptr<ReadBufferFromFileBase>
|
||||||
@ -179,7 +165,7 @@ std::unique_ptr<ReadBufferFromFileBase> WebObjectStorage::readObject( /// NOLINT
|
|||||||
read_until_position);
|
read_until_position);
|
||||||
};
|
};
|
||||||
|
|
||||||
auto web_impl = std::make_unique<ReadBufferFromRemoteFSGather>(std::move(read_buffer_creator), objects, read_settings);
|
auto web_impl = std::make_unique<ReadBufferFromRemoteFSGather>(std::move(read_buffer_creator), StoredObjects{object}, read_settings);
|
||||||
|
|
||||||
if (read_settings.remote_fs_method == RemoteFSReadMethod::threadpool)
|
if (read_settings.remote_fs_method == RemoteFSReadMethod::threadpool)
|
||||||
{
|
{
|
||||||
|
@ -25,10 +25,12 @@ def cluster():
|
|||||||
global uuids
|
global uuids
|
||||||
for i in range(3):
|
for i in range(3):
|
||||||
node1.query(
|
node1.query(
|
||||||
""" CREATE TABLE data{} (id Int32) ENGINE = MergeTree() ORDER BY id SETTINGS storage_policy = 'def';""".format(
|
""" CREATE TABLE data{} (id Int32) ENGINE = MergeTree() ORDER BY id SETTINGS storage_policy = 'def', min_bytes_for_wide_part=1;""".format(
|
||||||
i
|
i
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
for _ in range(10):
|
||||||
node1.query(
|
node1.query(
|
||||||
"INSERT INTO data{} SELECT number FROM numbers(500000 * {})".format(
|
"INSERT INTO data{} SELECT number FROM numbers(500000 * {})".format(
|
||||||
i, i + 1
|
i, i + 1
|
||||||
|
Loading…
Reference in New Issue
Block a user