2014-09-10 11:34:26 +00:00
|
|
|
#pragma once
|
|
|
|
|
2017-04-01 09:19:00 +00:00
|
|
|
#include <Common/Stopwatch.h>
|
|
|
|
#include <Common/CurrentMetrics.h>
|
|
|
|
#include <Common/MemoryTracker.h>
|
|
|
|
#include <Interpreters/Context.h>
|
|
|
|
#include <Storages/MergeTree/MergeTreeData.h>
|
2015-02-10 21:10:58 +00:00
|
|
|
#include <memory>
|
2014-09-10 11:34:26 +00:00
|
|
|
#include <list>
|
|
|
|
#include <mutex>
|
|
|
|
#include <atomic>
|
|
|
|
|
2016-10-24 04:06:27 +00:00
|
|
|
|
2016-10-27 22:50:02 +00:00
|
|
|
/** Maintains a list of currently running merges.
|
|
|
|
* For implementation of system.merges table.
|
|
|
|
*/
|
|
|
|
|
2016-10-24 04:06:27 +00:00
|
|
|
namespace CurrentMetrics
|
|
|
|
{
|
2017-04-01 07:20:54 +00:00
|
|
|
extern const Metric Merge;
|
2016-10-24 04:06:27 +00:00
|
|
|
}
|
|
|
|
|
2014-09-10 11:34:26 +00:00
|
|
|
namespace DB
|
|
|
|
{
|
|
|
|
|
2015-04-16 06:12:35 +00:00
|
|
|
struct MergeInfo
|
2016-12-23 20:23:46 +00:00
|
|
|
{
|
2017-04-01 07:20:54 +00:00
|
|
|
std::string database;
|
|
|
|
std::string table;
|
|
|
|
std::string result_part_name;
|
|
|
|
Array source_part_names;
|
|
|
|
Float64 elapsed;
|
|
|
|
Float64 progress;
|
|
|
|
UInt64 num_parts;
|
|
|
|
UInt64 total_size_bytes_compressed;
|
|
|
|
UInt64 total_size_marks;
|
|
|
|
UInt64 bytes_read_uncompressed;
|
|
|
|
UInt64 bytes_written_uncompressed;
|
|
|
|
UInt64 rows_read;
|
|
|
|
UInt64 rows_written;
|
|
|
|
UInt64 columns_written;
|
|
|
|
UInt64 memory_usage;
|
|
|
|
UInt64 thread_number;
|
2016-12-23 20:23:46 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
struct MergeListElement : boost::noncopyable
|
2014-09-10 11:34:26 +00:00
|
|
|
{
|
2017-04-01 07:20:54 +00:00
|
|
|
const std::string database;
|
|
|
|
const std::string table;
|
|
|
|
const std::string result_part_name;
|
|
|
|
Stopwatch watch;
|
2018-03-03 18:00:46 +00:00
|
|
|
std::atomic<Float64> progress{};
|
2017-04-01 07:20:54 +00:00
|
|
|
UInt64 num_parts{};
|
|
|
|
Names source_part_names;
|
|
|
|
UInt64 total_size_bytes_compressed{};
|
|
|
|
UInt64 total_size_marks{};
|
|
|
|
std::atomic<UInt64> bytes_read_uncompressed{};
|
|
|
|
std::atomic<UInt64> bytes_written_uncompressed{};
|
2016-11-03 12:00:44 +00:00
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
/// In case of Vertical algorithm they are actual only for primary key columns
|
|
|
|
std::atomic<UInt64> rows_read{};
|
|
|
|
std::atomic<UInt64> rows_written{};
|
2016-11-22 19:34:36 +00:00
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
/// Updated only for Vertical algorithm
|
|
|
|
std::atomic<UInt64> columns_written{};
|
2016-11-03 12:00:44 +00:00
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
MemoryTracker memory_tracker;
|
2018-02-01 17:55:08 +00:00
|
|
|
MemoryTracker * background_thread_memory_tracker;
|
|
|
|
MemoryTracker * background_thread_memory_tracker_prev_parent = nullptr;
|
2016-07-31 03:53:16 +00:00
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
/// Poco thread number used in logs
|
|
|
|
UInt32 thread_number;
|
2016-12-23 20:23:46 +00:00
|
|
|
|
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
MergeListElement(const std::string & database, const std::string & table, const std::string & result_part_name,
|
|
|
|
const MergeTreeData::DataPartsVector & source_parts);
|
2016-12-23 20:23:46 +00:00
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
MergeInfo getInfo() const;
|
2016-12-23 20:23:46 +00:00
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
~MergeListElement();
|
2015-04-16 06:12:35 +00:00
|
|
|
};
|
2014-09-10 11:34:26 +00:00
|
|
|
|
|
|
|
|
2015-04-16 06:12:35 +00:00
|
|
|
class MergeList;
|
|
|
|
|
|
|
|
class MergeListEntry
|
|
|
|
{
|
2017-04-01 07:20:54 +00:00
|
|
|
MergeList & list;
|
2015-04-16 06:12:35 +00:00
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
using container_t = std::list<MergeListElement>;
|
|
|
|
container_t::iterator it;
|
2014-09-10 11:34:26 +00:00
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
CurrentMetrics::Increment num_merges {CurrentMetrics::Merge};
|
2016-01-21 01:47:28 +00:00
|
|
|
|
2014-09-10 11:34:26 +00:00
|
|
|
public:
|
2017-04-01 07:20:54 +00:00
|
|
|
MergeListEntry(const MergeListEntry &) = delete;
|
|
|
|
MergeListEntry & operator=(const MergeListEntry &) = delete;
|
2015-04-16 06:12:35 +00:00
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
MergeListEntry(MergeList & list, const container_t::iterator it) : list(list), it{it} {}
|
|
|
|
~MergeListEntry();
|
2014-09-10 11:34:26 +00:00
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
MergeListElement * operator->() { return &*it; }
|
2015-04-16 06:12:35 +00:00
|
|
|
};
|
2014-09-10 11:34:26 +00:00
|
|
|
|
|
|
|
|
2015-04-16 06:12:35 +00:00
|
|
|
class MergeList
|
|
|
|
{
|
2017-04-01 07:20:54 +00:00
|
|
|
friend class MergeListEntry;
|
2014-09-10 11:34:26 +00:00
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
using container_t = std::list<MergeListElement>;
|
|
|
|
using info_container_t = std::list<MergeInfo>;
|
2015-04-16 06:12:35 +00:00
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
mutable std::mutex mutex;
|
|
|
|
container_t merges;
|
2015-04-16 06:12:35 +00:00
|
|
|
|
|
|
|
public:
|
2017-04-01 07:20:54 +00:00
|
|
|
using Entry = MergeListEntry;
|
|
|
|
using EntryPtr = std::unique_ptr<Entry>;
|
|
|
|
|
|
|
|
template <typename... Args>
|
|
|
|
EntryPtr insert(Args &&... args)
|
|
|
|
{
|
|
|
|
std::lock_guard<std::mutex> lock{mutex};
|
|
|
|
return std::make_unique<Entry>(*this, merges.emplace(merges.end(), std::forward<Args>(args)...));
|
|
|
|
}
|
|
|
|
|
|
|
|
info_container_t get() const
|
|
|
|
{
|
|
|
|
std::lock_guard<std::mutex> lock{mutex};
|
|
|
|
info_container_t res;
|
|
|
|
for (const auto & merge_element : merges)
|
|
|
|
res.emplace_back(merge_element.getInfo());
|
|
|
|
return res;
|
|
|
|
}
|
2014-09-10 11:34:26 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2015-04-16 06:12:35 +00:00
|
|
|
inline MergeListEntry::~MergeListEntry()
|
|
|
|
{
|
2017-04-01 07:20:54 +00:00
|
|
|
std::lock_guard<std::mutex> lock{list.mutex};
|
|
|
|
list.merges.erase(it);
|
2015-04-16 06:12:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-09-10 11:34:26 +00:00
|
|
|
}
|