This is a test suite, written using the Jepsen distributed systems testing library, for Tarantool. It provides a number of workloads, which uses Elle and Knossos to find transactional anomalies up to strict serializability.
We include a wide variety of faults, including network partitions, process crashes, pauses, clock skew, and membership changes.
You'll need a Jepsen cluster running Ubuntu, which you can either build yourself or run in AWS via Cloudformation.
The control node needs:
- A JVM with version 1.8 or higher.
- JNA, so the JVM can talk to your SSH.
- (optional) Gnuplot, that helps Jepsen renders performance plots.
- (optional) Graphviz, that helps Jepsen renders transactional anomalies.
These dependencies you can get (on Ubuntu) via:
sudo apt install -y openjdk8-jdk graphviz gnuplot
Jepsen will install dependencies (e.g. git
, build tools, various support
libraries) as well as Tarantool itself automatically on all DB nodes
participated in test.
Tests distributed as a JAR file suitable for running with JVM. Release archives with JAR file, shell script for running JAR file, CHANGELOG.md and README.md are published for every release. Before start one can download archive for latest release and unpack it.
To see all options and their default values, try
./run-jepsen test --help
To run test register
with Tarantool 2.8 10 times during 600 seconds, try:
./run-jepsen test --username root --nodes-file nodes --workload register
--version 2.8 --time-limit 600 --test-count 10
To run test set
with Tarantool built using source code in master branch
during 100 seconds with 20 threads, try:
./run-jepsen test --nodes-file node --engine vinyl --workload set
--concurrency 20 --time-limit 100
To focus on a particular set of faults, use --nemesis
./run-jepsen test --nemesis partition,kill
--concurrency
- how many workers should we run? Must be an integer, optionally followed by n (e.g. 3n) to multiply by the number of nodes.--engine
- what Tarantool data engine should we use? Available values arememtx
andvinyl
. Learn more about DB engines in Tarantool documentation.--leave-db-running
- leave the database running at the end of the test, so you can inspect it. Useful for debugging.--logging-json
- use JSON structured output in the Jepsen log.--mvcc
- enable MVCC engine, learn more about it in Tarantool documentation.--nemesis
- a comma-separated list of nemesis faults or groups of faults to enable. Nemeses groups are:none
with none nemeses,standard
includespartition
andclock
,all
includes all nemeses listed below. Available nemeses are:clock
generates a nemesis which manipulates clocks.pause
pauses and resumes a DB's processes usingSIGSTOP
andSIGCONT
signals.kill
kills a DB's processes usingSIGKILL
signal.partition
splits network connectivity for nodes in a cluster and then recover it.
--nemesis-interval
- how long to wait between nemesis faults.--node
- node(s) to run test on. Flag may be submitted many times, with one node per flag.--nodes
- comma-separated list of node hostnames.--nodes-file
- file containing node hostnames, one per line.--username
- username for login to remote server via SSH.--password
- password for sudo access on remote server.--strict-host-key-checking
- whether to check host keys.--ssh-private-key
- path to an SSH identity file.--test-count
- how many times should we repeat a test?--time-limit
- excluding setup and teardown, how long should a test run for, in seconds?--version
- what Tarantool version should we test? Option accepts two kind of versions: branch version (for example 2.2) to use a latest version of package from this branch or GIT commit hash to use version built on this commit.--workload
- test workload to run. Available workloads are:bank
simulates transfers between bank accounts. Uses SQL to access to bank accounts.bank-multitable
simulates transfers between bank accounts when each account is in a separate space (table). Uses SQL to access to bank accounts.bank-lua
simulates transfers between bank accounts. Uses Lua functions to access to bank accounts.bank-multitable-lua
simulates transfers between bank accounts when each account is in a separate space (table). Uses Lua functions to access to bank accounts.counter-inc
increments a counter.register
models a register with read, write and CAS (Compare-And-Set) operations.set
inserts a series of unique numbers as separate instances, one per transaction, and attempts to read them back through an index.
For building Jepsen tests locally one need to setup Leiningen build system and Clojure.
For building tests, try:
lein deps
lein compile
For running tests, try:
lein run test --nodes-file nodes --workload register --version 2.8 --time-limit 100
Copyright © 2020-2021 VK Company Limited
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.