Jepsen is a Clojure library for distributed systems verification that uses fault injection to test correctness.
The tool addresses the challenge of validating that distributed systems behave correctly under adverse conditions. It works by running a test program on a control node that orchestrates a distributed system across multiple database nodes via SSH, generates concurrent operations against that system, and records the complete history of those operations. A special nemesis process deliberately introduces faults—network partitions, clock skew, and other failures—while the system runs. After the test completes, Jepsen analyzes the operation history against correctness models to determine whether the system violated its guarantees. The framework can verify systems ranging from eventually-consistent databases to linearizable coordination systems and distributed task schedulers, and it generates performance and availability graphs to characterize system behavior under different fault conditions.
Jepsen suits teams building or evaluating distributed systems who need rigorous correctness testing beyond unit tests. It is particularly valuable when you need to discover whether a system maintains its consistency or availability guarantees when things fail. The framework requires writing test code in Clojure, which means adopting it involves learning both the library's API and writing test logic in that language. The tool provides pluggable components for operating systems and databases, allowing tests to be adapted to different deployment scenarios. Results from each test run are stored with analysis reports and graphs for later review.
The project maintains active development with regular updates to its core testing infrastructure and checker implementations. The codebase includes comprehensive documentation through tutorials and API references that guide users from initial setup through writing custom tests. The framework provides multiple deployment options including AWS Marketplace instances and local containerized environments, reducing friction for teams wanting to run tests without managing infrastructure manually.