ClickHouse/dbms/include/DB/Storages/MergeTree/MergeTreeDataMerger.h

53 lines
2.5 KiB
C
Raw Normal View History

2014-03-13 12:48:07 +00:00
#pragma once
#include <DB/Storages/MergeTree/MergeTreeData.h>
namespace DB
{
/** Умеет выбирать куски для слияния и сливать их.
*/
class MergeTreeDataMerger
{
public:
MergeTreeDataMerger(MergeTreeData & data_) : data(data_), log(&Logger::get("MergeTreeDataMerger")), canceled(false) {}
2014-03-13 17:44:00 +00:00
typedef boost::function<bool (const MergeTreeData::DataPartPtr &, const MergeTreeData::DataPartPtr &)> AllowedMergingPredicate;
/** Выбирает, какие куски слить. Использует кучу эвристик.
* Если merge_anything_for_old_months, для кусков за прошедшие месяцы снимается ограничение на соотношение размеров.
*
* can_merge - функция, определяющая, можно ли объединить пару соседних кусков.
* Эта функция должна координировать слияния со вставками и другими слияниями, обеспечивая, что:
* - Куски, между которыми еще может появиться новый кусок, нельзя сливать. См. METR-7001.
* - Кусок, который уже сливается с кем-то в одном месте, нельзя начать сливать в кем-то другим в другом месте.
*/
2014-03-13 12:48:07 +00:00
bool selectPartsToMerge(
MergeTreeData::DataPartsVector & what,
size_t available_disk_space,
bool merge_anything_for_old_months,
2014-03-13 17:44:00 +00:00
bool aggressive,
bool only_small,
const AllowedMergingPredicate & can_merge);
2014-03-13 12:48:07 +00:00
2014-03-13 17:44:00 +00:00
/// Сливает куски. Возвращает название нового куска. Если слияние отменили, возвращает пустую строку.
2014-03-13 12:48:07 +00:00
String mergeParts(const MergeTreeData::DataPartsVector & parts);
/// Примерное количество места на диске, нужное для мерджа. С запасом.
size_t estimateDiskSpaceForMerge(const MergeTreeData::DataPartsVector & parts);
/** Отменяет все текущие мерджи. Все выполняющиеся сейчас вызовы mergeParts скоро отменят слияние и вернут пустую строку.
* После этого с этим экземпляром ничего делать нельзя.
*/
void cancelAll() { canceled = true; }
private:
MergeTreeData & data;
Logger * log;
volatile bool canceled;
};
}