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

507 lines
24 KiB
C
Raw Normal View History

2014-03-09 17:36:01 +00:00
#pragma once
#include <DB/Core/SortDescription.h>
#include <DB/Interpreters/Context.h>
#include <DB/Interpreters/ExpressionActions.h>
#include <DB/Storages/IStorage.h>
#include <DB/Storages/MergeTree/ActiveDataPartSet.h>
2015-07-16 21:03:53 +00:00
#include <DB/Storages/MergeTree/MergeTreeSettings.h>
2014-04-02 07:59:43 +00:00
#include <DB/IO/ReadBufferFromString.h>
2014-07-16 09:32:15 +00:00
#include <DB/IO/WriteBufferFromFile.h>
2015-04-16 06:12:35 +00:00
#include <DB/IO/ReadBufferFromFile.h>
2014-07-28 10:36:11 +00:00
#include <DB/DataTypes/DataTypeString.h>
2014-07-30 12:10:34 +00:00
#include <DB/DataTypes/DataTypesNumberFixed.h>
2016-02-14 04:58:47 +00:00
#include <DB/Storages/MergeTree/MergeTreeDataPart.h>
2014-04-02 13:45:39 +00:00
2015-06-02 20:22:53 +00:00
struct SimpleIncrement;
2014-03-09 17:36:01 +00:00
namespace DB
{
namespace ErrorCodes
{
extern const int LOGICAL_ERROR;
extern const int INVALID_PARTITION_NAME;
extern const int TOO_MUCH_PARTS;
extern const int NO_SUCH_DATA_PART;
extern const int DUPLICATE_DATA_PART;
extern const int DIRECTORY_ALREADY_EXISTS;
extern const int TOO_MANY_UNEXPECTED_DATA_PARTS;
extern const int NO_SUCH_COLUMN_IN_TABLE;
}
2014-03-09 17:36:01 +00:00
/** Структура данных для *MergeTree движков.
* Используется merge tree для инкрементальной сортировки данных.
* Таблица представлена набором сортированных кусков.
* При вставке, данные сортируются по указанному выражению (первичному ключу) и пишутся в новый кусок.
* Куски объединяются в фоне, согласно некоторой эвристике.
* Для каждого куска, создаётся индексный файл, содержащий значение первичного ключа для каждой n-ой строки.
* Таким образом, реализуется эффективная выборка по диапазону первичного ключа.
*
* Дополнительно:
*
* Указывается столбец, содержащий дату.
* Для каждого куска пишется минимальная и максимальная дата.
* (по сути - ещё один индекс)
*
* Данные разделяются по разным месяцам (пишутся в разные куски для разных месяцев).
* Куски для разных месяцев не объединяются - для простоты эксплуатации.
* (дают локальность обновлений, что удобно для синхронизации и бэкапа)
*
* Структура файлов:
* / min-date _ max-date _ min-id _ max-id _ level / - директория с куском.
* Внутри директории с куском:
* checksums.txt - список файлов с их размерами и контрольными суммами.
2014-07-09 13:39:19 +00:00
* columns.txt - список столбцов с их типами.
2014-03-09 17:36:01 +00:00
* primary.idx - индексный файл.
* Column.bin - данные столбца
* Column.mrk - засечки, указывающие, откуда начинать чтение, чтобы пропустить n * k строк.
*
* Имеется несколько режимов работы, определяющих, что делать при мердже:
* - Ordinary - ничего дополнительно не делать;
* - Collapsing - при склейке кусков "схлопывать"
* пары записей с разными значениями sign_column для одного значения первичного ключа.
* (см. CollapsingSortedBlockInputStream.h)
* - Summing - при склейке кусков, при совпадении PK суммировать все числовые столбцы, не входящие в PK.
2014-06-05 19:52:13 +00:00
* - Aggregating - при склейке кусков, при совпадении PK, делается слияние состояний столбцов-агрегатных функций.
2015-03-13 21:31:23 +00:00
* - Unsorted - при склейке кусков, данные не упорядочиваются, а всего лишь конкатенируются;
* - это позволяет читать данные ровно такими пачками, какими они были записаны.
2014-03-09 17:36:01 +00:00
*/
2014-03-13 12:48:07 +00:00
/** Этот класс хранит список кусков и параметры структуры данных.
* Для чтения и изменения данных используются отдельные классы:
2014-03-13 19:36:28 +00:00
* - MergeTreeDataSelectExecutor
2014-03-13 12:48:07 +00:00
* - MergeTreeDataWriter
* - MergeTreeDataMerger
2014-03-09 17:36:01 +00:00
*/
class MergeTreeData : public ITableDeclaration
2014-03-09 17:36:01 +00:00
{
2016-01-28 01:00:27 +00:00
friend class ReshardingWorker;
2014-03-09 17:36:01 +00:00
public:
2014-07-23 09:15:41 +00:00
/// Функция, которую можно вызвать, если есть подозрение, что данные куска испорчены.
2016-02-14 04:58:47 +00:00
using BrokenPartCallback = std::function<void (const String &)>;
using DataPart = MergeTreeDataPart;
2016-02-14 04:58:47 +00:00
using MutableDataPartPtr = std::shared_ptr<DataPart>;
2014-03-14 17:19:38 +00:00
/// После добавление в рабочее множество DataPart нельзя изменять.
2016-02-14 04:58:47 +00:00
using DataPartPtr = std::shared_ptr<const DataPart>;
2014-03-09 17:36:01 +00:00
struct DataPartPtrLess { bool operator() (const DataPartPtr & lhs, const DataPartPtr & rhs) const { return *lhs < *rhs; } };
2016-02-14 04:58:47 +00:00
using DataParts = std::set<DataPartPtr, DataPartPtrLess>;
using DataPartsVector = std::vector<DataPartPtr>;
2014-03-13 12:48:07 +00:00
2016-01-28 01:00:27 +00:00
/// Для перешардирования.
using MutableDataParts = std::set<MutableDataPartPtr, DataPartPtrLess>;
2016-01-28 16:06:57 +00:00
using PerShardDataParts = std::unordered_map<size_t, MutableDataPartPtr>;
2014-03-09 17:36:01 +00:00
2014-07-01 15:58:25 +00:00
/// Некоторые операции над множеством кусков могут возвращать такой объект.
/// Если не был вызван commit или rollback, деструктор откатывает операцию.
2014-07-01 15:58:25 +00:00
class Transaction : private boost::noncopyable
{
public:
Transaction() {}
void commit()
{
clear();
}
void rollback()
{
if (data && (!parts_to_remove_on_rollback.empty() || !parts_to_add_on_rollback.empty()))
{
LOG_DEBUG(data->log, "Undoing transaction");
data->replaceParts(parts_to_remove_on_rollback, parts_to_add_on_rollback, true);
clear();
}
2014-07-01 15:58:25 +00:00
}
~Transaction()
{
try
{
rollback();
2014-07-01 15:58:25 +00:00
}
catch(...)
{
tryLogCurrentException("~MergeTreeData::Transaction");
}
}
private:
friend class MergeTreeData;
MergeTreeData * data = nullptr;
/// Что делать для отката операции.
DataPartsVector parts_to_remove_on_rollback;
DataPartsVector parts_to_add_on_rollback;
void clear()
{
data = nullptr;
parts_to_remove_on_rollback.clear();
parts_to_add_on_rollback.clear();
}
2014-07-01 15:58:25 +00:00
};
2014-07-11 12:47:45 +00:00
/// Объект, помнящий какие временные файлы были созданы в директории с куском в ходе изменения (ALTER) его столбцов.
class AlterDataPartTransaction : private boost::noncopyable
{
public:
/// Переименовывает временные файлы, завершая ALTER куска.
void commit();
/// Если не был вызван commit(), удаляет временные файлы, отменяя ALTER куска.
~AlterDataPartTransaction();
/// Посмотреть изменения перед коммитом.
const NamesAndTypesList & getNewColumns() const { return new_columns; }
const DataPart::Checksums & getNewChecksums() const { return new_checksums; }
2014-07-11 12:47:45 +00:00
private:
friend class MergeTreeData;
2014-07-14 14:07:47 +00:00
AlterDataPartTransaction(DataPartPtr data_part_) : data_part(data_part_), alter_lock(data_part->alter_mutex) {}
void clear()
{
alter_lock.unlock();
data_part = nullptr;
}
2014-07-11 12:47:45 +00:00
DataPartPtr data_part;
2016-01-29 02:22:43 +00:00
std::unique_lock<std::mutex> alter_lock;
2014-07-14 14:07:47 +00:00
DataPart::Checksums new_checksums;
NamesAndTypesList new_columns;
2014-07-11 12:47:45 +00:00
/// Если значение - пустая строка, файл нужно удалить, и он не временный.
NameToNameMap rename_map;
};
2016-02-14 04:58:47 +00:00
using AlterDataPartTransactionPtr = std::unique_ptr<AlterDataPartTransaction>;
2014-07-11 12:47:45 +00:00
2014-03-13 12:48:07 +00:00
/// Режим работы. См. выше.
enum Mode
2014-03-09 17:36:01 +00:00
{
2014-03-13 12:48:07 +00:00
Ordinary,
Collapsing,
Summing,
2014-05-26 16:11:20 +00:00
Aggregating,
2015-03-13 21:31:23 +00:00
Unsorted,
2014-03-13 12:48:07 +00:00
};
2014-07-23 09:15:41 +00:00
static void doNothing(const String & name) {}
2014-03-13 12:48:07 +00:00
/** Подцепить таблицу с соответствующим именем, по соответствующему пути (с / на конце),
* (корректность имён и путей не проверяется)
* состоящую из указанных столбцов.
*
2015-03-13 21:31:23 +00:00
* primary_expr_ast - выражение для сортировки; Пустое для UnsortedMergeTree.
2014-03-13 12:48:07 +00:00
* date_column_name - имя столбца с датой;
* index_granularity - на сколько строчек пишется одно значение индекса.
2014-07-09 13:39:19 +00:00
* require_part_metadata - обязательно ли в директории с куском должны быть checksums.txt и columns.txt
2014-03-13 12:48:07 +00:00
*/
MergeTreeData( const String & full_path_, NamesAndTypesListPtr columns_,
const NamesAndTypesList & materialized_columns_,
const NamesAndTypesList & alias_columns_,
const ColumnDefaults & column_defaults_,
2016-01-28 01:00:27 +00:00
Context & context_,
2014-03-13 12:48:07 +00:00
ASTPtr & primary_expr_ast_,
const String & date_column_name_,
2014-04-08 07:58:53 +00:00
const ASTPtr & sampling_expression_, /// nullptr, если семплирование не поддерживается.
2014-03-13 12:48:07 +00:00
size_t index_granularity_,
Mode mode_,
2014-11-22 02:22:30 +00:00
const String & sign_column_, /// Для Collapsing режима.
const Names & columns_to_sum_, /// Для Summing режима. Если пустое - то выбирается автоматически.
2014-05-08 07:12:01 +00:00
const MergeTreeSettings & settings_,
2014-07-09 13:39:19 +00:00
const String & log_name_,
2014-07-23 09:15:41 +00:00
bool require_part_metadata_,
BrokenPartCallback broken_part_callback_ = &MergeTreeData::doNothing);
2014-03-09 17:36:01 +00:00
2014-08-13 08:07:52 +00:00
/// Загрузить множество кусков с данными с диска. Вызывается один раз - сразу после создания объекта.
void loadDataParts(bool skip_sanity_checks);
2014-03-13 12:48:07 +00:00
std::string getModePrefix() const;
bool supportsSampling() const { return !!sampling_expression; }
bool supportsPrewhere() const { return true; }
2015-07-08 04:38:46 +00:00
bool supportsFinal() const
{
return mode == Mode::Collapsing
|| mode == Mode::Summing
|| mode == Mode::Aggregating;
}
2015-08-17 21:09:36 +00:00
Int64 getMaxDataPartIndex();
2014-03-13 12:48:07 +00:00
std::string getTableName() const override
{
throw Exception("Logical error: calling method getTableName of not a table.", ErrorCodes::LOGICAL_ERROR);
2014-05-28 14:54:42 +00:00
}
2014-03-13 12:48:07 +00:00
const NamesAndTypesList & getColumnsListImpl() const override { return *columns; }
2014-03-13 12:48:07 +00:00
NameAndTypePair getColumn(const String & column_name) const override
2014-07-28 10:36:11 +00:00
{
if (column_name == "_part")
return NameAndTypePair("_part", new DataTypeString);
if (column_name == "_part_index")
return NameAndTypePair("_part_index", new DataTypeUInt64);
if (column_name == "_sample_factor")
return NameAndTypePair("_sample_factor", new DataTypeFloat64);
return ITableDeclaration::getColumn(column_name);
2014-07-28 10:36:11 +00:00
}
bool hasColumn(const String & column_name) const override
2014-07-28 10:36:11 +00:00
{
return ITableDeclaration::hasColumn(column_name)
|| column_name == "_part"
|| column_name == "_part_index"
|| column_name == "_sample_factor";
2014-07-28 10:36:11 +00:00
}
String getFullPath() const { return full_path; }
2014-03-13 12:48:07 +00:00
2014-05-08 07:12:01 +00:00
String getLogName() const { return log_name; }
2014-03-13 17:44:00 +00:00
/** Возвращает копию списка, чтобы снаружи можно было не заботиться о блокировках.
*/
DataParts getDataParts() const;
DataPartsVector getDataPartsVector() const;
DataParts getAllDataParts() const;
2014-05-16 15:55:57 +00:00
/** Размер активной части в количестве байт.
*/
size_t getTotalActiveSizeInBytes() const;
2014-05-16 15:55:57 +00:00
/** Максимальное количество кусков в одном месяце.
*/
size_t getMaxPartsCountForMonth() const;
2014-03-13 17:44:00 +00:00
/** Минимальный номер блока в указанном месяце.
* Возвращает также bool - есть ли хоть один кусок.
*/
std::pair<Int64, bool> getMinBlockNumberForMonth(DayNum_t month) const;
/** Есть ли указанный номер блока в каком-нибудь куске указанного месяца.
*/
bool hasBlockNumberInMonth(Int64 block_number, DayNum_t month) const;
2014-05-27 08:43:01 +00:00
/** Если в таблице слишком много активных кусков, спит некоторое время, чтобы дать им возможность смерджиться.
* Если передано until - проснуться раньше, если наступило событие.
2014-05-27 08:43:01 +00:00
*/
void delayInsertIfNeeded(Poco::Event * until = nullptr);
2014-05-27 08:43:01 +00:00
2014-07-25 11:38:46 +00:00
/** Возвращает активный кусок с указанным именем или кусок, покрывающий его. Если такого нет, возвращает nullptr.
2014-03-13 17:44:00 +00:00
*/
2014-07-25 11:38:46 +00:00
DataPartPtr getActiveContainingPart(const String & part_name);
/** Возвращает кусок с таким именем (активный или не активный). Если нету, nullptr.
*/
DataPartPtr getPartIfExists(const String & part_name);
2016-01-28 01:00:27 +00:00
DataPartPtr getShardedPartIfExists(const String & part_name, size_t shard_no);
2014-03-13 17:44:00 +00:00
/** Переименовывает временный кусок в постоянный и добавляет его в рабочий набор.
* Если increment != nullptr, индекс куска берется из инкремента. Иначе индекс куска не меняется.
2014-04-07 15:45:46 +00:00
* Предполагается, что кусок не пересекается с существующими.
2014-07-01 15:58:25 +00:00
* Если out_transaction не nullptr, присваивает туда объект, позволяющий откатить добавление куска (но не переименование).
2014-04-07 15:45:46 +00:00
*/
2015-06-02 20:22:53 +00:00
void renameTempPartAndAdd(MutableDataPartPtr & part, SimpleIncrement * increment = nullptr, Transaction * out_transaction = nullptr);
2014-04-07 15:45:46 +00:00
/** То же, что renameTempPartAndAdd, но кусок может покрывать существующие куски.
* Удаляет и возвращает все куски, покрытые добавляемым (в возрастающем порядке).
2014-03-13 17:44:00 +00:00
*/
2015-06-02 20:22:53 +00:00
DataPartsVector renameTempPartAndReplace(MutableDataPartPtr & part, SimpleIncrement * increment = nullptr, Transaction * out_transaction = nullptr);
2014-07-01 15:58:25 +00:00
2014-08-08 08:28:13 +00:00
/** Убирает из рабочего набора куски remove и добавляет куски add. add должны уже быть в all_data_parts.
2015-09-16 04:18:16 +00:00
* Если clear_without_timeout, данные будут удалены сразу, либо при следующем clearOldParts, игнорируя old_parts_lifetime.
2014-07-01 15:58:25 +00:00
*/
2014-07-07 10:23:24 +00:00
void replaceParts(const DataPartsVector & remove, const DataPartsVector & add, bool clear_without_timeout);
2014-03-13 17:44:00 +00:00
2014-08-08 08:28:13 +00:00
/** Добавляет новый кусок в список известных кусков и в рабочий набор.
*/
2014-09-29 20:26:46 +00:00
void attachPart(const DataPartPtr & part);
2014-08-08 08:28:13 +00:00
2014-08-07 09:23:55 +00:00
/** Переименовывает кусок в detached/prefix_кусок и забывает про него. Данные не будут удалены в clearOldParts.
2014-07-28 09:46:28 +00:00
* Если restore_covered, добавляет в рабочий набор неактивные куски, слиянием которых получен удаляемый кусок.
2014-04-02 07:59:43 +00:00
*/
2014-09-29 20:26:46 +00:00
void renameAndDetachPart(const DataPartPtr & part, const String & prefix = "", bool restore_covered = false, bool move_to_detached = true);
2014-08-08 08:28:13 +00:00
/** Убирает кусок из списка кусков (включая all_data_parts), но не перемещает директорию.
2014-08-08 08:28:13 +00:00
*/
2014-09-29 20:26:46 +00:00
void detachPartInPlace(const DataPartPtr & part);
2014-04-02 10:10:37 +00:00
2014-07-25 11:15:11 +00:00
/** Возвращает старые неактуальные куски, которые можно удалить. Одновременно удаляет их из списка кусков, но не с диска.
2014-03-13 17:44:00 +00:00
*/
2014-07-25 11:15:11 +00:00
DataPartsVector grabOldParts();
/** Обращает изменения, сделанные grabOldParts().
*/
void addOldParts(const DataPartsVector & parts);
/** Удалить неактуальные куски.
*/
void clearOldParts();
2014-03-13 17:44:00 +00:00
/** Удалить старые временные директории.
*/
void clearOldTemporaryDirectories();
2014-03-13 17:44:00 +00:00
/** После вызова dropAllData больше ничего вызывать нельзя.
2014-03-13 19:14:25 +00:00
* Удаляет директорию с данными и сбрасывает кеши разжатых блоков и засечек.
2014-03-13 17:44:00 +00:00
*/
void dropAllData();
2014-03-13 19:14:25 +00:00
/** Перемещает всю директорию с данными.
2014-03-13 19:07:17 +00:00
* Сбрасывает кеши разжатых блоков и засечек.
2014-07-11 12:47:45 +00:00
* Нужно вызывать под залоченным lockStructureForAlter().
2014-03-13 17:44:00 +00:00
*/
2014-07-28 14:33:30 +00:00
void setPath(const String & full_path, bool move_data);
2014-03-13 17:44:00 +00:00
2014-07-11 12:47:45 +00:00
/* Проверить, что такой ALTER можно выполнить:
* - Есть все нужные столбцы.
* - Все преобразования типов допустимы.
* - Не затронуты столбцы ключа, знака и семплирования.
* Бросает исключение, если что-то не так.
*/
void checkAlter(const AlterCommands & params);
2014-07-15 15:51:27 +00:00
/** Выполняет ALTER куска данных, записывает результат во временные файлы.
* Возвращает объект, позволяющий переименовать временные файлы в постоянные.
2014-07-17 09:38:31 +00:00
* Если измененных столбцов подозрительно много, и !skip_sanity_checks, бросает исключение.
* Если никаких действий над данными не требуется, возвращает nullptr.
2014-07-15 15:51:27 +00:00
*/
2014-09-29 20:26:46 +00:00
AlterDataPartTransactionPtr alterDataPart(const DataPartPtr & part, const NamesAndTypesList & new_columns, bool skip_sanity_checks = false);
2014-07-11 12:47:45 +00:00
/// Нужно вызывать под залоченным lockStructureForAlter().
void setColumnsList(const NamesAndTypesList & new_columns) { columns = new NamesAndTypesList(new_columns); }
2014-03-14 17:03:52 +00:00
2014-07-23 09:15:41 +00:00
/// Нужно вызвать, если есть подозрение, что данные куска испорчены.
void reportBrokenPart(const String & name)
{
broken_part_callback(name);
}
2014-03-14 17:03:52 +00:00
ExpressionActionsPtr getPrimaryExpression() const { return primary_expr; }
SortDescription getSortDescription() const { return sort_descr; }
2014-08-08 08:28:13 +00:00
/// Проверить, что кусок не сломан и посчитать для него чексуммы, если их нет.
MutableDataPartPtr loadPartAndFixMetadata(const String & relative_path);
/** Сделать локальный бэкап (снэпшот) для кусков, начинающихся с указанного префикса.
* Бэкап создаётся в директории clickhouse_dir/shadow/i/, где i - инкрементное число.
*/
void freezePartition(const std::string & prefix);
2016-01-28 01:00:27 +00:00
/** Возвращает размер заданной партиции в байтах.
*/
size_t getPartitionSize(const std::string & partition_name) const;
2016-03-25 11:48:45 +00:00
/** Возвращает хэш от партиции.
*/
std::string computePartitionHash(const std::string & partition_name) const;
2014-09-19 11:44:29 +00:00
size_t getColumnSize(const std::string & name) const
{
2016-01-29 02:22:43 +00:00
std::lock_guard<std::mutex> lock{data_parts_mutex};
2014-09-23 11:35:27 +00:00
2014-09-19 11:44:29 +00:00
const auto it = column_sizes.find(name);
return it == std::end(column_sizes) ? 0 : it->second;
}
using ColumnSizes = std::unordered_map<std::string, size_t>;
ColumnSizes getColumnSizes() const
{
2016-01-29 02:22:43 +00:00
std::lock_guard<std::mutex> lock{data_parts_mutex};
return column_sizes;
}
2016-01-28 01:00:27 +00:00
/// Для ATTACH/DETACH/DROP/RESHARD PARTITION.
2014-10-03 17:57:01 +00:00
static String getMonthName(const Field & partition);
2016-01-28 01:00:27 +00:00
static String getMonthName(DayNum_t month);
2014-10-03 17:57:01 +00:00
static DayNum_t getMonthDayNum(const Field & partition);
2016-01-28 01:00:27 +00:00
static DayNum_t getMonthFromName(const String & month_name);
/// Получить месяц из имени куска или достаточной его части.
static DayNum_t getMonthFromPartPrefix(const String & part_prefix);
2014-10-03 17:57:01 +00:00
2016-01-28 01:00:27 +00:00
Context & context;
2014-03-14 17:03:52 +00:00
const String date_column_name;
const ASTPtr sampling_expression;
const size_t index_granularity;
2014-03-13 12:48:07 +00:00
/// Режим работы - какие дополнительные действия делать при мердже.
2014-03-14 17:03:52 +00:00
const Mode mode;
2014-03-13 12:48:07 +00:00
/// Для схлопывания записей об изменениях, если используется Collapsing режим работы.
2014-03-14 17:03:52 +00:00
const String sign_column;
2014-11-22 02:22:30 +00:00
/// Для суммирования, если используется Summing режим работы.
const Names columns_to_sum;
2014-03-13 12:48:07 +00:00
2014-03-14 17:03:52 +00:00
const MergeTreeSettings settings;
2014-03-13 12:48:07 +00:00
2014-03-22 14:44:44 +00:00
const ASTPtr primary_expr_ast;
Block primary_key_sample;
DataTypes primary_key_data_types;
2014-03-22 14:44:44 +00:00
2014-03-14 17:03:52 +00:00
private:
2016-03-07 04:31:10 +00:00
friend struct MergeTreeDataPart;
2016-02-14 04:58:47 +00:00
2014-07-09 13:39:19 +00:00
bool require_part_metadata;
2014-03-13 12:48:07 +00:00
ExpressionActionsPtr primary_expr;
SortDescription sort_descr;
String full_path;
2014-03-09 17:36:01 +00:00
2014-03-13 12:48:07 +00:00
NamesAndTypesListPtr columns;
2014-09-23 11:35:27 +00:00
/// Актуальные размеры столбцов в сжатом виде
ColumnSizes column_sizes;
2014-03-09 17:36:01 +00:00
2014-07-23 09:15:41 +00:00
BrokenPartCallback broken_part_callback;
2014-05-08 07:12:01 +00:00
String log_name;
2014-03-13 12:48:07 +00:00
Logger * log;
2014-03-09 17:36:01 +00:00
/** Актуальное множество кусков с данными. */
DataParts data_parts;
2016-01-29 02:22:43 +00:00
mutable std::mutex data_parts_mutex;
2014-03-09 17:36:01 +00:00
/** Множество всех кусков с данными, включая уже слитые в более крупные, но ещё не удалённые. Оно обычно небольшое (десятки элементов).
2014-03-13 12:48:07 +00:00
* Ссылки на кусок есть отсюда, из списка актуальных кусков и из каждого потока чтения, который его сейчас использует.
2014-03-09 17:36:01 +00:00
* То есть, если количество ссылок равно 1 - то кусок не актуален и не используется прямо сейчас, и его можно удалить.
*/
DataParts all_data_parts;
2016-01-29 02:22:43 +00:00
mutable std::mutex all_data_parts_mutex;
2014-03-09 17:36:01 +00:00
/// Используется, чтобы не выполнять одновременно функцию grabOldParts.
std::mutex grab_old_parts_mutex;
2016-01-28 01:00:27 +00:00
/** Для каждого шарда множество шардированных кусков.
*/
PerShardDataParts per_shard_data_parts;
2014-07-11 12:47:45 +00:00
/** Выражение, преобразующее типы столбцов.
* Если преобразований типов нет, out_expression=nullptr.
* out_rename_map отображает файлы-столбцы на выходе выражения в новые файлы таблицы.
* out_force_update_metadata показывает, нужно ли обновить метаданные даже если out_rename_map пуста (используется
* для бесплатного изменения списка значений Enum).
2014-07-11 12:47:45 +00:00
* Файлы, которые нужно удалить, в out_rename_map отображаются в пустую строку.
* Если !part, просто проверяет, что все нужные преобразования типов допустимы.
*/
2014-09-29 20:26:46 +00:00
void createConvertExpression(const DataPartPtr & part, const NamesAndTypesList & old_columns, const NamesAndTypesList & new_columns,
ExpressionActionsPtr & out_expression, NameToNameMap & out_rename_map, bool & out_force_update_metadata);
2014-09-19 11:44:29 +00:00
/// Рассчитывает размеры столбцов в сжатом виде для текущего состояния data_parts. Вызывается под блокировкой.
2014-09-19 11:44:29 +00:00
void calculateColumnSizes();
2014-09-23 11:35:27 +00:00
/// Добавляет или вычитывает вклад part в размеры столбцов в сжатом виде
2014-09-19 11:44:29 +00:00
void addPartContributionToColumnSizes(const DataPartPtr & part);
void removePartContributionToColumnSizes(const DataPartPtr & part);
2014-03-09 17:36:01 +00:00
};
}