0.2.6
The biggest change in this release is the introduction of a custom file format for Jepsen tests: each store directory now has a test.jepsen
file. This file can be incrementally written, which speeds up testing and allows for much better crash recovery. It can also be lazy-loaded: loading a test from disk takes only a few milliseconds rather than multiple minutes (for reasonably chonky tests), and gives you immediate access to the top-level test map and the results :valid?
field. Loading the history or full results map is lazy and cached. This makes working with tests at the REPL much nicer, and you'll find new functions for loading tests at the repl too: store/all-tests
and store/test
. The new file format also speeds up the web interface and makes it more accurate for tests where results.edn is large or truncated.
All store functions are backwards compatible, using test.jepsen where possible, and falling back to results.edn and test.fressian otherwise. We still produce test.fressian files, but this will (unless people complain) be discontinued in the next Jepsen release to save storage space and speed up testing.
There are some improvements to the membership nemesis framework that make it easier to debug and to track complex state. Clients can explicitly signal that they'd like to tear down the process, even if they don't crash. You'll also find some quality-of-life improvements, including the ability to map log-files to short local paths.
API Changes
- No significant breaking API changes
Bugfixes
- Docker scripts no longer print out control characters on OS X / latest Debian
- Docker scripts don't throw "unbound variable" when POSITIONAL is empty
- db/tcpdump now allows you to specify multiple ports correctly--they were combined using
and
, notor
. - The web interface no longer flags some valid? tests as incomplete
New Features
- Tests are now stored in a new binary format (jepsen.store.format) which allows lazy loading of histories and results, as well as incremental saves.
- client/invoke can add
:end-process? true
to a completion operation, which forces the interpreter to terminate the process even if the op was ok/fail. Helpful for clients which need to be torn down even on definite failure. - Web interface now uses test.jepsen, and uses a local cache to dramatically speed up load times
- Web interface has some basic pagination, for when you've got thousands of tests in a store dir
- db/log-files can now return a map of remote paths to short local paths, which lets you avoid deep nested paths
- nemesis.membership/invoke! can now return [op, member-state] pairs. This allows membership to track states resulting from applying operations in a purely functional way. Membership state changes now involve an exclusive lock, but node view fetching remains nonblocking.
Minor Changes
lein run analyze
andjepsen.core/run!
read and emit test.jepsen files in addition to test.fressian.- Web interface now displays local times for test runs
- Web interface click-to-copy-test-dir now uses double instead of single quotes, so you can paste at the REPL
- Docker scripts are now compatible with cgroupv2
- Compiled for Java source level 11
- store/test loads a test by either a test directory string, or an integer index (-1 for most recent)
- store/all-tests gives a lazy sequence of every test in chronological order
- Some fressian-related vars in jepsen.store have been moved to jepsen.store.fressian, but copies remain in jepsen.store for backwards compatibility
- Fressian writers and readers are now available as first-class vars in jepsen.store.fressian for later composition, if you so desire
- nemesis.membership offers slightly clearer logging messages
- fs-cache/write-atomic creates tempfiles in the same directory as the destination, so targets need not be in /tmp.
- elle 0.1.4
- dom-top 1.0.7
- tools.logging 1.2.4
- unilog 0.7.29
- ring 1.9.5
- bouncycastle/bcprov-jdk15on 1.70
- fipp 0.6.25