0.1.7
Major thanks to Kit Patella (@mkcp) for all her hard work on this release!
API changes
- Clients and Nemeses have fundamentally different lifecycles and operations, and have been split into two protocols accordingly. Client is for clients, and Nemesis is for nemeses.
- The Client protocol conflated two things: connecting to a database, and setting up initial state. We now offer explicit steps:
open
andclose!
create a new nemesis with a connection to a DB, and close! closes its connection. At the start and end of a test, we callsetup!
andteardown!
to perform any db/table setup and cleanup. This is all backwards compatible--but you will see deprecation warnings urging you to migrate to the new Client protocol, becauuuse... - Clients are now closed and abandoned when
invoke
returns aninfo
result, rather than continuing to use the same client. This is important because a background thread (say, spawned by a timeout operation for a previous call toinvoke!
might still be trying to make calls against that client, or the client could have some transactional state buried inside it which gets reused by the next invocation with a new logical client. This led to improperly mixed transactions, especially in jdbc, and required all kinds of complicated reconnection logic. The new approach causes connection churn oninfo
, but makes it much simpler to write correct tests. While old clients are backwards compatible, this re-opening behavior could lead to clients running setup code in the middle of a test, and if proper idempotent locking was not employed, this could clobber state. Split your Client functions into separate open! and setup! phases to fix this. - Nemesis and client setup is now concurrent, rather than taking place in separate phases. This should not affect most users.
- Jepsen.model is dead; models turned out to be specific to their checkers. Use knossos.model instead.
New features
- Jepsen histories now assign a unique
:index
to every operation. - HTML plots have the full operation data and wall-clock time in tooltips for each operation, and a unique link target for every op, making it possible to link people to a particular part of the history.
- Knossos' SVG plots link operations to their corresponding view in the timeline, so you can jump immediately to the surrounding context of a fault.
Minor changes
- jepsen.nemesis.time rounds millisecond times to integers, rather than using floats.
- jepsen.client has significantly expanded documentation.
- jepsen.control/upload can take java.io.Files, not just filenames.
- SSH Exceptions now log additional debugging context which can help diagnose mysterious connection errors.
- When gnuplot is not installed, Jepsen emits a friendlier error message.
Bugfixes
- Client changes allowed us to fix a longstanding deadlock in jepsen's core, where exceptions could crash worker threads and hang the whole test. Jepsen is now much more robust to exceptions in clients, nemeses, and generators. We also ensure all workers connect, set up, work, tear down, and close in separate phases.
- jepsen.generator/mix now accepts empty vectors, and emits nil always.
- jepsen.checker.perf now renders nemesis events as vertical bars, rather than ranges. This is less helpful for start/stop pairs, but more helpful in the general case, when operations use other names and don't have clear start/stop semantics.
- jepsen.cli/tarball-opt is properly backwards-compatible