ClickHouse/dbms/src/Interpreters/DDLWorker.h

105 lines
2.7 KiB
C++
Raw Normal View History

#pragma once
#include <Interpreters/Context.h>
#include <Interpreters/Cluster.h>
#include <DataStreams/BlockIO.h>
#include <common/logger_useful.h>
#include <atomic>
#include <chrono>
#include <condition_variable>
#include <mutex>
#include <thread>
namespace DB
{
class ASTAlterQuery;
struct DDLLogEntry;
struct DDLTask;
BlockIO executeDDLQueryOnCluster(const ASTPtr & query_ptr, Context & context);
class DDLWorker
{
public:
DDLWorker(const std::string & zk_root_dir, Context & context_);
~DDLWorker();
2017-04-21 12:39:28 +00:00
/// Pushes query into DDL queue, returns path to created node
String enqueueQuery(DDLLogEntry & entry);
/// Host ID (name:port) for logging purposes
2017-07-28 16:14:49 +00:00
/// Note that in each task hosts are identified individually by name:port from initiator server cluster config
std::string getCommonHostID() const
{
return host_fqdn_id;
}
private:
void processTasks();
2017-07-28 16:14:49 +00:00
bool initAndCheckTask(DDLTask & task, const String & entry_name);
void processTask(DDLTask & task);
void processTaskAlter(
DDLTask & task,
2017-07-28 16:14:49 +00:00
const ASTAlterQuery * ast_alter,
const String & rewritten_query,
const String & node_path);
2017-07-28 16:14:49 +00:00
void parseQueryAndResolveHost(DDLTask & task);
bool tryExecuteQuery(const String & query, const DDLTask & task, ExecutionStatus & status);
2017-07-28 16:14:49 +00:00
2017-04-19 14:21:27 +00:00
/// Checks and cleanups queue's nodes
void cleanupQueue(const Strings * node_names_to_check = nullptr);
2017-07-28 16:14:49 +00:00
2017-04-25 15:21:03 +00:00
void createStatusDirs(const std::string & node_name);
ASTPtr getRewrittenQuery(const DDLLogEntry & node);
2017-07-28 16:14:49 +00:00
void run();
private:
Context & context;
Logger * log = &Logger::get("DDLWorker");
std::string host_fqdn; /// current host domain name
std::string host_fqdn_id; /// host_name:port
2017-04-25 15:21:03 +00:00
std::string queue_dir; /// dir with queue of queries
std::string master_dir; /// dir with queries was initiated by the server
2017-07-28 16:14:49 +00:00
/// Last task that was skipped or sucesfully executed
std::string last_processed_task_name;
std::shared_ptr<zkutil::ZooKeeper> zookeeper;
/// Save state of executed task to avoid duplicate execution on ZK error
2017-07-28 16:14:49 +00:00
using DDLTaskPtr = std::unique_ptr<DDLTask>;
DDLTaskPtr current_task;
std::shared_ptr<Poco::Event> event_queue_updated;
2017-05-31 14:01:08 +00:00
std::atomic<bool> stop_flag{false};
std::thread thread;
2017-04-19 14:21:27 +00:00
size_t last_cleanup_time_seconds = 0;
2017-05-31 14:01:08 +00:00
/// Delete node if its age is greater than that
static const size_t node_max_lifetime_seconds;
/// Cleaning starts after new node event is received if the last cleaning wasn't made sooner than N seconds ago
static const size_t cleanup_min_period_seconds;
2017-04-19 14:21:27 +00:00
friend class DDLQueryStatusInputSream;
friend class DDLTask;
};
}