merge tree: update in CurrentlyMergingInfo. Now looking on available disk space before merge [METR-9279] [METR-9444]

This commit is contained in:
Sergey Fedorov 2013-12-12 14:11:40 +00:00
parent ee1fff79f2
commit 4787aefff9
2 changed files with 11 additions and 3 deletions

View File

@ -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;

View File

@ -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 дней
{ {