当初始化函数失败时,如何避免注册box.once('init',函数...)?



我想在box.oce((下实现一个init函数,该函数在Tarantool中只执行一次,但是,只有成功执行init时,这对我才有用。

问题:只有在init成功运行的情况下,我才能使">onceinit"记录有效??

复制案例

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]
...

这个问题可以使用box.space_schema:delete('onceinit'(显式取消注册init函数来解决。

类似:

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/

请注意,如果创建多个空间/索引,box.space._schema:delete的方法将不起作用。建议使用if_not_exists选项而不是box.once

请参阅https://www.tarantool.io/en/doc/2.3/reference/reference_lua/box_schema/#box-模式空间创建

https://www.tarantool.io/en/doc/2.3/reference/reference_lua/box_space/#box-空间创建索引

最新更新