Функция box.once | Tarantool
Документация на русском языке
поддерживается сообществом

Функция 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 с одинаковыми ключами на двух экземплярах одного набора реплик может быть успешным, но приведет к конфликту транзакций.

Нашли ответ на свой вопрос?
Обратная связь