kevy
本页内容

从 5.1 升级到 5.2

一句话版本:停掉 5.1 的服务器,用 5.2 的二进制在同一个数据目录上启动。 不用改配置,协议没变,客户端不用动。数据目录双向可开。

如果你跑脚本,请读 Lua 那一节。 内嵌的 Lua 运行时跨了三个小版本,并把 5.1 与 5.2 两个方言校正到与上游一致。kevy 默认就是 Lua 5.1,所以这些校正不需要你主动选择就会通过 EVAL 显现 —— 其中一条会让已有脚本找不到它正在用的函数。

这个版本为什么存在

  • 浏览器构建带上了完整的嵌入式面。 它此前只用 corepersist 构建,于是 IDX.*VIEW.*TABLE.* 在浏览器里答 unknown command —— 而那一页的论点恰恰是 kevy 把二级索引、全文与向量检索做在引擎内部。现在 indextextvector 都开着。模块从 726 KB 变为 1441 KB(gzip 后 481 KB)。

留在外面的东西缺的不是字节,而是浏览器给不了的东西:replicate 要网络对端,listener 要 TCP socket,tier 要磁盘目录。流、事务、geo 与脚本在任何平台上都在嵌入式引擎的动词面之外。

  • 修掉了 Lua 运行时里的一个拒绝服务。 string.rep("", math.maxinteger, "") 会在不分配内存的情况下空转,尺寸守卫因此拦不住它:一个表达式就能挂死 VM。如果你跑不受信任的 Lua,这就是升级到 5.2 的理由。
  • Lua 方言与上游一致了。 细节见下 —— 这是可能改变已有脚本行为的部分。

原样保留的东西

  • 协议。 RESP2 与 RESP3 的回复逐字节相同。没有客户端需要换版本。
  • 数据目录。 AOF、快照、值日志、索引检查点与目录表都照原样打开。5.1 也能打开 5.2 写过的目录。
  • 配置。 每个键的名字、类型与默认值都不变。
  • 复制。 5.1 副本可以跟随 5.2 主节点,反过来也可以,所以滚动升级不挑顺序。

行为上的变化

以下全部来自 Lua 运行时升到 luna-core 3.0.0,它把 5.1 与 5.2 方言校正到 PUC Lua 5.5.1。kevy 的默认方言是 5.1。

table 库随方言

在默认的 5.1 下,标准库现在提供的是 Lua 5.1 真正拥有的东西:

5.1(kevy 5.1)5.2(kevy 5.2)
table.setn没有 —— 抛 'setn' is obsolete,与上游一致
table.unpack没有
table.create没有

运行时此前注册的是所有版本函数的并集,所以脚本能调到目标方言并没有的名字。在默认方言下用 table.unpack 的脚本会找不到它。

两条路都实测可用:

  • 用 5.1 的写法 —— 全局 unpack,它不受影响:

``lua local t = {1, 2, 3} return {unpack(t)} ``

  • 或者指定一个有 table.unpack 的方言:

``lua #!lua version=5.4 return {table.unpack({1, 2, 3})} ``

类型错误把操作数写在前面

上游 Lua ≤ 5.2 是操作数在前、类型在后;5.3 才翻成类型在前。kevy 此前对所有方言都发 5.3+ 的形状。在 5.1 与 5.2 下,消息现在与上游一致:

5.1(kevy 5.1)5.2(kevy 5.2)
调用 nil 局部量attempt to call a nil value (local 'f')attempt to call local 'f' (a nil value)
索引 nil 局部量attempt to index a nil value (local 't')attempt to index local 't' (a nil value)
对 nil 做算术…on a nil value (local 'a')…on local 'a' (a nil value)

如果你的脚本按错误文本匹配,或者应用对失败 EVAL 返回的字符串做断言,这条会影响你。错误的类别没变,变的只是措辞。

5.3、5.4、5.5 三个方言未受影响。

如果你嵌入这个存储

kevy-embedded 与各语言绑定一起升到 5.2.0。上面的 Lua 行为适用于任何能到达 EVAL 的地方。

浏览器包 @goliapkg/kevy 通过 cmd 获得 IDX.*VIEW.*TABLE.*。它的 typed 接口没变,5.1 写在 OPFS 或 IndexedDB 里的存储在 5.2 下照常打开。

建议的步骤

  1. 在脚本里搜 table.unpacktable.createtable.setn 默认方言下前两个不再解析;第三个开始存在并抛出上游那条过时错误。找到了就先按上面两种改法之一处理 —— 两种在 5.1 上同样有效,所以可以先改再升级。
  2. 搜一下有没有按 Lua 错误文本匹配的地方。 5.1 与 5.2 下的措辞变了,类别没变。
  3. 停掉 5.1 的服务器。用 5.2 的二进制在同一个 --dir 上启动。
  4. INFO server 会报 kevy_version:5.2.0

回滚就是停掉 5.2、在同一个目录上起 5.1。5.2 写下的东西没有 5.1 读不了的。