Eventually-consistent local harness that exercises NFS-like race conditions.
Project description
ChaosFS
ChaosFS is a local FUSE harness for reproducing NFS-style consistency issues without using production systems. It lets you mount multiple ChaosFS clients over one backing directory and inject delayed visibility, stale metadata/listing views, and operation failures so concurrent read/write workflows can be tested under realistic race conditions.
Project layout
src/chaosfs/: installable ChaosFS package that exposesChaosFSand thechaosfsCLI.demo/: optional walkthroughs and validators that run against mounted ChaosFS clients.tests/: regression tests for the ChaosFS implementation.
Prerequisites
- Python 3.10 or newer.
fusepyinstalled (the package metadata already depends on it).- A FUSE implementation available for unprivileged mounts (
fusermount,fusermount3, orumount).
Installation
Install from the repo root on any platform that needs ChaosFS:
pip install -e .
The installation exposes chaosfs as the primary user-facing command.
CLI usage
chaosfs mount <backing> <mountpoint> starts a FUSE client that surfaces a delayed, write-late, cache-incoherent view of <backing> at <mountpoint>. The command reads sensible defaults for the chaos knobs from environment variables (see the Chaos knobs section) but lets you override them as flags.
By default, logs are written to the terminal; use --log-file or --log-dir to persist them.
chaosfs umount can tear down a single mount point with --mount <path> or sweep an entire directory tree with --mount-base <dir>.
Preparing backing and mount paths
Create the backing and mount directories before calling chaosfs mount. The command intentionally fails if:
- the backing directory does not exist
- the target mount directory does not exist
- the target mount directory is not empty
Once you have a backing tree you care about, create one mountpoint per client:
BACKING_DIR=/tmp/chaosfs/backing
MOUNT_BASE=/tmp/chaosfs/mnt
LOG_DIR=/tmp/chaosfs/logs
mkdir -p "$BACKING_DIR" "$MOUNT_BASE" "$LOG_DIR"
chaosfs mount "$BACKING_DIR" "$MOUNT_BASE/clientA" \
--client-id clientA --log-dir "$LOG_DIR" --background
chaosfs mount "$BACKING_DIR" "$MOUNT_BASE/clientB" \
--client-id clientB --log-dir "$LOG_DIR" --background
Both mounts point at the same backing data. You can run as many clients as you like against a single backing directory (there is no requirement to create more than one mount point, single-client workloads are also valid).
Use --background if you want the CLI command to return immediately; omit it when running one mount in a dedicated foreground terminal for debugging.
When running in background without --log-dir/--log-file, chaosfs still runs but prints a warning because logs may not be visible.
In foreground mode, when the process exits, chaosfs performs a best-effort unmount of that mountpoint.
To unmount everything later:
chaosfs umount --mount-base "$MOUNT_BASE"
Or target a single mount:
chaosfs umount --mount "$MOUNT_BASE/clientA"
Chaos knobs
| Env var | Default | Description |
|---|---|---|
CHAOSFS_META_TTL_MS |
1500 |
Metadata and directory listing TTL per client. |
CHAOSFS_WRITE_DELAY_MS |
800 |
How long writes take to become globally visible. |
CHAOSFS_RENAME_DELAY_MS |
1200 |
Delay for rename/directory visibility and cache invalidation. |
CHAOSFS_DROP_PROB |
0.0 |
Probability that each operation fails with EIO. |
CHAOSFS_SEED |
unset | Seed for deterministic randomness. |
CHAOSFS_CLIENT_ID |
client |
Namespace used for per-client caches. |
You can also provide these values as CLI flags (--meta-ttl, --write-delay, etc.) in milliseconds.
Demos & use cases
See demo/README.md for the demo catalog, including a generic race visualizer and a concurrent-venv reproduction scenario.
Demo scripts use LOG_DIR when provided.
Testing
ruff format --check .
ruff check .
python -m unittest tests/test_chaosfs.py
python -m chaosfs.cli --help
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file chaosfs-0.1.0.tar.gz.
File metadata
- Download URL: chaosfs-0.1.0.tar.gz
- Upload date:
- Size: 10.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
99ef9f5504730bf02f52189a35e7a352fd605da63594ae21524d464e8f71b697
|
|
| MD5 |
6f4ac1c5c919df3814903ed97d9a5f4b
|
|
| BLAKE2b-256 |
575a16afbeb695375a68ad5c3ea4a2e057c47272253acfcceb80b909faa8ad70
|
File details
Details for the file chaosfs-0.1.0-py3-none-any.whl.
File metadata
- Download URL: chaosfs-0.1.0-py3-none-any.whl
- Upload date:
- Size: 8.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ebc314cd52b5215404a0fae7fbc37e82d5a2551f916fbaa45f3bc1302b52caec
|
|
| MD5 |
ec86a7d2272374771730f1dc10abdcbb
|
|
| BLAKE2b-256 |
5c53ed8ed6532a66caad4a791570251faa916c514c061b53f387fe0824ecef3f
|