我想在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-空间创建索引