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 ソケット、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/kevycmd 経由で 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 のサーバーを止め、同じ --dir で 5.2 のバイナリを起動します。
  4. INFO serverkevy_version:5.2.0 を報告します。

ロールバックは、5.2 を止めて同じディレクトリで 5.1 を起動するだけです。5.2 が書いたもので 5.1 が読めないものはありません。