mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-11 18:14:03 +00:00
merge tree: update in CurrentlyMergingInfo. Now looking on available disk space before merge [METR-9279] [METR-9444]
This commit is contained in:
parent
ee1fff79f2
commit
4787aefff9
@ -266,7 +266,7 @@ private:
|
|||||||
|
|
||||||
/// NOTE можно загружать засечки тоже в оперативку
|
/// NOTE можно загружать засечки тоже в оперативку
|
||||||
|
|
||||||
size_t getSize()
|
size_t getSizeInBytes() const
|
||||||
{
|
{
|
||||||
String from = storage.full_path + name + "/";
|
String from = storage.full_path + name + "/";
|
||||||
return Poco::File(from).getSize();
|
return Poco::File(from).getSize();
|
||||||
@ -401,12 +401,12 @@ private:
|
|||||||
};
|
};
|
||||||
void addPart(DataPartPtr a)
|
void addPart(DataPartPtr a)
|
||||||
{
|
{
|
||||||
total_size += a->getSize();
|
total_size += a->getSizeInBytes();
|
||||||
}
|
}
|
||||||
|
|
||||||
void removePart(DataPartPtr a)
|
void removePart(DataPartPtr a)
|
||||||
{
|
{
|
||||||
total_size -= a->getSize();
|
total_size -= a->getSizeInBytes();
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t total_size;
|
size_t total_size;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include <boost/bind.hpp>
|
#include <boost/bind.hpp>
|
||||||
#include <numeric>
|
#include <numeric>
|
||||||
|
#include <sys/vfs.h>
|
||||||
|
|
||||||
#include <Poco/DirectoryIterator.h>
|
#include <Poco/DirectoryIterator.h>
|
||||||
#include <Poco/Ext/ScopedTry.h>
|
#include <Poco/Ext/ScopedTry.h>
|
||||||
@ -845,6 +846,10 @@ bool StorageMergeTree::selectPartsToMerge(std::vector<DataPartPtr> & parts, bool
|
|||||||
DayNum_t now_day = date_lut.toDayNum(time(0));
|
DayNum_t now_day = date_lut.toDayNum(time(0));
|
||||||
DayNum_t now_month = date_lut.toFirstDayNumOfMonth(now_day);
|
DayNum_t now_month = date_lut.toFirstDayNumOfMonth(now_day);
|
||||||
int now_hour = date_lut.toHourInaccurate(time(0));
|
int now_hour = date_lut.toHourInaccurate(time(0));
|
||||||
|
struct statfs fs;
|
||||||
|
statfs(full_path.c_str(), &fs);
|
||||||
|
size_t total_free_bytes = fs.f_bfree * fs.f_bsize;
|
||||||
|
size_t maybe_used_bytes = currently_merging_info.instance().total_size;
|
||||||
|
|
||||||
/// Сколько кусков, начиная с текущего, можно включить в валидный отрезок, начинающийся левее текущего куска.
|
/// Сколько кусков, начиная с текущего, можно включить в валидный отрезок, начинающийся левее текущего куска.
|
||||||
/// Нужно для определения максимальности по включению.
|
/// Нужно для определения максимальности по включению.
|
||||||
@ -892,6 +897,7 @@ bool StorageMergeTree::selectPartsToMerge(std::vector<DataPartPtr> & parts, bool
|
|||||||
size_t cur_max = first_part->size;
|
size_t cur_max = first_part->size;
|
||||||
size_t cur_min = first_part->size;
|
size_t cur_min = first_part->size;
|
||||||
size_t cur_sum = first_part->size;
|
size_t cur_sum = first_part->size;
|
||||||
|
size_t cur_total_size = first_part->getSizeInBytes();
|
||||||
int cur_len = 1;
|
int cur_len = 1;
|
||||||
|
|
||||||
DayNum_t month = first_part->left_month;
|
DayNum_t month = first_part->left_month;
|
||||||
@ -926,6 +932,7 @@ bool StorageMergeTree::selectPartsToMerge(std::vector<DataPartPtr> & parts, bool
|
|||||||
cur_max = std::max(cur_max, last_part->size);
|
cur_max = std::max(cur_max, last_part->size);
|
||||||
cur_min = std::min(cur_min, last_part->size);
|
cur_min = std::min(cur_min, last_part->size);
|
||||||
cur_sum += last_part->size;
|
cur_sum += last_part->size;
|
||||||
|
cur_total_size += last_part->getSizeInBytes();
|
||||||
++cur_len;
|
++cur_len;
|
||||||
cur_id = last_part->right;
|
cur_id = last_part->right;
|
||||||
|
|
||||||
@ -949,6 +956,7 @@ bool StorageMergeTree::selectPartsToMerge(std::vector<DataPartPtr> & parts, bool
|
|||||||
|
|
||||||
/// Если отрезок валидный, то он самый длинный валидный, начинающийся тут.
|
/// Если отрезок валидный, то он самый длинный валидный, начинающийся тут.
|
||||||
if (cur_len >= min_len &&
|
if (cur_len >= min_len &&
|
||||||
|
total_free_bytes > (maybe_used_bytes + cur_total_size) * 1.5 && /// Достаточно свободной памяти, чтобы покрыть все активные мерджи и новый с запасом по памяти в 50%
|
||||||
(static_cast<double>(cur_max) / (cur_sum - cur_max) < ratio ||
|
(static_cast<double>(cur_max) / (cur_sum - cur_max) < ratio ||
|
||||||
(is_old_month && merge_anything_for_old_months && cur_age_in_sec > 3600*24*15))) /// За старый месяц объединяем что угодно, если разрешено и если этому хотя бы 15 дней
|
(is_old_month && merge_anything_for_old_months && cur_age_in_sec > 3600*24*15))) /// За старый месяц объединяем что угодно, если разрешено и если этому хотя бы 15 дней
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user