This commit is contained in:
Michael Kolupaev 2014-07-16 13:32:15 +04:00
parent 22c0c1778e
commit 12c6d16743
2 changed files with 30 additions and 6 deletions

View File

@ -8,6 +8,7 @@
#include <DB/Storages/IStorage.h>
#include <DB/Storages/MergeTree/ActiveDataPartSet.h>
#include <DB/IO/ReadBufferFromString.h>
#include <DB/IO/WriteBufferFromFile.h>
#include <DB/Common/escapeForFileName.h>
#include <Poco/RWLock.h>
@ -329,6 +330,14 @@ public:
if (storage.require_part_metadata)
throw Exception("No columns.txt in part " + name, ErrorCodes::NO_FILE_IN_DATA_PART);
columns = *storage.columns;
/// Если нет файла со списком столбцов, запишем его.
{
WriteBufferFromFile out(path + ".tmp", 4096);
columns.writeText(out);
}
Poco::File(path + ".tmp").renameTo(path);
return;
}

View File

@ -1148,7 +1148,8 @@ void StorageReplicatedMergeTree::alterThread()
LOG_INFO(log, "Columns list changed in ZooKeeper. Applying changes locally.");
InterpreterAlterQuery::updateMetadata(database_name, table_name, columns, context);
data.setColumnsList(columns);
/// TODO: unreplicated_data тоже!
if (unreplicated_data)
unreplicated_data->setColumnsList(columns);
columns_version = stat.version;
LOG_INFO(log, "Applied changes to table.");
}
@ -1164,10 +1165,10 @@ void StorageReplicatedMergeTree::alterThread()
if (changed)
LOG_INFO(log, "ALTER-ing parts");
auto parts = data.getDataParts();
int changed_parts = 0;
auto parts = data.getDataParts();
for (const MergeTreeData::DataPartPtr & part : parts)
{
/// Обновим кусок и запишем результат во временные файлы.
@ -1188,9 +1189,23 @@ void StorageReplicatedMergeTree::alterThread()
transaction->commit();
}
/// TODO: Обновить нереплицируемые куски. Поскольку у них может изначально не быть columns.txt,
/// нужно записывать им columns.txt в MergeTreeData::loadDataParts.
/// После этого будет просто сделать неблокирующий ALTER в StorageMergeTree тоже.
/// То же самое для нереплицируемых данных.
if (unreplicated_data)
{
parts = unreplicated_data->getDataParts();
for (const MergeTreeData::DataPartPtr & part : parts)
{
auto transaction = unreplicated_data->alterDataPart(part, columns);
if (!transaction)
continue;
++changed_parts;
transaction->commit();
}
}
zookeeper->set(replica_path + "/columns", columns.toString());