From 50fc514bf8939e433db7de4f0f3f2bb467063a1d Mon Sep 17 00:00:00 2001 From: Pavel Kartavyy Date: Fri, 28 Feb 2014 18:25:15 +0400 Subject: [PATCH] Merge --- .../DB/Storages/MergeTree/MergeTreeBlockOutputStream.h | 2 ++ dbms/include/DB/Storages/StorageMergeTree.h | 10 ++++++++++ dbms/src/Storages/StorageMergeTree.cpp | 4 ++++ 3 files changed, 16 insertions(+) diff --git a/dbms/include/DB/Storages/MergeTree/MergeTreeBlockOutputStream.h b/dbms/include/DB/Storages/MergeTree/MergeTreeBlockOutputStream.h index e4d69125d2c..f74e82860c0 100644 --- a/dbms/include/DB/Storages/MergeTree/MergeTreeBlockOutputStream.h +++ b/dbms/include/DB/Storages/MergeTree/MergeTreeBlockOutputStream.h @@ -22,6 +22,8 @@ public: void write(const Block & block) { + Poco::ScopedReadRWLock write_lock(storage.write_lock); + storage.check(block, true); DateLUTSingleton & date_lut = DateLUTSingleton::instance(); diff --git a/dbms/include/DB/Storages/StorageMergeTree.h b/dbms/include/DB/Storages/StorageMergeTree.h index 8d0fdd39cb1..b9c0a754647 100644 --- a/dbms/include/DB/Storages/StorageMergeTree.h +++ b/dbms/include/DB/Storages/StorageMergeTree.h @@ -7,6 +7,7 @@ #include #include #include +#include namespace DB @@ -409,6 +410,15 @@ private: DataParts data_parts; Poco::FastMutex data_parts_mutex; + /** Взятие этого лока на запись, запрещает мердж */ + Poco::RWLock merge_lock; + + /** Взятие этого лока на запись, запрещает запись */ + Poco::RWLock write_lock; + + /** Взятие этого лока на запись, запрещает чтение */ + Poco::RWLock read_lock; + StorageMergeTree(const String & path_, const String & name_, NamesAndTypesListPtr columns_, const Context & context_, ASTPtr & primary_expr_ast_, diff --git a/dbms/src/Storages/StorageMergeTree.cpp b/dbms/src/Storages/StorageMergeTree.cpp index 4bd2537a37a..3127264c498 100644 --- a/dbms/src/Storages/StorageMergeTree.cpp +++ b/dbms/src/Storages/StorageMergeTree.cpp @@ -158,6 +158,8 @@ BlockInputStreams StorageMergeTree::read( size_t max_block_size, unsigned threads) { + Poco::ScopedReadRWLock lock(read_lock); + check(column_names_to_return); processed_stage = QueryProcessingStage::FetchColumns; @@ -783,6 +785,8 @@ void StorageMergeTree::mergeThread(bool while_can, bool aggressive) clearOldParts(); { + Poco::ScopedReadRWLock lock(merge_lock); + /// К концу этого логического блока должен быть вызван деструктор, чтобы затем корректно определить удаленные куски Poco::SharedPtr what;