Функция box.once
-
box.
once
(key, function[, ...])¶ Выполнение функции при условии, что она раньше не выполнялась. Передаваемое значение проверяется на предмет того, выполнялась ли функция. Если она выполнялась, ничего не происходит. В противном случае вызывается функция.
См. пример использования
box.once()
во время настройки набора реплик.Если в
box.once()
возникает ошибка во время инициализации базы данных, можно повторно запустить невыполненный блокbox.once()
, не останавливая базу данных. Для этого удалите объектonce
из системного спейса _schema. Введите командуbox.space._schema:select{}
, найдите объектonce
и удалите его. Например, повторное выполнение блокаkey='hello'
:Когда
box.once()
используется для инициализации, следует подождать, пока база данных не будет в нужном состоянии (только для чтения или для чтения и записи). Для этого см. функции во Вложенный модуль box.ctl.tarantool> box.space._schema:select{} --- - - ['cluster', 'b4e15788-d962-4442-892e-d6c1dd5d13f2'] - ['max_id', 512] - ['oncebye'] - ['oncehello'] - ['version', 1, 7, 2] ... tarantool> box.space._schema:delete('oncehello') --- - ['oncehello'] ... tarantool> box.once('hello', function() end) --- ...
Параметры: - key (
string
) – значение для проверки - function (
function
) – функция - ... – аргументы, которые следует передать в функцию
Примечание
Параметр
key
сохраняется в системном спейсе _schema после вызоваbox.once()
, чтобы предотвратить повторный вызов по ключу. Эти ключи распространяются на набор реплик. Поэтому одновременный вызовbox.once
с одинаковыми ключами на двух экземплярах одного набора реплик может быть успешным, но приведет к конфликту транзакций.- key (