POSIX Testing
Filesystem conformance coverage, reproducible runners, and explicit limits.
BrewFS treats POSIX behavior as a release requirement. The test program checks FUSE and metadata behavior across SQLite, Redis, etcd, and TiKV with RustFS object storage. A passing suite is evidence for the configured cases, not a claim that every kernel or FUSE capability is implemented.
What is covered
| Area | Examples |
|---|---|
| Namespace and metadata | create, unlink, rename, hard links, timestamps, xattrs, special inodes, setgid inheritance |
| Permissions and paths | ownership, modes, traversal, link and unlink behavior |
| Concurrency | POSIX byte-range locks, lookup/stat paths, close-to-open behavior, transactional metadata updates |
| FUSE and writeback | truncate, flush, fsync-sensitive paths, cache invalidation, object-store commits |
Current validation coverage
| Suite | Scope | Published result |
|---|---|---|
| xfstests | FUSE, metadata, locking, writeback, object-store behavior | 708 / 708 configured cases on SQLite, Redis, etcd, and TiKV |
| pjdfstest | POSIX paths, permissions, links, special nodes, rename, unlink, timestamps | 246 files and 9,134 assertions on Redis and TiKV |
| LTP filesystem | Linux filesystem scenarios and record-lock coverage | Passed on all four backends with documented buffered iogen01 skip |
| stress-ng smoke | Short metadata and small-write stress | Passed with no residual files |
Run the suites
# Rust unit, integration, and feature checks
cargo test --workspace --lib --bins -- --test-threads=1
# Redis + RustFS POSIX suites
bash docker/compose-xfstests/run_redis_pjdfstest.sh
bash docker/compose-xfstests/run_redis_xfstests.sh
bash docker/compose-xfstests/run_redis_ltp.sh
bash docker/compose-xfstests/run_redis_stress_ng.sh --profile smoke
# Target one xfstests exclusion before considering its removal
bash docker/compose-xfstests/run_redis_xfstests.sh --check-args "-fuse generic/091"All modern Compose runners retain reports, logs, and skip-file context below
docker/compose-xfstests/artifacts/.
Explicit limitations
generic/075remains excluded. Buffered FUSE mmap after truncate/extend can expose stale page-cache bytes; direct I/O cannot run the mmap shape.- LTP
iogen01remains skipped in the normal buffered profile because a split-write/page-cache coherency race is still being diagnosed. open_by_handle_at, shared mount propagation, selected O_DIRECT sparse-hole cases, and long fsstress soaks are documented exclusions or manual suites.
An exclusion is not removed after one local pass. Re-run the case without the default exclude file, inspect its artifacts, then repeat it or run the complete suite before promoting it to required coverage.
Performance changes must preserve correctness
Read/write hot-path changes must re-run these suites and the performance guard. See Benchmark Methodology for the profile and regression-budget rules.

