From 281cd846cd0886fa772307ab6e1eeb97f175754b Mon Sep 17 00:00:00 2001 From: Pavel Kartavyy Date: Tue, 24 Mar 2015 18:06:09 +0300 Subject: [PATCH] Merge --- dbms/src/Storages/StorageChunkMerger.cpp | 30 +++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/dbms/src/Storages/StorageChunkMerger.cpp b/dbms/src/Storages/StorageChunkMerger.cpp index f2879193771..bfd55732fc7 100644 --- a/dbms/src/Storages/StorageChunkMerger.cpp +++ b/dbms/src/Storages/StorageChunkMerger.cpp @@ -231,7 +231,8 @@ public: shutdown_called(false), chunk_merger(chunk_merger_), context(context_), - log(log_) + log(log_), + merging(false) { } @@ -250,6 +251,8 @@ private: Logger * log; time_t last_nothing_to_merge_time = 0; + + std::atomic merging; }; StorageChunkMerger::StorageChunkMerger( @@ -297,6 +300,27 @@ StorageChunkMerger::~StorageChunkMerger() shutdown(); } +struct BoolLock +{ + BoolLock(std::atomic & flag_) : flag(flag_), locked(false) {} + + bool trylock() + { + bool expected = false; + locked = flag.compare_exchange_weak(expected, true); + return locked; + } + + ~BoolLock() + { + if (locked) + flag.store(false); + } + + std::atomic & flag; + bool locked; +}; + bool StorageChunkMerger::MergeTask::merge() { time_t now = time(0); @@ -306,6 +330,10 @@ bool StorageChunkMerger::MergeTask::merge() if (shutdown_called) return false; + BoolLock lock(merging); + if (!lock.trylock()) + return false; + bool merged = false; try