mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-10-05 08:00:51 +00:00
Add names for volumes
This commit is contained in:
parent
ad497fbaa1
commit
770b74ac17
@ -90,7 +90,8 @@ void DiskSelector::add(const DiskPtr & disk)
|
|||||||
disks.emplace(disk->getName(), disk);
|
disks.emplace(disk->getName(), disk);
|
||||||
}
|
}
|
||||||
|
|
||||||
StoragePolicy::Volume::Volume(const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, const DiskSelector & disk_selector)
|
StoragePolicy::Volume::Volume(String name_, const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, const DiskSelector & disk_selector)
|
||||||
|
: name(std::move(name_))
|
||||||
{
|
{
|
||||||
Poco::Util::AbstractConfiguration::Keys keys;
|
Poco::Util::AbstractConfiguration::Keys keys;
|
||||||
config.keys(config_prefix, keys);
|
config.keys(config_prefix, keys);
|
||||||
@ -208,19 +209,22 @@ UInt64 StoragePolicy::Volume::getMaxUnreservedFreeSpace() const
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
StoragePolicy::StoragePolicy(const String & name_, const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix,
|
StoragePolicy::StoragePolicy(String name_, const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix,
|
||||||
const DiskSelector & disks) : name(name_)
|
const DiskSelector & disks) : name(std::move(name_))
|
||||||
{
|
{
|
||||||
|
String volumes_prefix = config_prefix + ".volumes";
|
||||||
|
if (!config.has(volumes_prefix))
|
||||||
|
throw Exception("StoragePolicy must contain at least one Volume (.volumes)", ErrorCodes::EXCESSIVE_ELEMENT_IN_CONFIG);
|
||||||
|
|
||||||
Poco::Util::AbstractConfiguration::Keys keys;
|
Poco::Util::AbstractConfiguration::Keys keys;
|
||||||
config.keys(config_prefix, keys);
|
config.keys(volumes_prefix, keys);
|
||||||
|
|
||||||
for (const auto & attr_name : keys)
|
for (const auto & attr_name : keys)
|
||||||
{
|
{
|
||||||
if (!startsWith(attr_name, "volume"))
|
volumes.emplace_back(attr_name, config, volumes_prefix + "." + attr_name, disks);
|
||||||
throw Exception("Unknown element in config: " + config_prefix + "." + attr_name + ", must be 'volume'",
|
volumes_names[attr_name] = volumes.size() - 1;
|
||||||
ErrorCodes::UNKNOWN_ELEMENT_IN_CONFIG);
|
|
||||||
volumes.emplace_back(config, config_prefix + "." + attr_name, disks);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (volumes.empty())
|
if (volumes.empty())
|
||||||
throw Exception("StoragePolicy must contain at least one Volume", ErrorCodes::EXCESSIVE_ELEMENT_IN_CONFIG);
|
throw Exception("StoragePolicy must contain at least one Volume", ErrorCodes::EXCESSIVE_ELEMENT_IN_CONFIG);
|
||||||
|
|
||||||
@ -339,11 +343,12 @@ StoragePolicySelector::StoragePolicySelector(const Poco::Util::AbstractConfigura
|
|||||||
}
|
}
|
||||||
|
|
||||||
constexpr auto default_storage_policy_name = "default";
|
constexpr auto default_storage_policy_name = "default";
|
||||||
|
constexpr auto default_volume_name = "default";
|
||||||
constexpr auto default_disk_name = "default";
|
constexpr auto default_disk_name = "default";
|
||||||
if (policies.find(default_storage_policy_name) == policies.end())
|
if (policies.find(default_storage_policy_name) == policies.end())
|
||||||
policies.emplace(default_storage_policy_name,
|
policies.emplace(default_storage_policy_name,
|
||||||
std::make_shared<StoragePolicy>(default_storage_policy_name,
|
std::make_shared<StoragePolicy>(default_storage_policy_name,
|
||||||
StoragePolicy::Volumes{{std::vector<DiskPtr>{disks[default_disk_name]},
|
StoragePolicy::Volumes{StoragePolicy::Volume{default_volume_name, std::vector<DiskPtr>{disks[default_disk_name]},
|
||||||
std::numeric_limits<UInt64>::max()}}));
|
std::numeric_limits<UInt64>::max()}}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -303,29 +303,31 @@ public:
|
|||||||
friend class StoragePolicy;
|
friend class StoragePolicy;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Volume(std::vector<DiskPtr> disks_, UInt64 max_data_part_size_)
|
Volume(String name_, std::vector<DiskPtr> disks_, UInt64 max_data_part_size_)
|
||||||
: max_data_part_size(max_data_part_size_), disks(std::move(disks_)) { }
|
: max_data_part_size(max_data_part_size_), disks(std::move(disks_)), name(std::move(name_)) { }
|
||||||
|
|
||||||
Volume(const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, const DiskSelector & disk_selector);
|
Volume(String name_, const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, const DiskSelector & disk_selector);
|
||||||
|
|
||||||
Volume(const Volume & other) : max_data_part_size(other.max_data_part_size), disks(other.disks) { }
|
Volume(const Volume & other) : max_data_part_size(other.max_data_part_size), disks(other.disks), name(other.name) { }
|
||||||
|
|
||||||
Volume & operator=(const Volume & other)
|
Volume & operator=(const Volume & other)
|
||||||
{
|
{
|
||||||
disks = other.disks;
|
disks = other.disks;
|
||||||
max_data_part_size = other.max_data_part_size;
|
max_data_part_size = other.max_data_part_size;
|
||||||
last_used.store(0, std::memory_order_relaxed);
|
last_used.store(0, std::memory_order_relaxed);
|
||||||
|
name = other.name;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
Volume(Volume && other) noexcept
|
Volume(Volume && other) noexcept
|
||||||
: max_data_part_size(other.max_data_part_size), disks(std::move(other.disks)) { }
|
: max_data_part_size(other.max_data_part_size), disks(std::move(other.disks)), name(std::move(other.name)) { }
|
||||||
|
|
||||||
Volume & operator=(Volume && other) noexcept
|
Volume & operator=(Volume && other) noexcept
|
||||||
{
|
{
|
||||||
disks = std::move(other.disks);
|
disks = std::move(other.disks);
|
||||||
max_data_part_size = other.max_data_part_size;
|
max_data_part_size = other.max_data_part_size;
|
||||||
last_used.store(0, std::memory_order_relaxed);
|
last_used.store(0, std::memory_order_relaxed);
|
||||||
|
name = std::move(other.name);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -337,20 +339,32 @@ public:
|
|||||||
|
|
||||||
UInt64 getMaxUnreservedFreeSpace() const;
|
UInt64 getMaxUnreservedFreeSpace() const;
|
||||||
|
|
||||||
|
const String & getName() const { return name; }
|
||||||
|
|
||||||
UInt64 max_data_part_size = std::numeric_limits<decltype(max_data_part_size)>::max();
|
UInt64 max_data_part_size = std::numeric_limits<decltype(max_data_part_size)>::max();
|
||||||
|
|
||||||
Disks disks;
|
Disks disks;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
mutable std::atomic<size_t> last_used = 0;
|
mutable std::atomic<size_t> last_used = 0;
|
||||||
|
String name;
|
||||||
};
|
};
|
||||||
|
|
||||||
using Volumes = std::vector<Volume>;
|
using Volumes = std::vector<Volume>;
|
||||||
|
|
||||||
StoragePolicy(const String & name_, const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix,
|
StoragePolicy(String name_, const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix,
|
||||||
const DiskSelector & disks);
|
const DiskSelector & disks);
|
||||||
|
|
||||||
StoragePolicy(const String & name_, Volumes volumes_) : volumes(std::move(volumes_)), name(name_) { }
|
StoragePolicy(String name_, Volumes volumes_) : volumes(std::move(volumes_)), name(std::move(name_))
|
||||||
|
{
|
||||||
|
if (volumes.empty())
|
||||||
|
throw Exception("StoragePolicy must contain at least one Volume", ErrorCodes::UNKNOWN_POLICY);
|
||||||
|
|
||||||
|
for (size_t i = 0; i != volumes.size(); ++i)
|
||||||
|
{
|
||||||
|
volumes_names[volumes[i].getName()] = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns disks ordered by volumes priority
|
/// Returns disks ordered by volumes priority
|
||||||
Disks getDisks() const;
|
Disks getDisks() const;
|
||||||
@ -390,9 +404,14 @@ public:
|
|||||||
|
|
||||||
const auto & getVolumes() const { return volumes; }
|
const auto & getVolumes() const { return volumes; }
|
||||||
|
|
||||||
|
const auto & getVolume(size_t i) const { return volumes[i]; }
|
||||||
|
|
||||||
|
const auto & getVolume(const String & volume_name) { return getVolume(volumes_names[volume_name]); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Volumes volumes;
|
Volumes volumes;
|
||||||
String name;
|
String name;
|
||||||
|
std::map<String, size_t> volumes_names;
|
||||||
};
|
};
|
||||||
|
|
||||||
using StoragePolicyPtr = std::shared_ptr<const StoragePolicy>;
|
using StoragePolicyPtr = std::shared_ptr<const StoragePolicy>;
|
||||||
|
@ -17,7 +17,8 @@ StorageSystemStoragePolicies::StorageSystemStoragePolicies(const std::string & n
|
|||||||
{
|
{
|
||||||
setColumns(ColumnsDescription(
|
setColumns(ColumnsDescription(
|
||||||
{
|
{
|
||||||
{"name", std::make_shared<DataTypeString>()},
|
{"policy_name", std::make_shared<DataTypeString>()},
|
||||||
|
{"volume_name", std::make_shared<DataTypeString>()},
|
||||||
{"volume_priority", std::make_shared<DataTypeUInt64>()},
|
{"volume_priority", std::make_shared<DataTypeUInt64>()},
|
||||||
{"disks", std::make_shared<DataTypeArray>(std::make_shared<DataTypeString>())},
|
{"disks", std::make_shared<DataTypeArray>(std::make_shared<DataTypeString>())},
|
||||||
{"max_data_part_size", std::make_shared<DataTypeUInt64>()},
|
{"max_data_part_size", std::make_shared<DataTypeUInt64>()},
|
||||||
@ -34,7 +35,8 @@ BlockInputStreams StorageSystemStoragePolicies::read(
|
|||||||
{
|
{
|
||||||
check(column_names);
|
check(column_names);
|
||||||
|
|
||||||
MutableColumnPtr col_name_mut = ColumnString::create();
|
MutableColumnPtr col_policy_name_mut = ColumnString::create();
|
||||||
|
MutableColumnPtr col_volume_name_mut = ColumnString::create();
|
||||||
MutableColumnPtr col_priority_mut = ColumnUInt64::create();
|
MutableColumnPtr col_priority_mut = ColumnUInt64::create();
|
||||||
MutableColumnPtr col_disks_mut = ColumnArray::create(ColumnString::create());
|
MutableColumnPtr col_disks_mut = ColumnArray::create(ColumnString::create());
|
||||||
MutableColumnPtr col_max_part_size_mut = ColumnUInt64::create();
|
MutableColumnPtr col_max_part_size_mut = ColumnUInt64::create();
|
||||||
@ -46,7 +48,8 @@ BlockInputStreams StorageSystemStoragePolicies::read(
|
|||||||
const auto & volumes = policy_ptr->getVolumes();
|
const auto & volumes = policy_ptr->getVolumes();
|
||||||
for (size_t i = 0; i != volumes.size(); ++i)
|
for (size_t i = 0; i != volumes.size(); ++i)
|
||||||
{
|
{
|
||||||
col_name_mut->insert(name);
|
col_policy_name_mut->insert(name);
|
||||||
|
col_volume_name_mut->insert(volumes[i].getName());
|
||||||
col_priority_mut->insert(i);
|
col_priority_mut->insert(i);
|
||||||
Array disks;
|
Array disks;
|
||||||
disks.reserve(volumes[i].disks.size());
|
disks.reserve(volumes[i].disks.size());
|
||||||
@ -57,14 +60,16 @@ BlockInputStreams StorageSystemStoragePolicies::read(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ColumnPtr col_name = std::move(col_name_mut);
|
ColumnPtr col_policy_name = std::move(col_policy_name_mut);
|
||||||
|
ColumnPtr col_volume_name = std::move(col_volume_name_mut);
|
||||||
ColumnPtr col_priority = std::move(col_priority_mut);
|
ColumnPtr col_priority = std::move(col_priority_mut);
|
||||||
ColumnPtr col_disks = std::move(col_disks_mut);
|
ColumnPtr col_disks = std::move(col_disks_mut);
|
||||||
ColumnPtr col_max_part_size = std::move(col_max_part_size_mut);
|
ColumnPtr col_max_part_size = std::move(col_max_part_size_mut);
|
||||||
|
|
||||||
Block res = getSampleBlock().cloneEmpty();
|
Block res = getSampleBlock().cloneEmpty();
|
||||||
size_t col_num = 0;
|
size_t col_num = 0;
|
||||||
res.getByPosition(col_num++).column = col_name;
|
res.getByPosition(col_num++).column = col_policy_name;
|
||||||
|
res.getByPosition(col_num++).column = col_volume_name;
|
||||||
res.getByPosition(col_num++).column = col_priority;
|
res.getByPosition(col_num++).column = col_priority;
|
||||||
res.getByPosition(col_num++).column = col_disks;
|
res.getByPosition(col_num++).column = col_disks;
|
||||||
res.getByPosition(col_num++).column = col_max_part_size;
|
res.getByPosition(col_num++).column = col_max_part_size;
|
||||||
|
Loading…
Reference in New Issue
Block a user