mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-25 09:02:00 +00:00
Translated comments [#CLICKHOUSE-2]
This commit is contained in:
parent
9ad18c5019
commit
0101cd24d6
@ -76,10 +76,11 @@ using Poco::Util::AbstractConfiguration;
|
||||
|
||||
constexpr char BaseDaemon::DEFAULT_GRAPHITE_CONFIG_NAME[];
|
||||
|
||||
/** Для передачи информации из обработчика сигнала для обработки в другом потоке.
|
||||
* Если при получении сигнала надо делать что-нибудь серьёзное (например, вывести сообщение в лог),
|
||||
* то передать нужную информацию через pipe в другой поток и сделать там всю работу
|
||||
* - один из немногих безопасных способов сделать это.
|
||||
/** For transferring information from signal handler to a separate thread.
|
||||
* If you need to do something serious in case of a signal (example: write a message to the log),
|
||||
* then sending information to a separate thread through pipe and doing all the stuff asynchronously
|
||||
* - is probably the only safe method for doing it.
|
||||
* (Because it's only safe to use reentrant functions in signal handlers.)
|
||||
*/
|
||||
struct Pipe
|
||||
{
|
||||
@ -127,8 +128,8 @@ struct Pipe
|
||||
Pipe signal_pipe;
|
||||
|
||||
|
||||
/** Устанавливает обработчик сигнала по умолчанию, и отправляет себе сигнал sig.
|
||||
* Вызывается изнутри пользовательского обработчика сигнала, чтобы записать core dump.
|
||||
/** Reset signal handler to the default and send signal to itself.
|
||||
* It's called from user signal handler to write core dump.
|
||||
*/
|
||||
static void call_default_signal_handler(int sig)
|
||||
{
|
||||
@ -150,7 +151,7 @@ static void writeSignalIDtoSignalPipe(int sig)
|
||||
out.next();
|
||||
}
|
||||
|
||||
/** Обработчик сигналов HUP / USR1 */
|
||||
/** Signal handler for HUP / USR1 */
|
||||
static void closeLogsSignalHandler(int sig, siginfo_t * info, void * context)
|
||||
{
|
||||
writeSignalIDtoSignalPipe(sig);
|
||||
@ -164,7 +165,7 @@ static void terminateRequestedSignalHandler(int sig, siginfo_t * info, void * co
|
||||
|
||||
thread_local bool already_signal_handled = false;
|
||||
|
||||
/** Обработчик некоторых сигналов. Выводит информацию в лог (если получится).
|
||||
/** Handler for "fault" signals. Send data about fault to separate thread to write into log.
|
||||
*/
|
||||
static void faultSignalHandler(int sig, siginfo_t * info, void * context)
|
||||
{
|
||||
@ -182,7 +183,7 @@ static void faultSignalHandler(int sig, siginfo_t * info, void * context)
|
||||
|
||||
out.next();
|
||||
|
||||
/// Время, за которое читающий из pipe поток должен попытаться успеть вывести в лог stack trace.
|
||||
/// The time that is usually enough for separate thread to print info into log.
|
||||
::sleep(10);
|
||||
|
||||
call_default_signal_handler(sig);
|
||||
@ -219,10 +220,11 @@ size_t backtraceLibUnwind(void ** out_frames, size_t max_frames, ucontext_t & co
|
||||
}
|
||||
#endif
|
||||
|
||||
/** Получает информацию через pipe.
|
||||
* При получении сигнала HUP / USR1 закрывает лог-файлы.
|
||||
* При получении информации из std::terminate, выводит её в лог.
|
||||
* При получении других сигналов, выводит информацию в лог.
|
||||
|
||||
/** The thread that read info about signal or std::terminate from pipe.
|
||||
* On HUP / USR1, close log files (for new files to be opened later).
|
||||
* On information about std::terminate, write it to log.
|
||||
* On other signals, write info to log.
|
||||
*/
|
||||
class SignalListener : public Poco::Runnable
|
||||
{
|
||||
@ -309,7 +311,7 @@ private:
|
||||
|
||||
if (sig == SIGSEGV)
|
||||
{
|
||||
/// Выводим информацию об адресе и о причине.
|
||||
/// Print info about address and reason.
|
||||
if (nullptr == info.si_addr)
|
||||
LOG_ERROR(log, "Address: NULL pointer.");
|
||||
else
|
||||
@ -363,7 +365,7 @@ private:
|
||||
{
|
||||
for (int i = 0; i < frames_size; ++i)
|
||||
{
|
||||
/// Делаем demangling имён. Имя находится в скобках, до символа '+'.
|
||||
/// Perform demangling of names. Name is in parentheses, before '+' character.
|
||||
|
||||
char * name_start = nullptr;
|
||||
char * name_end = nullptr;
|
||||
@ -399,10 +401,10 @@ private:
|
||||
};
|
||||
|
||||
|
||||
/** Для использования с помощью std::set_terminate.
|
||||
* Собирает чуть больше информации, чем __gnu_cxx::__verbose_terminate_handler,
|
||||
* и отправляет её в pipe. Другой поток читает из pipe и выводит её в лог.
|
||||
* См. исходники в libstdc++-v3/libsupc++/vterminate.cc
|
||||
/** To use with std::set_terminate.
|
||||
* Collects slightly more info than __gnu_cxx::__verbose_terminate_handler,
|
||||
* and send it to pipe. Other thread will read this info from pipe and asynchronously write it to log.
|
||||
* Look at libstdc++-v3/libsupc++/vterminate.cc for example.
|
||||
*/
|
||||
static void terminate_handler()
|
||||
{
|
||||
@ -415,7 +417,6 @@ static void terminate_handler()
|
||||
|
||||
terminating = true;
|
||||
|
||||
/// Сюда записываем информацию для логгирования.
|
||||
std::stringstream log;
|
||||
|
||||
std::type_info * t = abi::__cxa_current_exception_type();
|
||||
@ -519,11 +520,11 @@ static bool tryCreateDirectories(Poco::Logger * logger, const std::string & path
|
||||
|
||||
void BaseDaemon::reloadConfiguration()
|
||||
{
|
||||
/** Если программа запущена не в режиме демона, и не указан параметр config-file,
|
||||
* то будем использовать параметры из файла config.xml в текущей директории,
|
||||
* но игнорировать заданные в нём параметры логгирования.
|
||||
* (Чтобы при запуске с минимумом параметров, лог выводился в консоль.)
|
||||
* При этом, параметры логгирования, заданные в командной строке, не игнорируются.
|
||||
/** If the program is not run in daemon mode and 'config-file' is not specified,
|
||||
* then we use config from 'config.xml' file in current directory,
|
||||
* but will log to console (or use parameters --log-file, --errorlog-file from command line)
|
||||
* instead of using files specified in config.xml.
|
||||
* (It's convenient to log in console when you start server without any command line parameters.)
|
||||
*/
|
||||
std::string log_command_line_option = config().getString("logger.log", "");
|
||||
config_path = config().getString("config-file", "config.xml");
|
||||
@ -536,7 +537,7 @@ void BaseDaemon::reloadConfiguration()
|
||||
}
|
||||
|
||||
|
||||
/// Для создания и уничтожения unique_ptr, который в заголовочном файле объявлен от incomplete type.
|
||||
/// For creating and destroying unique_ptr of incomplete type.
|
||||
BaseDaemon::BaseDaemon() = default;
|
||||
|
||||
|
||||
@ -575,10 +576,9 @@ void BaseDaemon::wakeup()
|
||||
}
|
||||
|
||||
|
||||
/// Строит необходимые логгеры
|
||||
void BaseDaemon::buildLoggers()
|
||||
{
|
||||
/// Сменим директорию для лога
|
||||
/// Change path for logging.
|
||||
if (config().hasProperty("logger.log") && !log_to_console)
|
||||
{
|
||||
std::string path = createDirectory(config().getString("logger.log"));
|
||||
@ -600,10 +600,10 @@ void BaseDaemon::buildLoggers()
|
||||
{
|
||||
std::cerr << "Should logs to " << config().getString("logger.log") << std::endl;
|
||||
|
||||
// splitter
|
||||
// Split log and error log.
|
||||
Poco::AutoPtr<SplitterChannel> split = new SplitterChannel;
|
||||
|
||||
// set up two channel chains
|
||||
// Set up two channel chains.
|
||||
Poco::AutoPtr<OwnPatternFormatter> pf = new OwnPatternFormatter(this);
|
||||
pf->setProperty("times", "local");
|
||||
Poco::AutoPtr<FormattingChannel> log = new FormattingChannel(pf);
|
||||
@ -658,7 +658,7 @@ void BaseDaemon::buildLoggers()
|
||||
}
|
||||
else
|
||||
{
|
||||
// Выводим на консоль
|
||||
// Print to the terminal.
|
||||
Poco::AutoPtr<ConsoleChannel> file = new ConsoleChannel;
|
||||
Poco::AutoPtr<OwnPatternFormatter> pf = new OwnPatternFormatter(this);
|
||||
pf->setProperty("times", "local");
|
||||
@ -670,14 +670,14 @@ void BaseDaemon::buildLoggers()
|
||||
logger().warning("Logging to console");
|
||||
}
|
||||
|
||||
// Уровни для всех
|
||||
// Global logging level (it can be overridden for specific loggers).
|
||||
logger().setLevel(config().getString("logger.level", "trace"));
|
||||
|
||||
// Прикрутим к корневому логгеру
|
||||
// Attach to the root logger.
|
||||
Logger::root().setLevel(logger().getLevel());
|
||||
Logger::root().setChannel(logger().getChannel());
|
||||
|
||||
// Уровни для явно указанных логгеров
|
||||
// Explicitly specified log levels for specific loggers.
|
||||
AbstractConfiguration::Keys levels;
|
||||
config().keys("logger.levels", levels);
|
||||
|
||||
@ -712,15 +712,13 @@ void BaseDaemon::initialize(Application & self)
|
||||
|
||||
if (is_daemon)
|
||||
{
|
||||
/** При создании pid файла и поиске конфигурации, будем интерпретировать относительные пути
|
||||
* от директории запуска программы.
|
||||
/** When creating pid file and looking for config, will search for paths relative to the working path of the program when started.
|
||||
*/
|
||||
std::string path = Poco::Path(config().getString("application.path")).setFileName("").toString();
|
||||
if (0 != chdir(path.c_str()))
|
||||
throw Poco::Exception("Cannot change directory to " + path);
|
||||
}
|
||||
|
||||
/// Считаем конфигурацию
|
||||
reloadConfiguration();
|
||||
|
||||
/// This must be done before creation of any files (including logs).
|
||||
@ -737,12 +735,12 @@ void BaseDaemon::initialize(Application & self)
|
||||
|
||||
ConfigProcessor(config_path).savePreprocessedConfig(loaded_config);
|
||||
|
||||
/// В случае падения - сохраняем коры
|
||||
/// Write core dump on crash.
|
||||
{
|
||||
struct rlimit rlim;
|
||||
if (getrlimit(RLIMIT_CORE, &rlim))
|
||||
throw Poco::Exception("Cannot getrlimit");
|
||||
/// 1 GiB. Если больше - они слишком долго пишутся на диск.
|
||||
/// 1 GiB by default. If more - it writes to disk too long.
|
||||
rlim.rlim_cur = config().getUInt64("core_dump.size_limit", 1024 * 1024 * 1024);
|
||||
|
||||
if (setrlimit(RLIMIT_CORE, &rlim))
|
||||
@ -751,7 +749,7 @@ void BaseDaemon::initialize(Application & self)
|
||||
#if !defined(ADDRESS_SANITIZER) && !defined(THREAD_SANITIZER)
|
||||
throw Poco::Exception(message);
|
||||
#else
|
||||
/// Не работает под address/thread sanitizer. http://lists.llvm.org/pipermail/llvm-bugs/2013-April/027880.html
|
||||
/// It doesn't work under address/thread sanitizer. http://lists.llvm.org/pipermail/llvm-bugs/2013-April/027880.html
|
||||
std::cerr << message << std::endl;
|
||||
#endif
|
||||
}
|
||||
@ -772,10 +770,10 @@ void BaseDaemon::initialize(Application & self)
|
||||
|
||||
if (is_daemon)
|
||||
{
|
||||
/** Переназначим stdout, stderr в отдельные файлы в директориях с логами.
|
||||
* Некоторые библиотеки пишут в stderr в случае ошибок или в отладочном режиме,
|
||||
* и этот вывод иногда имеет смысл смотреть даже когда программа запущена в режиме демона.
|
||||
* Делаем это до buildLoggers, чтобы ошибки во время инициализации логгера, попали в эти файлы.
|
||||
/** Redirect stdout, stderr to separate files in the log directory.
|
||||
* Some libraries write to stderr in case of errors in debug mode,
|
||||
* and this output makes sense even if the program is run in daemon mode.
|
||||
* We have to do it before buildLoggers, for errors on logger initialization will be written to these files.
|
||||
*/
|
||||
if (!log_path.empty())
|
||||
{
|
||||
@ -788,7 +786,7 @@ void BaseDaemon::initialize(Application & self)
|
||||
throw Poco::OpenFileException("Cannot attach stderr to " + stderr_path);
|
||||
}
|
||||
|
||||
/// Создадим pid-file.
|
||||
/// Create pid file.
|
||||
if (is_daemon && config().has("pid"))
|
||||
pid.seed(config().getString("pid"));
|
||||
}
|
||||
@ -797,9 +795,8 @@ void BaseDaemon::initialize(Application & self)
|
||||
|
||||
if (is_daemon)
|
||||
{
|
||||
/** Сменим директорию на ту, куда надо писать core файлы.
|
||||
* Делаем это после buildLoggers, чтобы не менять текущую директорию раньше.
|
||||
* Это важно, если конфиги расположены в текущей директории.
|
||||
/** Change working directory to the directory to write core dumps.
|
||||
* We have to do it after buildLoggers, because there is the case when config files was in current directory.
|
||||
*/
|
||||
|
||||
std::string core_path = config().getString("core_path", "");
|
||||
@ -819,7 +816,6 @@ void BaseDaemon::initialize(Application & self)
|
||||
throw Poco::Exception("Cannot change directory to " + core_path);
|
||||
}
|
||||
|
||||
/// Ставим terminate_handler
|
||||
std::set_terminate(terminate_handler);
|
||||
|
||||
/// We want to avoid SIGPIPE when working with sockets and pipes, and just handle return value/errno instead.
|
||||
@ -829,7 +825,7 @@ void BaseDaemon::initialize(Application & self)
|
||||
throw Poco::Exception("Cannot block signal.");
|
||||
}
|
||||
|
||||
/// Ставим обработчики сигналов
|
||||
/// Setup signal handlers.
|
||||
auto add_signal_handler =
|
||||
[](const std::vector<int> & signals, signal_function handler)
|
||||
{
|
||||
@ -856,11 +852,10 @@ void BaseDaemon::initialize(Application & self)
|
||||
add_signal_handler({SIGHUP, SIGUSR1}, closeLogsSignalHandler);
|
||||
add_signal_handler({SIGINT, SIGQUIT, SIGTERM}, terminateRequestedSignalHandler);
|
||||
|
||||
/// Ставим ErrorHandler для потоков
|
||||
/// Set up Poco ErrorHandler for Poco Threads.
|
||||
static KillingErrorHandler killing_error_handler;
|
||||
Poco::ErrorHandler::set(&killing_error_handler);
|
||||
|
||||
/// Выведем ревизию демона
|
||||
logRevision();
|
||||
|
||||
signal_listener.reset(new SignalListener(*this));
|
||||
@ -877,14 +872,14 @@ void BaseDaemon::logRevision() const
|
||||
Logger::root().information("Starting daemon with revision " + Poco::NumberFormatter::format(ClickHouseRevision::get()));
|
||||
}
|
||||
|
||||
/// Заставляет демон завершаться, если хотя бы одна задача завершилась неудачно
|
||||
/// Makes server shutdown if at least one Poco::Task have failed.
|
||||
void BaseDaemon::exitOnTaskError()
|
||||
{
|
||||
Observer<BaseDaemon, Poco::TaskFailedNotification> obs(*this, &BaseDaemon::handleNotification);
|
||||
getTaskManager().addObserver(obs);
|
||||
}
|
||||
|
||||
/// Используется при exitOnTaskError()
|
||||
/// Used for exitOnTaskError()
|
||||
void BaseDaemon::handleNotification(Poco::TaskFailedNotification *_tfn)
|
||||
{
|
||||
task_failed = true;
|
||||
@ -936,9 +931,7 @@ bool isPidRunning(pid_t pid)
|
||||
|
||||
void BaseDaemon::PID::seed(const std::string & file_)
|
||||
{
|
||||
/// переведём путь в абсолютный
|
||||
auto file_path = Poco::Path(file_).absolute();
|
||||
file = file_path.toString();
|
||||
file = Poco::Path(file_).absolute().toString();
|
||||
Poco::File poco_file(file);
|
||||
|
||||
if (poco_file.exists())
|
||||
|
Loading…
Reference in New Issue
Block a user