This commit is contained in:
Michael Kolupaev 2014-07-17 13:38:31 +04:00
parent 29e85b5fbc
commit 67b76568d3
4 changed files with 17 additions and 7 deletions

View File

@ -465,9 +465,6 @@ public:
/// Переименовывает временные файлы, завершая ALTER куска.
void commit();
/// Проверяет, сделаны ли какие-то изменения.
bool operator !() const { return !data_part; }
/// Если не был вызван commit(), удаляет временные файлы, отменяя ALTER куска.
~AlterDataPartTransaction();
@ -614,8 +611,10 @@ public:
/** Выполняет ALTER куска данных, записывает результат во временные файлы.
* Возвращает объект, позволяющий переименовать временные файлы в постоянные.
* Если измененных столбцов подозрительно много, и !skip_sanity_checks, бросает исключение.
* Если никаких действий над данными не требуется, возвращает nullptr.
*/
AlterDataPartTransactionPtr alterDataPart(DataPartPtr part, const NamesAndTypesList & new_columns);
AlterDataPartTransactionPtr alterDataPart(DataPartPtr part, const NamesAndTypesList & new_columns, bool skip_sanity_checks = false);
/// Нужно вызывать под залоченным lockStructureForAlter().
void setColumnsList(const NamesAndTypesList & new_columns) { columns = new NamesAndTypesList(new_columns); }

View File

@ -419,16 +419,24 @@ void MergeTreeData::createConvertExpression(DataPartPtr part, const NamesAndType
}
}
MergeTreeData::AlterDataPartTransactionPtr MergeTreeData::alterDataPart(DataPartPtr part, const NamesAndTypesList & new_columns)
MergeTreeData::AlterDataPartTransactionPtr MergeTreeData::alterDataPart(DataPartPtr part, const NamesAndTypesList & new_columns, bool skip_sanity_checks)
{
ExpressionActionsPtr expression;
AlterDataPartTransactionPtr transaction(new AlterDataPartTransaction(part));
createConvertExpression(part, part->columns, new_columns, expression, transaction->rename_map);
if (!skip_sanity_checks && transaction->rename_map.size() > 5)
{
transaction->clear();
throw Exception("Suspiciously many (" + toString(transaction->rename_map.size()) + ") files need to be modified in part " + part->name
+ ". Aborting just in case");
}
if (transaction->rename_map.empty())
{
transaction->clear();
return transaction;
return nullptr;
}
DataPart::Checksums add_checksums;

View File

@ -119,7 +119,9 @@ void StorageMergeTree::alter(const AlterCommands & params, const String & databa
std::vector<MergeTreeData::AlterDataPartTransactionPtr> transactions;
for (MergeTreeData::DataPartPtr part : parts)
{
transactions.push_back(data.alterDataPart(part, new_columns));
auto transaction = data.alterDataPart(part, new_columns);
if (transaction)
transactions.push_back(std::move(transaction));
}
auto table_hard_lock = lockStructureForAlter();

View File

@ -1172,6 +1172,7 @@ void StorageReplicatedMergeTree::alterThread()
for (const MergeTreeData::DataPartPtr & part : parts)
{
/// Обновим кусок и запишем результат во временные файлы.
/// TODO: Можно пропускать проверку на слишком большие изменения, если в ZooKeeper есть, например, нода /flags/force_alter.
auto transaction = data.alterDataPart(part, columns);
if (!transaction)