Как избежать регистрации box.once ('init', function ...), когда функция init не работает? - PullRequest
2 голосов
/ 05 мая 2020

Я хочу реализовать функцию init в box.once () , чтобы она выполнялась только один раз в Tarantool, однако это полезно для меня, только если init выполнен успешно.

Вопрос : Как сделать запись « onceinit » действительной только в том случае, если инициализация прошла успешно ??

Чтобы воспроизвести case :

Следующий код функции init завершается ошибкой, потому что нет функции create_space_BAD , однако при сканировании схемы она регистрируется как выполняемая.

Есть предложения, как это исправить?

Код:

local function start()
    box.cfg{}
    box.once('init', function()
        if not pcall(box.schema.create_space_BAD, 'myspace') then
            print('ERROR: create_space_BAD NOT EXIST')
            return false
        end
   ...
   end)
end

Схема исследования:

tarantool> box.space._schema:select{}
---
- - ['cluster', '1cb21086-51a3-46fb-900e-1983609fc396']
  - ['max_id', 511]
  - ['onceinit']
  - ['version', 1, 10, 2]
...

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Обратите внимание, что подход с box.space._schema:delete не будет работать, если вы создадите несколько пробелов / индексов. Рекомендуемый способ - использовать параметр if_not_exists вместо box.once.

См. https://www.tarantool.io/en/doc/2.3/reference/reference_lua/box_schema/#box -schema-space-create

и

https://www.tarantool.io/en/doc/2.3/reference/reference_lua/box_space/#box -пространственный-создать-индекс

1 голос
/ 05 мая 2020

Эта проблема может быть решена с помощью box.space._schema: delete ('onceinit'), чтобы явно отменить регистрацию вашей функции инициализации.

Like:

local function start()
  box.cfg{}
  box.once('init', function()
      if not pcall(box.schema.create_space_BAD, 'myspace') then
    print('ERROR: create_space_BAD NOT EXIST')
    box.space._schema:delete('onceinit')
    return false
      end
        end)
end

Тогда вы увидите:

tarantool> box.space._schema:select{}
---
- - ['cluster', 'd6a9d97b-3a3f-4f69-8d1a-65ae5a073c16']
  - ['max_id', 511]
  - ['version', 2, 3, 1]
...

Подробнее см. https://www.tarantool.io/en/doc/1.10/reference/reference_lua/box_once/

...