如何在 Tarantool 中设置在 box.info 字段发生更改时触发?

我需要捕捉从 "loading" 到 "ready" 的 box.info.status 更改的情况。因此,我可以在 WAL 读取但在复制同步之前启用我的触发器。

我的触发器函数在 box.space.myspace 上:

local function before_replace(old, new)
    -- 在这里解决冲突
    if box.session.type() ~= 'applier' then
        box.space.stat:upsert(
            { "key", 0 },
            {
                {"+", stat.COUNT, 1}
            })
    end
    return
end
  • 如果我在模式初始化时设置触发器,它会失败并显示 read_only 错误,因为正在尝试更新只读 stat 空间。
  • 如果我将其设置为 box.info.ro == False,它将跳过复制同步。

我发现设置触发器的最合适时间是 box.info.statusloading 更改为 running 的时刻。我像 这样 解决了我的问题。但我不知道是否有更好的方法?

我想要在 box.info.status 字段更改时设置回调函数。我应该如何实现?

点赞
用户4984564
用户4984564

最简单的黑客方法我能想到的是生成一个纤程,定期检查变化并在它检测到变化时运行回调函数。

2019-08-07 14:53:02
用户1229313
用户1229313

您的操作方式有误。 如果您想要等待实例退出只读模式,可以使用 box.ctl.wait_ro()。如果您想要等待引导结束,请将您的代码放在 box.cfg 之后。最后,如果您想要捕获模式初始化事件,可以设置 box.ctl.on_schema_init 触发器。请描述您想要完成的具体任务,将为您提供一个适当的工具。

2019-08-07 15:06:14