Merge pull request #57133 from vitlibar/change-default-for-wait_dictionaries_load_at_startup

Change the default for wait_dictionaries_load_at_startup to true
This commit is contained in:
Vitaly Baranov 2023-11-24 17:09:05 +01:00 committed by GitHub
commit 5769a88b92
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 48 additions and 37 deletions

View File

@ -963,11 +963,9 @@ Lazy loading of dictionaries.
If `true`, then each dictionary is loaded on the first use. If the loading is failed, the function that was using the dictionary throws an exception.
If `false`, then the server starts loading all dictionaries at startup.
Dictionaries are loaded in background.
The server doesn't wait at startup until all the dictionaries finish their loading
(exception: if `wait_dictionaries_load_at_startup` is set to `true` - see below).
When a dictionary is used in a query for the first time then the query waits until the dictionary is loaded if it's not loaded yet.
If `false`, then the server loads all dictionaries at startup.
The server will wait at startup until all the dictionaries finish their loading before receiving any connections
(exception: if `wait_dictionaries_load_at_startup` is set to `false` - see below).
The default is `true`.
@ -2397,20 +2395,24 @@ Path to the file that contains:
## wait_dictionaries_load_at_startup {#wait_dictionaries_load_at_startup}
If `false`, then the server will not wait at startup until all the dictionaries finish their loading.
This allows to start ClickHouse faster.
This setting allows to specify behavior if `dictionaries_lazy_load` is `false`.
(If `dictionaries_lazy_load` is `true` this setting doesn't affect anything.)
If `true`, then the server will wait at startup until all the dictionaries finish their loading (successfully or not)
before listening to any connections.
This can make ClickHouse start slowly, however after that some queries can be executed faster
(because they won't have to wait for the used dictionaries to be load).
If `wait_dictionaries_load_at_startup` is `false`, then the server
will start loading all the dictionaries at startup and it will receive connections in parallel with that loading.
When a dictionary is used in a query for the first time then the query will wait until the dictionary is loaded if it's not loaded yet.
Setting `wait_dictionaries_load_at_startup` to `false` can make ClickHouse start faster, however some queries can be executed slower
(because they will have to wait for some dictionaries to be loaded).
The default is `false`.
If `wait_dictionaries_load_at_startup` is `true`, then the server will wait at startup
until all the dictionaries finish their loading (successfully or not) before receiving any connections.
The default is `true`.
**Example**
``` xml
<wait_dictionaries_load_at_startup>false</wait_dictionaries_load_at_startup>
<wait_dictionaries_load_at_startup>true</wait_dictionaries_load_at_startup>
```
## zookeeper {#server-settings_zookeeper}

View File

@ -275,12 +275,11 @@ ClickHouse проверяет условия для `min_part_size` и `min_part
Отложенная загрузка словарей.
Если `true`, то каждый словарь создаётся при первом использовании. Если словарь не удалось создать, то вызов функции, использующей словарь, сгенерирует исключение.
Если `true`, то каждый словарь загружается при первом использовании. Если словарь не удалось загрузить, то вызов функции, использующей словарь, сгенерирует исключение.
Если `false`, сервер начнет загрузку всех словарей на старте сервера.
Словари загружаются в фоне. Сервер не ждет на старте, пока словари закончат загружаться
(исключение: если `wait_dictionaries_load_at_startup` установлена в `true` - см. ниже).
Когда словарь используется в запросе первый раз, этот запрос будет ждать окончания загрузки словаря, если он еще не загрузился.
Если `false`, все словари будут загружаться на старте сервера.
Сервер будет ждать на старте окончания загрузки всех словарей перед началом обработки соединений
(исключение: если `wait_dictionaries_load_at_startup` установлена в `false` - см. ниже).
По умолчанию - `true`.
@ -1722,20 +1721,23 @@ TCP порт для защищённого обмена данными с кли
## wait_dictionaries_load_at_startup {#wait_dictionaries_load_at_startup}
Если `false`, то сервер не будет ждать на старте, пока словари закончат загружаться.
Это позволяет ClickHouse стартовать быстрее.
Эта настройка позволяет указать поведение если `dictionaries_lazy_load` установлено в `false`.
(Если `dictionaries_lazy_load` установлено в `true`, то эта настройка ни на что не влияет.)
Если `true`, то ClickHouse будет ждать на старте до окончания загрузки всех словарей (успешно или нет)
перед тем, как начать принимать соединения.
Это может привести к медленному старту ClickHouse, однако после этого некоторые запросы могут выполняться быстрее
(потому что им не придется ждать окончания загрузки используемых словарей).
Если `wait_dictionaries_load_at_startup` установлено в `false`, то сервер начнет загрузку всех словарей на старте
и будет обрабатывать соединения, не дожидаясь окончания загрузки словарей.
Когда словарь первый раз используется в запросе, запрос будет ждать окончания загрузки этого словаря, если он еще не загрузился.
Установка `wait_dictionaries_load_at_startup` в `false` может помочь ClickHouse стартовать быстрее, однако некоторые запросы могут выполняться медленее (потому что они будут ждать окончания загрузки используемых в них словарей).
По умолчанию - `false`.
Если `wait_dictionaries_load_at_startup` установлено в `true`, то сервер будет ждать окончания загрузки всех словарей на старте
до начала обработки соединений.
По умолчанию - `true`.
**Пример**
``` xml
<wait_dictionaries_load_at_startup>false</wait_dictionaries_load_at_startup>
<wait_dictionaries_load_at_startup>true</wait_dictionaries_load_at_startup>
```
## zookeeper {#server-settings_zookeeper}

View File

@ -1825,7 +1825,7 @@ try
{
global_context->loadOrReloadDictionaries(config());
if (config().getBool("wait_dictionaries_load_at_startup", false))
if (!config().getBool("dictionaries_lazy_load", true) && config().getBool("wait_dictionaries_load_at_startup", true))
global_context->waitForDictionariesLoad();
}
catch (...)

View File

@ -1291,10 +1291,10 @@
<dictionaries_lazy_load>true</dictionaries_lazy_load>
<!-- Wait at startup until all the dictionaries finish their loading (successfully or not)
before listening to connections. Setting this to 1 can make ClickHouse start slowly,
however some queries can be executed faster (because it won't have to wait for the used dictionaries to be load).
before receiving any connections. Affects dictionaries only if "dictionaries_lazy_load" is false.
Setting this to false can make ClickHouse start faster, however some queries can be executed slower.
-->
<wait_dictionaries_load_at_startup>false</wait_dictionaries_load_at_startup>
<wait_dictionaries_load_at_startup>true</wait_dictionaries_load_at_startup>
<!-- Configuration of user defined executable functions -->
<user_defined_executable_functions_config>*_function.*ml</user_defined_executable_functions_config>

View File

@ -0,0 +1,3 @@
<clickhouse>
<dictionaries_lazy_load>0</dictionaries_lazy_load>
</clickhouse>

View File

@ -1,3 +0,0 @@
<clickhouse>
<wait_dictionaries_load_at_startup>1</wait_dictionaries_load_at_startup>
</clickhouse>

View File

@ -10,11 +10,14 @@ DICTIONARY_FILES = [
cluster = ClickHouseCluster(__file__)
node1 = cluster.add_instance(
"node1",
main_configs=["configs/wait_for_dictionaries_load.xml"],
main_configs=["configs/no_dictionaries_lazy_load.xml"],
dictionaries=DICTIONARY_FILES,
)
node0 = cluster.add_instance("node0", dictionaries=DICTIONARY_FILES)
node0 = cluster.add_instance(
"node0",
dictionaries=DICTIONARY_FILES,
)
@pytest.fixture(scope="module", autouse=True)
@ -33,9 +36,13 @@ def get_status(instance, dictionary_name):
def test_wait_for_dictionaries_load():
assert get_status(node0, "long_loading_dictionary") == "NOT_LOADED"
assert get_status(node1, "long_loading_dictionary") == "LOADED"
assert node1.query("SELECT * FROM dictionary(long_loading_dictionary)") == TSV(
[[1, "aa"], [2, "bb"]]
)
assert get_status(node0, "long_loading_dictionary") == "NOT_LOADED"
assert node0.query("SELECT * FROM dictionary(long_loading_dictionary)") == TSV(
[[1, "aa"], [2, "bb"]]
)
assert get_status(node0, "long_loading_dictionary") == "LOADED"