Fleet status
Measured on the four-node lab (swift1–swift4, one etcd, one Swift).
Live prefix /swiftfuse/etcdfs/ at /mnt/swift-etcd. G2 is the
scratch mount. Live never gets NVMe.
Closed gates
| Gate | Verdict | Notes |
|---|---|---|
| G1 / 006 / 035 | PASS | Official fstests |
| G3 LTP | PASS | |
| G4a / G4b | PASS | |
| G5 | PASS | |
| G6 | PASS | Official |
| R1 inode | PASS | |
| R2 fencing | 100/100 | |
| R3 live pack | PASS | delta=1, then pack_target=0 |
| R4 | PASS | |
| R5 watch 10k | PASS | Not 几万 |
| R6 failpoint | PASS | |
| R7 swiftfuse | MEASURED | G2 small-file 1000/1000 |
| R7 cache-hit | PASS | /opt/detect/results/r7-cache-hit-20260902-021100/ window hits=+1 misses=+1 |
| R7 s3api compare | MEASURED | https://10.0.0.10:8085 RegionOne path-style |
| R8 NVMe 10G | PASS | 50G / 100G / 1TB deferred |
| Porcupine 2-mount | LINEARIZABLE | Same-mount writeback is illegal |
| G7 full fault | PASS | Quorum remount is not seamless failover |
R7 comparators, client-cache column (2026-09-02)
Swift on this lab exposes S3 (s3api + s3token on :8085, not :8080).
/info does not advertise s3api; that was a false negative.
/opt/detect/results/r7-s3-fs-20260902-025444/ MEASURED. Dedicated buckets
s3://r7-geese-cmp and s3://r7-juice-cmp only. No keys in logs.
GeeseFS mem 256, JuiceFS cache 256. benchmark.sh cold seq-read used to
seed seq.bin and read it without a remount, so userspace caches stayed hot.
| Backend | seq-write cold | seq-read cold | seq-read warm | small-file cold |
|---|---|---|---|---|
| swiftfuse (G2, 2026-09-01) | 34.6 MiB/s | 21.3 MiB/s | 135.6 MiB/s | 100/100 in 92s |
| swift CLI | 21.9 MiB/s | 45.2 MiB/s | 70.9 MiB/s | 71s |
rclone :swift: | 25.1 MiB/s | 33.9 MiB/s | 33.4 MiB/s | 7.6s |
| GeeseFS s3api | 69.4 MiB/s | 587 MiB/s | 318 MiB/s | 0.48s |
| JuiceFS s3api | 55.2 MiB/s | 31.5 MiB/s | 1306 MiB/s | 7.9s |
GeeseFS 587 and JuiceFS 1306 are client cache, not Swift line rate.
R7 fair remount + drop_caches (2026-09-02)
/opt/detect/results/r7-s3-fs-fair-20260902-031641/ MEASURED.
FAIR_REMOUNT=1: write → persist → umount → wipe JuiceFS --cache-dir →
drop_caches → remount → read-cold → read-warm.
GeeseFS persist on this proxy needs --single-part 80. Default multipart
never completed, so a 64 MiB file stayed dirty in RAM and vanished on umount.
| Backend | seq-write | seq-read cold (S3 miss) | seq-read warm (client cache after refill) |
|---|---|---|---|
| GeeseFS s3api | 16.5 MiB/s | 50.2 MiB/s | 675 MiB/s |
| JuiceFS s3api | 34.4 MiB/s | 8.87 MiB/s | 5029 MiB/s |
Fair cold is the column to put next to swiftfuse G2 seq-read cold 21.3. Warm after remount is still client cache; it is not a Swift number.
Daemon fields
File /run/swiftfuse/<fs_name>.stats.json (HTTP /metrics if stats_listen is free; 9102 is statsd_exporter here). R7 scrape: EXPOSED.
fuse_op_latency_usp50/p99etcd_txn_latency_usp50/p99cache_hit_rationetwork_bytes
Live bin md5 756c4c16f2cacbdd9fbaafa650e2e51c. kernel_ttl=0 write_back=true pack_target=0.
Live policy
kernel_ttl=0 write_back=true pack_target=0 lease=true. No NVMe.
Numeric PIDs only. Never pkill -f.