从 5.1 升级到 5.2
一句话版本:停掉 5.1 的服务器,用 5.2 的二进制在同一个数据目录上启动。 不用改配置,协议没变,客户端不用动。数据目录双向可开。
如果你跑脚本,请读 Lua 那一节。 内嵌的 Lua 运行时跨了三个小版本,并把 5.1 与 5.2 两个方言校正到与上游一致。kevy 默认就是 Lua 5.1,所以这些校正不需要你主动选择就会通过 EVAL 显现 —— 其中一条会让已有脚本找不到它正在用的函数。
这个版本为什么存在
- 浏览器构建带上了完整的嵌入式面。 它此前只用
core与persist构建,于是IDX.*、VIEW.*、TABLE.*在浏览器里答unknown command—— 而那一页的论点恰恰是 kevy 把二级索引、全文与向量检索做在引擎内部。现在index、text、vector都开着。模块从 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 下照常打开。
建议的步骤
- 在脚本里搜
table.unpack、table.create与table.setn。 默认方言下前两个不再解析;第三个开始存在并抛出上游那条过时错误。找到了就先按上面两种改法之一处理 —— 两种在 5.1 上同样有效,所以可以先改再升级。 - 搜一下有没有按 Lua 错误文本匹配的地方。 5.1 与 5.2 下的措辞变了,类别没变。
- 停掉 5.1 的服务器。用 5.2 的二进制在同一个
--dir上启动。 INFO server会报kevy_version:5.2.0。
回滚就是停掉 5.2、在同一个目录上起 5.1。5.2 写下的东西没有 5.1 读不了的。