
Framework di test della correttezza transazionale basato su Jepsen per DuckDB, che rileva anomalie di isolamento come violazioni G2-item e SSI tramite carichi di lavoro randomizzati e il checker Elle.
Test Jepsen per il database DucKDB. Viene eseguito localmente, piuttosto che su un cluster remoto. Il test avvia una serie di processi locali che aprono un file DuckDB localmente, e interagisce con loro tramite STDIN/STDOUT.
Questo è un prototipo iniziale. Si avvia, esegue transazioni, le controlla per correttezza e segnala bug, ma non sono sicuro che quei bug siano reali.
Avrai bisogno di un JDK (21+), Git, Gnuplot, Graphviz, e Leiningen. A differenza della maggior parte dei test Jepsen, questo viene eseguito interamente localmente; non hai bisogno di un cluster di macchine, chiavi SSH, ecc.
sudo apt install openjdk leiningen gnuplot graphviz
brew install openjdk leiningen gnuplot graphviz
Per eseguire un test, prova:
lein run test
DuckDB fornisce (sospetto) Strong SI per impostazione predefinita, ed è ciò che il test verifica. Tuttavia permette G2-item, che è una violazione di Repeatable Read. Per dimostrarlo, prova:
lein run test --time-limit 10 --expected-consistency-model serializable --max-writes-per-key 8
Stiamo chiedendo di testare per dieci secondi, per cercare violazioni della Serializzabilità, e (per generare esempi piccoli e leggibili), di scrivere solo 8 elementi per chiave. Esempi di G2-item dovrebbero essere disponibili in store/latest/elle/G2-item.
Ci sono diverse opzioni di ottimizzazione disponibili. L'aiuto per le varie opzioni è disponibile tramite lein run test --help.
I risultati dei test vengono scritti in store/<test-name>/<date>/, e collegati simbolicamente come store/latest. Ciascuna di queste directory di test è autonoma; puoi copiarla, comprimerla in tar, analizzarla in seguito, eliminarla, e così via. Puoi anche eseguire un server web per sfogliare i risultati.
lein run serve
È disponibile un REPL; vedi lein repl.
Il test harness si trova in questa directory; il suo file di progetto è project.clj, il suo codice sorgente si trova in src/, e così via.
Il test harness esegue un programma separato, il "nodo locale", che incorpora la libreria DuckDB ed esegue transazioni su di esso. Il test harness genera transazioni casuali per un dato carico di lavoro, le invia tramite HTTP al nodo locale, e registra i risultati di tali transazioni, controllando alla fine varie anomalie transazionali. Cerchiamo Strong Snapshot Isolation, utilizzando il checker Elle (https://github.com/jepsen-io/elle).
Il nodo locale ha un piccolo server HTTP che riceve transazioni astratte (ad es. "leggi la chiave x, poi imposta y a 5") dal test harness, e le traduce in transazioni eseguite contro il driver JDBC di DuckDB.
Possiamo iniettare un tipo di guasto: uccisione dei processi.
Abbiamo due carichi di lavoro.
Il primo, append, esegue transazioni che aggiungono interi unici a liste, e legge il contenuto di tali liste. Ogni lista risiede in una singola riga, distribuita su diverse tabelle. Le liste sono identificate da chiave primaria o da una chiave secondaria non indicizzata. Le liste sono codificate sia come campi di testo sia come liste DuckDB INTEGER{] . La mutazione viene eseguita con INSERT ON CONFLICT UPDATE o MERGE INTO.
Il secondo, fkey-register, esegue letture e scritture di registri interi. In DuckDB, memorizziamo questi registri in due tabelle. Una tabella logica mappa chiavi a ID fisici, con una chiave esterna. Una tabella fisica mappa ID fisici a valori. Usiamo un semplice JOIN tra le due per la lettura. Le scritture vengono eseguite aggiornando la riga fisica, oppure creando una nuova riga fisica e alterando il puntatore logico ad essa. Ho appena fatto funzionare questo carico di lavoro oggi; viene eseguito, ma non è ancora rifinito.
Copyright © 2026 Jepens, LLC
This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 which is available at https://www.eclipse.org/legal/epl-2.0.
This Source Code may also be made available under the following Secondary Licenses when the conditions for such availability set forth in the Eclipse Public License, v. 2.0 are satisfied: GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version, with the GNU Classpath Exception which is available at https://www.gnu.org/software/classpath/license.html.