mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-10 09:32:06 +00:00
Added creation of database directories at startup [#METR-2944].
This commit is contained in:
parent
422dd9e6ef
commit
4bd127a883
@ -63,7 +63,7 @@ namespace ErrorCodes
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Отвечает "Ok.\n". Используется для проверки живости.
|
/// Response with "Ok.\n". Used for availability checks.
|
||||||
class PingRequestHandler : public Poco::Net::HTTPRequestHandler
|
class PingRequestHandler : public Poco::Net::HTTPRequestHandler
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -82,7 +82,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/// Отвечает 404 с подробным объяснением.
|
/// Response with 404 and verbose description.
|
||||||
class NotFoundHandler : public Poco::Net::HTTPRequestHandler
|
class NotFoundHandler : public Poco::Net::HTTPRequestHandler
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -187,9 +187,23 @@ int Server::main(const std::vector<std::string> & args)
|
|||||||
if (path.back() != '/')
|
if (path.back() != '/')
|
||||||
path += '/';
|
path += '/';
|
||||||
|
|
||||||
|
/** Context contains all that query execution is dependent:
|
||||||
|
* settings, available functions, data types, aggregate functions, databases...
|
||||||
|
*/
|
||||||
|
global_context = std::make_unique<Context>();
|
||||||
|
|
||||||
|
global_context->setGlobalContext(*global_context);
|
||||||
|
global_context->setPath(path);
|
||||||
|
|
||||||
|
std::string default_database = config().getString("default_database", "default");
|
||||||
|
|
||||||
|
/// Create directories for 'path' and for default database, if not exist.
|
||||||
|
Poco::File(path + "data/" + default_database).createDirectories();
|
||||||
|
Poco::File(path + "metadata/" + default_database).createDirectories();
|
||||||
|
|
||||||
StatusFile status{path + "status"};
|
StatusFile status{path + "status"};
|
||||||
|
|
||||||
/// Попробуем повысить ограничение на число открытых файлов.
|
/// Try to increase limit on number of opened files.
|
||||||
{
|
{
|
||||||
rlimit rlim;
|
rlimit rlim;
|
||||||
if (getrlimit(RLIMIT_NOFILE, &rlim))
|
if (getrlimit(RLIMIT_NOFILE, &rlim))
|
||||||
@ -213,19 +227,11 @@ int Server::main(const std::vector<std::string> & args)
|
|||||||
static ServerErrorHandler error_handler;
|
static ServerErrorHandler error_handler;
|
||||||
Poco::ErrorHandler::set(&error_handler);
|
Poco::ErrorHandler::set(&error_handler);
|
||||||
|
|
||||||
/// Заранее инициализируем DateLUT, чтобы первая инициализация потом не влияла на измеряемую скорость выполнения.
|
/// Initialize DateLUT early, to not interfere with running time of first query.
|
||||||
LOG_DEBUG(log, "Initializing DateLUT.");
|
LOG_DEBUG(log, "Initializing DateLUT.");
|
||||||
DateLUT::instance();
|
DateLUT::instance();
|
||||||
LOG_TRACE(log, "Initialized DateLUT.");
|
LOG_TRACE(log, "Initialized DateLUT.");
|
||||||
|
|
||||||
global_context = std::make_unique<Context>();
|
|
||||||
|
|
||||||
/** Контекст содержит всё, что влияет на обработку запроса:
|
|
||||||
* настройки, набор функций, типов данных, агрегатных функций, баз данных...
|
|
||||||
*/
|
|
||||||
global_context->setGlobalContext(*global_context);
|
|
||||||
global_context->setPath(path);
|
|
||||||
|
|
||||||
/// Directory with temporary data for processing of hard queries.
|
/// Directory with temporary data for processing of hard queries.
|
||||||
{
|
{
|
||||||
std::string tmp_path = config().getString("tmp_path", path + "tmp/");
|
std::string tmp_path = config().getString("tmp_path", path + "tmp/");
|
||||||
@ -282,20 +288,20 @@ int Server::main(const std::vector<std::string> & args)
|
|||||||
std::string users_config_path = config().getString("users_config", config().getString("config-file", "config.xml"));
|
std::string users_config_path = config().getString("users_config", config().getString("config-file", "config.xml"));
|
||||||
auto users_config_reloader = std::make_unique<UsersConfigReloader>(users_config_path, global_context.get());
|
auto users_config_reloader = std::make_unique<UsersConfigReloader>(users_config_path, global_context.get());
|
||||||
|
|
||||||
/// Максимальное количество одновременно выполняющихся запросов.
|
/// Limit on total number of coucurrently executed queries.
|
||||||
global_context->getProcessList().setMaxSize(config().getInt("max_concurrent_queries", 0));
|
global_context->getProcessList().setMaxSize(config().getInt("max_concurrent_queries", 0));
|
||||||
|
|
||||||
/// Размер кэша разжатых блоков. Если нулевой - кэш отключён.
|
/// Size of cache for uncompressed blocks. Zero means disabled.
|
||||||
size_t uncompressed_cache_size = parse<size_t>(config().getString("uncompressed_cache_size", "0"));
|
size_t uncompressed_cache_size = parse<size_t>(config().getString("uncompressed_cache_size", "0"));
|
||||||
if (uncompressed_cache_size)
|
if (uncompressed_cache_size)
|
||||||
global_context->setUncompressedCache(uncompressed_cache_size);
|
global_context->setUncompressedCache(uncompressed_cache_size);
|
||||||
|
|
||||||
/// Размер кэша засечек. Обязательный параметр.
|
/// Size of cache for marks (index of MergeTree family of tables). It is necessary.
|
||||||
size_t mark_cache_size = parse<size_t>(config().getString("mark_cache_size"));
|
size_t mark_cache_size = parse<size_t>(config().getString("mark_cache_size"));
|
||||||
if (mark_cache_size)
|
if (mark_cache_size)
|
||||||
global_context->setMarkCache(mark_cache_size);
|
global_context->setMarkCache(mark_cache_size);
|
||||||
|
|
||||||
/// Загружаем настройки.
|
/// Load global settings from default profile.
|
||||||
Settings & settings = global_context->getSettingsRef();
|
Settings & settings = global_context->getSettingsRef();
|
||||||
global_context->setSetting("profile", config().getString("default_profile", "default"));
|
global_context->setSetting("profile", config().getString("default_profile", "default"));
|
||||||
|
|
||||||
@ -303,6 +309,8 @@ int Server::main(const std::vector<std::string> & args)
|
|||||||
loadMetadata(*global_context);
|
loadMetadata(*global_context);
|
||||||
LOG_DEBUG(log, "Loaded metadata.");
|
LOG_DEBUG(log, "Loaded metadata.");
|
||||||
|
|
||||||
|
global_context->setCurrentDatabase(default_database);
|
||||||
|
|
||||||
/// Create system tables.
|
/// Create system tables.
|
||||||
if (!global_context->isDatabaseExist("system"))
|
if (!global_context->isDatabaseExist("system"))
|
||||||
{
|
{
|
||||||
@ -339,8 +347,6 @@ int Server::main(const std::vector<std::string> & args)
|
|||||||
if (has_zookeeper)
|
if (has_zookeeper)
|
||||||
system_database->attachTable("zookeeper", StorageSystemZooKeeper::create("zookeeper"));
|
system_database->attachTable("zookeeper", StorageSystemZooKeeper::create("zookeeper"));
|
||||||
|
|
||||||
global_context->setCurrentDatabase(config().getString("default_database", "default"));
|
|
||||||
|
|
||||||
bool has_resharding_worker = false;
|
bool has_resharding_worker = false;
|
||||||
if (has_zookeeper && config().has("resharding"))
|
if (has_zookeeper && config().has("resharding"))
|
||||||
{
|
{
|
||||||
@ -353,17 +359,17 @@ int Server::main(const std::vector<std::string> & args)
|
|||||||
SCOPE_EXIT(
|
SCOPE_EXIT(
|
||||||
LOG_DEBUG(log, "Closed all connections.");
|
LOG_DEBUG(log, "Closed all connections.");
|
||||||
|
|
||||||
/** Попросим завершить фоновую работу у всех движков таблиц,
|
/** Ask to cancel background jobs all table engines,
|
||||||
* а также у query_log-а.
|
* and also query_log.
|
||||||
* Это важно делать заранее, не в деструкторе Context-а, так как
|
* It is important to do early, not in destructor of Context, because
|
||||||
* движки таблиц могут при уничтожении всё ещё пользоваться Context-ом.
|
* table engines could use Context on destroy.
|
||||||
*/
|
*/
|
||||||
LOG_INFO(log, "Shutting down storages.");
|
LOG_INFO(log, "Shutting down storages.");
|
||||||
global_context->shutdown();
|
global_context->shutdown();
|
||||||
LOG_DEBUG(log, "Shutted down storages.");
|
LOG_DEBUG(log, "Shutted down storages.");
|
||||||
|
|
||||||
/** Явно уничтожаем контекст - это удобнее, чем в деструкторе Server-а, так как ещё доступен логгер.
|
/** Explicitly destroy Context. It is more convenient than in destructor of Server, becuase logger is still available.
|
||||||
* В этот момент никто больше не должен владеть shared-частью контекста.
|
* At this moment, no one could own shared part of Context.
|
||||||
*/
|
*/
|
||||||
global_context.reset();
|
global_context.reset();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user