Repair subtree2 by PKartaviy · Pull Request #1 · ClickHouse/ClickHouse · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion contrib/libpoco/Util/include/Poco/Util/ServerApplication.h
18 changes: 4 additions & 14 deletions dbms/include/DB/Client/Connection.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,20 +129,10 @@ class Connection : private boost::noncopyable
void getServerVersion(String & name, UInt64 & version_major, UInt64 & version_minor, UInt64 & revision);

/// Для сообщений в логе и в эксепшенах.
const String & getDescription() const
{
return description;
}

const String & getHost() const
{
return host;
}

UInt16 getPort() const
{
return port;
}
const String & getDescription() const;
const String & getHost() const;
UInt16 getPort() const;
const String & getDefaultDatabase() const;

/// Если последний флаг true, то затем необходимо вызвать sendExternalTablesData
void sendQuery(const String & query, const String & query_id_ = "", UInt64 stage = QueryProcessingStage::Complete,
Expand Down
2 changes: 1 addition & 1 deletion dbms/include/DB/Common/Exception.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ void tryLogException(std::exception_ptr e, Poco::Logger * logger, const std::str
std::string getExceptionMessage(std::exception_ptr e, bool with_stacktrace);


void rethrowFirstException(Exceptions & exceptions);
void rethrowFirstException(const Exceptions & exceptions);

std::unique_ptr<Poco::Exception> convertCurrentException();

Expand Down
20 changes: 19 additions & 1 deletion dbms/src/Client/Connection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -142,12 +142,30 @@ void Connection::receiveHello()
}
}


void Connection::setDefaultDatabase(const String & database)
{
default_database = database;
}

const String & Connection::getDefaultDatabase() const
{
return default_database;
}

const String & Connection::getDescription() const
{
return description;
}

const String & Connection::getHost() const
{
return host;
}

UInt16 Connection::getPort() const
{
return port;
}

void Connection::getServerVersion(String & name, UInt64 & version_major, UInt64 & version_minor, UInt64 & revision)
{
Expand Down
2 changes: 1 addition & 1 deletion dbms/src/Common/Exception.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ std::unique_ptr<Poco::Exception> convertCurrentException()
}


void rethrowFirstException(Exceptions & exceptions)
void rethrowFirstException(const Exceptions & exceptions)
{
for (size_t i = 0, size = exceptions.size(); i < size; ++i)
if (exceptions[i])
Expand Down
1 change: 1 addition & 0 deletions libs/libcommon/src/create_revision.sh
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ else
# нужно для stash или неполноценной копии репозитория
revision="77777"
fi
revision=$(echo $revision | sed 's/\([0-9]*\)[^0-9]*/\1/')

echo "
#ifndef REVISION
Expand Down
17 changes: 15 additions & 2 deletions libs/libdaemon/include/daemon/BaseDaemon.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ namespace Poco { class TaskManager; }

class BaseDaemon : public Poco::Util::ServerApplication
{
friend class SignalListener;

public:
BaseDaemon();
~BaseDaemon();
Expand Down Expand Up @@ -132,6 +134,14 @@ class BaseDaemon : public Poco::Util::ServerApplication
/// Используется при exitOnTaskError()
void handleNotification(Poco::TaskFailedNotification *);

/// thread safe
virtual void handleSignal(int signal_id);

/// реализация обработки сигналов завершения через pipe не требует блокировки сигнала с помощью sigprocmask во всех потоках
void waitForTerminationRequest() override;
/// thread safe
virtual void onInterruptSignals(int signal_id);

std::unique_ptr<Poco::TaskManager> task_manager;

/// Создание и автоматическое удаление pid файла.
Expand All @@ -156,8 +166,7 @@ class BaseDaemon : public Poco::Util::ServerApplication

PID pid;

/// Получен ли сигнал на завершение? Этот флаг устанавливается в BaseDaemonApplication.
bool is_cancelled = false;
std::atomic_bool is_cancelled{false};

/// Флаг устанавливается по сообщению из Task (при аварийном завершении).
bool task_failed = false;
Expand All @@ -179,4 +188,8 @@ class BaseDaemon : public Poco::Util::ServerApplication
std::unique_ptr<GraphiteWriter> graphite_writer;

boost::optional<size_t> layer;

std::mutex signal_handler_mutex;
std::condition_variable signal_event;
size_t terminate_signals_counter = 0;
};
117 changes: 79 additions & 38 deletions libs/libdaemon/src/BaseDaemon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -131,20 +131,31 @@ static void call_default_signal_handler(int sig)
using ThreadNumber = decltype(Poco::ThreadNumber::get());
static const size_t buf_size = sizeof(int) + sizeof(siginfo_t) + sizeof(ucontext_t) + sizeof(ThreadNumber);

using signal_function = void(int, siginfo_t*, void*);

/** Обработчик сигналов HUP / USR1 */
static void close_logs_signal_handler(int sig, siginfo_t * info, void * context)
static void writeSignalIDtoSignalPipe(int sig)
{
char buf[buf_size];
DB::WriteBufferFromFileDescriptor out(signal_pipe.write_fd, buf_size, buf);
DB::writeBinary(sig, out);
out.next();
}

/** Обработчик сигналов HUP / USR1 */
static void closeLogsSignalHandler(int sig, siginfo_t * info, void * context)
{
writeSignalIDtoSignalPipe(sig);
}

static void terminateRequestedSignalHandler(int sig, siginfo_t * info, void * context)
{
writeSignalIDtoSignalPipe(sig);
}


/** Обработчик некоторых сигналов. Выводит информацию в лог (если получится).
*/
static void fault_signal_handler(int sig, siginfo_t * info, void * context)
static void faultSignalHandler(int sig, siginfo_t * info, void * context)
{
char buf[buf_size];
DB::WriteBufferFromFileDescriptor out(signal_pipe.write_fd, buf_size, buf);
Expand Down Expand Up @@ -174,7 +185,9 @@ static bool already_printed_stack_trace = false;
class SignalListener : public Poco::Runnable
{
public:
SignalListener() : log(&Logger::get("BaseDaemon"))
SignalListener(BaseDaemon & daemon_)
: log(&Logger::get("BaseDaemon"))
, daemon(daemon_)
{
}

Expand Down Expand Up @@ -204,6 +217,12 @@ class SignalListener : public Poco::Runnable

onTerminate(message, thread_num);
}
else if (sig == SIGINT ||
sig == SIGQUIT ||
sig == SIGTERM)
{
daemon.handleSignal(sig);
}
else
{
siginfo_t info;
Expand All @@ -221,8 +240,9 @@ class SignalListener : public Poco::Runnable

private:
Logger * log;
BaseDaemon & daemon;


private:
void onTerminate(const std::string & message, ThreadNumber thread_num) const
{
LOG_ERROR(log, "(from thread " << thread_num << ") " << message);
Expand Down Expand Up @@ -739,42 +759,31 @@ void BaseDaemon::initialize(Application& self)
std::set_terminate(terminate_handler);

/// Ставим обработчики сигналов
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sa.sa_sigaction = fault_signal_handler;
sa.sa_flags = SA_SIGINFO;

{
int signals[] = {SIGABRT, SIGSEGV, SIGILL, SIGBUS, SIGSYS, SIGFPE, SIGPIPE, 0};

if (sigemptyset(&sa.sa_mask))
throw Poco::Exception("Cannot set signal handler.");

for (size_t i = 0; signals[i]; ++i)
if (sigaddset(&sa.sa_mask, signals[i]))
throw Poco::Exception("Cannot set signal handler.");

for (size_t i = 0; signals[i]; ++i)
if (sigaction(signals[i], &sa, 0))
throw Poco::Exception("Cannot set signal handler.");
}

sa.sa_sigaction = close_logs_signal_handler;
auto add_signal_handler =
[](const std::vector<int> & signals, signal_function handler)
{
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sa.sa_sigaction = handler;
sa.sa_flags = SA_SIGINFO;

{
int signals[] = {SIGHUP, SIGUSR1, 0};
{
if (sigemptyset(&sa.sa_mask))
throw Poco::Exception("Cannot set signal handler.");

if (sigemptyset(&sa.sa_mask))
throw Poco::Exception("Cannot set signal handler.");
for (auto signal : signals)
if (sigaddset(&sa.sa_mask, signal))
throw Poco::Exception("Cannot set signal handler.");

for (size_t i = 0; signals[i]; ++i)
if (sigaddset(&sa.sa_mask, signals[i]))
throw Poco::Exception("Cannot set signal handler.");
for (auto signal : signals)
if (sigaction(signal, &sa, 0))
throw Poco::Exception("Cannot set signal handler.");
}
};

for (size_t i = 0; signals[i]; ++i)
if (sigaction(signals[i], &sa, 0))
throw Poco::Exception("Cannot set signal handler.");
}
add_signal_handler({SIGABRT, SIGSEGV, SIGILL, SIGBUS, SIGSYS, SIGFPE, SIGPIPE}, faultSignalHandler);
add_signal_handler({SIGHUP, SIGUSR1}, closeLogsSignalHandler);
add_signal_handler({SIGINT, SIGQUIT, SIGTERM}, terminateRequestedSignalHandler);

/// Ставим ErrorHandler для потоков
static KillingErrorHandler killing_error_handler;
Expand All @@ -783,7 +792,7 @@ void BaseDaemon::initialize(Application& self)
/// Выведем ревизию демона
logRevision();

signal_listener.reset(new SignalListener);
signal_listener.reset(new SignalListener(*this));
signal_listener_thread.start(*signal_listener);

graphite_writer.reset(new GraphiteWriter("graphite"));
Expand Down Expand Up @@ -890,3 +899,35 @@ void BaseDaemon::PID::clear()
file.clear();
}
}

void BaseDaemon::handleSignal(int signal_id)
{
if (signal_id == SIGINT ||
signal_id == SIGQUIT ||
signal_id == SIGTERM)
{
std::unique_lock<std::mutex> lock(signal_handler_mutex);
{
++terminate_signals_counter;
signal_event.notify_all();
}

onInterruptSignals(signal_id);
}
else
throw DB::Exception(std::string("Unsupported signal: ") + strsignal(signal_id));
}

void BaseDaemon::onInterruptSignals(int signal_id)
{
is_cancelled = true;
LOG_INFO(&logger(), "Received termination signal(" << strsignal(signal_id) << ")");

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нет пробела.
Отображается так:

Received termination signal(Interrupt)

}


void BaseDaemon::waitForTerminationRequest()
{
std::unique_lock<std::mutex> lock(signal_handler_mutex);
signal_event.wait(lock, [this](){ return terminate_signals_counter > 0; });
}

2 changes: 1 addition & 1 deletion libs/libzkutil/CMakeLists.txt
Loading