From ffe7558fe265189f04827233b42f712d00658024 Mon Sep 17 00:00:00 2001 From: Vitaliy Lyudvichenko Date: Sun, 6 Aug 2017 23:26:23 +0300 Subject: [PATCH] Add SYSTEM KILL and SHUTDOWN implementations. [#CLICKHOUSE-2931] --- dbms/src/Core/ErrorCodes.cpp | 1 + .../Interpreters/InterpreterSystemQuery.cpp | 50 ++++++++++++++++++- .../src/Interpreters/InterpreterSystemQuery.h | 3 +- dbms/src/Parsers/ASTSystemQuery.cpp | 22 ++++++-- dbms/src/Parsers/ASTSystemQuery.h | 10 ++-- 5 files changed, 73 insertions(+), 13 deletions(-) diff --git a/dbms/src/Core/ErrorCodes.cpp b/dbms/src/Core/ErrorCodes.cpp index ceee11c9e2..8fbb195694 100644 --- a/dbms/src/Core/ErrorCodes.cpp +++ b/dbms/src/Core/ErrorCodes.cpp @@ -382,6 +382,7 @@ namespace ErrorCodes extern const int ILLEGAL_SYNTAX_FOR_DATA_TYPE = 377; extern const int DATA_TYPE_CANNOT_HAVE_ARGUMENTS = 378; extern const int UNKNOWN_STATUS_OF_DISTRIBUTED_DDL_TASK = 379; + extern const int CANNOT_KILL = 380; extern const int KEEPER_EXCEPTION = 999; extern const int POCO_EXCEPTION = 1000; diff --git a/dbms/src/Interpreters/InterpreterSystemQuery.cpp b/dbms/src/Interpreters/InterpreterSystemQuery.cpp index b454b5375e..e738f5978b 100644 --- a/dbms/src/Interpreters/InterpreterSystemQuery.cpp +++ b/dbms/src/Interpreters/InterpreterSystemQuery.cpp @@ -1,14 +1,62 @@ -#include "InterpreterSystemQuery.h" +#include +#include +#include +#include + namespace DB { + +namespace ErrorCodes +{ + extern const int BAD_ARGUMENTS; + extern const int CANNOT_KILL; +} + + InterpreterSystemQuery::InterpreterSystemQuery(const ASTPtr & query_ptr_, Context & context_) : query_ptr(query_ptr_), context(context_) {} + BlockIO InterpreterSystemQuery::execute() { + auto & query = typeid_cast(*query_ptr); + + using Type = ASTSystemQuery::Type; + + switch (query.type) + { + case Type::SHUTDOWN: + if (kill(0, SIGTERM)) + throw Exception("System call kill() failed", ErrorCodes::CANNOT_KILL); + break; + case Type::KILL: + if (kill(0, SIGKILL)) + throw Exception("System call kill() failed", ErrorCodes::CANNOT_KILL); + break; + case Type::DROP_DNS_CACHE: + break; + case Type::DROP_MARK_CACHE: + break; + case Type::DROP_UNCOMPRESSED_CACHE: + break; + case Type::STOP_LISTEN_QUERIES:break; + case Type::START_LISTEN_QUERIES:break; + case Type::RESTART_REPLICAS:break; + case Type::SYNC_REPLICA:break; + case Type::RELOAD_DICTIONARY:break; + case Type::RELOAD_DICTIONARIES:break; + case Type::STOP_MERGES:break; + case Type::START_MERGES:break; + case Type::STOP_REPLICATION_QUEUES:break; + case Type::START_REPLICATION_QUEUES:break; + default: + throw Exception("Unknown type of SYSTEM query", ErrorCodes::BAD_ARGUMENTS); + } + return BlockIO(); } + } \ No newline at end of file diff --git a/dbms/src/Interpreters/InterpreterSystemQuery.h b/dbms/src/Interpreters/InterpreterSystemQuery.h index f6010dafc5..9f797b9838 100644 --- a/dbms/src/Interpreters/InterpreterSystemQuery.h +++ b/dbms/src/Interpreters/InterpreterSystemQuery.h @@ -1,6 +1,7 @@ #pragma once #include + namespace DB { @@ -9,8 +10,6 @@ class IAST; using ASTPtr = std::shared_ptr; -/** Return list of currently executing queries. - */ class InterpreterSystemQuery : public IInterpreter { public: diff --git a/dbms/src/Parsers/ASTSystemQuery.cpp b/dbms/src/Parsers/ASTSystemQuery.cpp index 2eb45f5b5e..753b2c05a2 100644 --- a/dbms/src/Parsers/ASTSystemQuery.cpp +++ b/dbms/src/Parsers/ASTSystemQuery.cpp @@ -2,14 +2,15 @@ #include -namespace ErrorCodes +namespace DB { - extern const int BAD_TYPE_OF_FIELD; -} -namespace DB +namespace ErrorCodes { + extern const int BAD_TYPE_OF_FIELD; + extern const int NOT_IMPLEMENTED; +} const char * ASTSystemQuery::typeToString(Type type) @@ -52,4 +53,17 @@ const char * ASTSystemQuery::typeToString(Type type) } +void ASTSystemQuery::formatImpl(const IAST::FormatSettings & settings, IAST::FormatState & state, + IAST::FormatStateStacked frame) const +{ + settings.ostr << (settings.hilite ? hilite_keyword : "") << "SYSTEM " << (settings.hilite ? hilite_none : ""); + settings.ostr << typeToString(type); + + if (type == Type::RELOAD_DICTIONARY) + settings.ostr << " " << backQuoteIfNeed(target_dictionary); + else if (type == Type::SYNC_REPLICA) + throw Exception("SYNC_REPLICA isn't supported yet", ErrorCodes::NOT_IMPLEMENTED); +} + + } \ No newline at end of file diff --git a/dbms/src/Parsers/ASTSystemQuery.h b/dbms/src/Parsers/ASTSystemQuery.h index e4f08a4eb1..5573345ffa 100644 --- a/dbms/src/Parsers/ASTSystemQuery.h +++ b/dbms/src/Parsers/ASTSystemQuery.h @@ -36,12 +36,13 @@ public: Type type = Type::_UNKNOWN; String target_dictionary; - //String target_replica; + //String target_replica_database; + //String target_replica_table; ASTSystemQuery() = default; explicit ASTSystemQuery(const StringRange range) : IAST(range) {} - String getID() const override { return "SYSTEM"; }; + String getID() const override { return "SYSTEM query"; }; ASTPtr clone() const override { return std::make_shared(*this); } @@ -49,10 +50,7 @@ public: protected: - void formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const override - { - settings.ostr << (settings.hilite ? hilite_keyword : "") << "SYSTEM " << (settings.hilite ? hilite_none : ""); - } + void formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const override; }; -- GitLab