
DucKDBデータベース向けのJepsenテストです。リモートクラスタではなくローカルで実行されます。テストはローカルのDuckDBファイルを開く一連のローカルプロセスを生成し、STDIN/STDOUTを介してそれらと対話します。
これは初期のプロトタイプです。起動してトランザクションを実行し、正しさをチェックしてバグを報告しますが、それらのバグが本物かどうかは確かではありません。
JDK(21以降)、Git、Gnuplot、Graphviz、およびLeiningenが必要です。ほとんどのJepsenテストとは異なり、これは完全にローカルで実行されます。マシンのクラスタやSSHキーなどは必要ありません。
sudo apt install openjdk leiningen gnuplot graphviz
brew install openjdk leiningen gnuplot graphviz
テストを実行するには、次のコマンドを試してください:
lein run test
DuckDBは(私の推測では)デフォルトでStrong SIを提供しており、テストはそれをチェックします。ただし、Repeatable Read違反であるG2-itemは許可されています。これを示すには、次のコマンドを試してください:
lein run test --time-limit 10 --expected-consistency-model serializable --max-writes-per-key 8
テストを10秒間実行し、Serializability違反を探し、(小さく読みやすい例を生成するために)キーあたり8要素のみ書き込むように指定しています。G2-itemの例は store/latest/elle/G2-item で確認できるはずです。
いくつかの調整オプションが利用可能です。各種オプションのヘルプは lein run test --help で確認できます。
テスト結果は store/<test-name>/<date>/ に書き込まれ、store/latest としてシンボリックリンクされます。これらのテストディレクトリはそれぞれ自己完結しており、コピー、tarアーカイブ、後で分析、削除などが可能です。結果を閲覧するためにWebサーバーを実行することもできます。
lein run serve
REPLが利用可能です。lein repl を参照してください。
テストハーネスはこのディレクトリにあります。プロジェクトファイルは project.clj、ソースは src/ などにあります。
テストハーネスは、DuckDBライブラリを埋め込み、それに対してトランザクションを実行する別のプログラム「ローカルノード」を実行します。テストハーネスは、特定のワークロードに対してランダムなトランザクションを生成し、HTTP経由でローカルノードに送信し、それらのトランザクションの結果を記録し、最後にさまざまなトランザクション異常をチェックします。Elleチェッカー(https://github.com/jepsen-io/elle)を使用して、Strong Snapshot Isolationを探します。
ローカルノードには小さなHTTPサーバーがあり、テストハーネスから抽象トランザクション(例:「キーxを読み取って、yを5に設定」)を受け取り、DuckDB JDBCドライバーに対して実行されるトランザクションに変換します。
1種類の障害を注入できます:プロセスの強制終了です。
2つのワークロードがあります。
1つ目は append で、リストに一意の整数を追加し、そのリストの内容を読み取るトランザクションを実行します。各リストは単一の行に存在し、複数のテーブルに分散しています。リストは主キーまたはインデックスなしのセカンダリキーで識別されます。リストはテキストフィールドまたはDuckDBのINTEGER{ ] リストとしてエンコードされます。変更はINSERT ON CONFLICT UPDATEまたはMERGE INTOで行われます。
2つ目は fkey-register で、整数レジスタの読み取りと書き込みを行います。DuckDBでは、これらのレジスタを2つのテーブルに格納します。論理テーブルはキーを物理IDにマッピングし、外部キーを持ちます。物理テーブルは物理IDを値にマッピングします。読み取りは2つのテーブル間の単純なJOINを使用します。書き込みは、物理行を更新するか、新しい物理行を作成して論理ポインタを変更することによって実行されます。このワークロードは本日ようやく起動できました。動作はしますが、まだ洗練されていません。
Copyright © 2026 Jepens, LLC
このプログラムおよび付随する資料は、https://www.eclipse.org/legal/epl-2.0 で入手可能なEclipse Public License 2.0の条件に基づいて提供されます。
このソースコードは、Eclipse Public License v. 2.0に定められた利用可能性の条件が満たされた場合、以下のセカンダリライセンスの条件でも利用可能になる場合があります:フリーソフトウェア財団によって公開されたGNU General Public License、バージョン2、または(オプションで)それ以降のバージョン。ただし、https://www.gnu.org/software/classpath/license.html で入手可能なGNU Classpath Exceptionが適用されます。