2014-10-15 01:22:06 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <DB/Core/Exception.h>
|
|
|
|
|
#include <DB/Core/ErrorCodes.h>
|
|
|
|
|
#include <DB/Core/Types.h>
|
2015-09-24 00:21:02 +00:00
|
|
|
|
#include <DB/IO/WriteHelpers.h>
|
2015-09-17 21:30:43 +00:00
|
|
|
|
|
2014-10-15 01:22:06 +00:00
|
|
|
|
#include <mutex>
|
|
|
|
|
#include <condition_variable>
|
|
|
|
|
|
|
|
|
|
|
2015-09-17 21:30:43 +00:00
|
|
|
|
struct Stat;
|
|
|
|
|
|
|
|
|
|
|
2014-10-15 01:22:06 +00:00
|
|
|
|
namespace DB
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
class ReadBuffer;
|
|
|
|
|
class WriteBuffer;
|
|
|
|
|
class StorageReplicatedMergeTree;
|
|
|
|
|
|
|
|
|
|
|
2015-09-24 00:21:02 +00:00
|
|
|
|
/** Добавляет кусок в множество future_parts; в деструкторе убирает.
|
|
|
|
|
* future_parts - множество кусков, которые будут созданы после выполнения
|
|
|
|
|
* выполняющихся в данный момент элементов очереди.
|
|
|
|
|
*/
|
2014-10-15 01:22:06 +00:00
|
|
|
|
struct FuturePartTagger
|
|
|
|
|
{
|
|
|
|
|
String part;
|
|
|
|
|
StorageReplicatedMergeTree & storage;
|
|
|
|
|
|
|
|
|
|
FuturePartTagger(const String & part_, StorageReplicatedMergeTree & storage_);
|
|
|
|
|
~FuturePartTagger();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
typedef Poco::SharedPtr<FuturePartTagger> FuturePartTaggerPtr;
|
|
|
|
|
|
|
|
|
|
|
2015-09-24 00:21:02 +00:00
|
|
|
|
/// Запись о том, что нужно сделать. Только данные (их можно копировать).
|
|
|
|
|
struct ReplicatedMergeTreeLogEntryData
|
2014-10-15 01:22:06 +00:00
|
|
|
|
{
|
|
|
|
|
enum Type
|
|
|
|
|
{
|
2015-09-24 01:18:25 +00:00
|
|
|
|
EMPTY, /// Не используется.
|
2014-10-15 01:22:06 +00:00
|
|
|
|
GET_PART, /// Получить кусок с другой реплики.
|
|
|
|
|
MERGE_PARTS, /// Слить куски.
|
|
|
|
|
DROP_RANGE, /// Удалить куски в указанном месяце в указанном диапазоне номеров.
|
|
|
|
|
ATTACH_PART, /// Перенести кусок из директории detached или unreplicated.
|
|
|
|
|
};
|
|
|
|
|
|
2015-09-24 00:21:02 +00:00
|
|
|
|
String typeToString() const
|
|
|
|
|
{
|
|
|
|
|
switch (type)
|
|
|
|
|
{
|
|
|
|
|
case ReplicatedMergeTreeLogEntryData::GET_PART: return "GET_PART";
|
|
|
|
|
case ReplicatedMergeTreeLogEntryData::MERGE_PARTS: return "MERGE_PARTS";
|
|
|
|
|
case ReplicatedMergeTreeLogEntryData::DROP_RANGE: return "DROP_RANGE";
|
|
|
|
|
case ReplicatedMergeTreeLogEntryData::ATTACH_PART: return "ATTACH_PART";
|
|
|
|
|
default:
|
|
|
|
|
throw Exception("Unknown log entry type: " + DB::toString(type), ErrorCodes::LOGICAL_ERROR);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-10-15 01:22:06 +00:00
|
|
|
|
String znode_name;
|
|
|
|
|
|
2015-09-24 01:18:25 +00:00
|
|
|
|
Type type = EMPTY;
|
2014-10-15 01:22:06 +00:00
|
|
|
|
String source_replica; /// Пустая строка значит, что эта запись была добавлена сразу в очередь, а не скопирована из лога.
|
|
|
|
|
|
|
|
|
|
/// Имя куска, получающегося в результате.
|
|
|
|
|
/// Для DROP_RANGE имя несуществующего куска. Нужно удалить все куски, покрытые им.
|
|
|
|
|
String new_part_name;
|
2015-09-27 10:45:49 +00:00
|
|
|
|
String block_id; /// Для кусков нулевого уровня - идентификатор блока для дедупликации (имя ноды в /blocks/).
|
2014-10-15 01:22:06 +00:00
|
|
|
|
|
|
|
|
|
Strings parts_to_merge;
|
|
|
|
|
|
|
|
|
|
/// Для DROP_RANGE, true значит, что куски нужно не удалить, а перенести в директорию detached.
|
|
|
|
|
bool detach = false;
|
|
|
|
|
|
|
|
|
|
/// Для ATTACH_PART имя куска в директории detached или unreplicated.
|
|
|
|
|
String source_part_name;
|
|
|
|
|
/// Нужно переносить из директории unreplicated, а не detached.
|
2015-09-24 01:18:25 +00:00
|
|
|
|
bool attach_unreplicated = false;
|
2014-10-15 01:22:06 +00:00
|
|
|
|
|
2015-09-21 22:43:38 +00:00
|
|
|
|
/// Доступ под queue_mutex.
|
|
|
|
|
bool currently_executing = false; /// Выполняется ли действие сейчас.
|
|
|
|
|
/// Эти несколько полей имеют лишь информационный характер (для просмотра пользователем с помощью системных таблиц).
|
|
|
|
|
/// Доступ под queue_mutex.
|
|
|
|
|
size_t num_tries = 0; /// Количество попыток выполнить действие (с момента старта сервера; включая выполняющееся).
|
|
|
|
|
ExceptionPtr exception; /// Последний эксепшен, в случае безуспешной попытки выполнить действие.
|
|
|
|
|
time_t last_attempt_time = 0; /// Время начала последней попытки выполнить действие.
|
2015-09-24 00:21:02 +00:00
|
|
|
|
size_t num_postponed = 0; /// Количество раз, когда действие было отложено.
|
2015-09-21 22:43:38 +00:00
|
|
|
|
String postpone_reason; /// Причина, по которой действие было отложено, если оно отложено.
|
2015-09-24 00:21:02 +00:00
|
|
|
|
time_t last_postpone_time = 0; /// Время последнего раза, когда действие было отложено.
|
2014-10-15 01:22:06 +00:00
|
|
|
|
|
2014-11-08 23:55:24 +00:00
|
|
|
|
/// Время создания или время копирования из общего лога в очередь конкретной реплики.
|
|
|
|
|
time_t create_time = 0;
|
|
|
|
|
|
2015-09-09 18:15:36 +00:00
|
|
|
|
/// Величина кворума (для GET_PART) - ненулевое значение при включенной кворумной записи.
|
|
|
|
|
size_t quorum = 0;
|
2015-09-24 00:21:02 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct ReplicatedMergeTreeLogEntry : ReplicatedMergeTreeLogEntryData
|
|
|
|
|
{
|
|
|
|
|
typedef Poco::SharedPtr<ReplicatedMergeTreeLogEntry> Ptr;
|
|
|
|
|
|
|
|
|
|
FuturePartTaggerPtr future_part_tagger;
|
|
|
|
|
std::condition_variable execution_complete; /// Пробуждается когда currently_executing становится false.
|
2014-11-08 23:55:24 +00:00
|
|
|
|
|
2014-10-15 01:22:06 +00:00
|
|
|
|
void addResultToVirtualParts(StorageReplicatedMergeTree & storage);
|
|
|
|
|
void tagPartAsFuture(StorageReplicatedMergeTree & storage);
|
|
|
|
|
|
|
|
|
|
void writeText(WriteBuffer & out) const;
|
|
|
|
|
void readText(ReadBuffer & in);
|
|
|
|
|
|
|
|
|
|
String toString() const;
|
2015-09-17 21:30:43 +00:00
|
|
|
|
static Ptr parse(const String & s, const Stat & stat);
|
2014-10-15 01:22:06 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|