Repository navigation
Conversation
A computing unit whose GeeseFS process had died could never mount that repository again. The mount stays in /proc/mounts and can still answer stat() from attributes the kernel cached, but every read fails with "Transport endpoint is not connected". RepositoryMountManager.isFuseMounted only asked whether the mount was listed, so it reported "already mounted", never requested the mount again, and the operator found an unreadable directory. The mounter replaces a dead mount when asked, but its own liveness check, _responds, used stat() too, so a dead mount that still stats would be handed back as live. Both now require the mount's directory to be listable. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Automated Reviewer SuggestionsBased on the
|
Backport auto-label reportThis
|
parshimers
left a comment
There was a problem hiding this comment.
is there not some better way than trying to list the files?
It seems listing treat different reasons of problematic mount the same, I guess for us its ok because we just want to make sure we detect failed mounting accurately, why it failed does not matter. |
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #8832 +/- ##
============================================
- Coverage 92.57% 92.57% -0.01%
+ Complexity 5047 5044 -3
============================================
Files 1251 1251
Lines 53369 53371 +2
Branches 6618 6619 +1
============================================
+ Hits 49406 49407 +1
+ Misses 2319 2315 -4
- Partials 1644 1649 +5
*This pull request uses carry forward flags. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
|
| config | throughput | MB/s | latency | max Δ latest / 7d | |
|---|---|---|---|---|---|
| 🔴 | bs=10 sw=10 sl=64 | 357 | 0.218 | 27,757/31,533/31,533 us | 🟢 -16.1% / 🔴 +151.3% |
| 🔴 | bs=100 sw=10 sl=64 | 766 | 0.468 | 129,344/152,405/152,405 us | 🔴 +8.2% / 🔴 +62.3% |
| ⚪ | bs=1000 sw=10 sl=64 | 899 | 0.549 | 1,113,225/1,164,754/1,164,754 us | ⚪ within ±5% / 🔴 -29.3% |
Baseline details
Latest main b05b620 from same runner
| config | metric | PR | latest main | 7d avg | Δ latest | Δ 7d |
|---|---|---|---|---|---|---|
| bs=10 sw=10 sl=64 | throughput | 357 tuples/sec | 410 tuples/sec | 962.17 tuples/sec | -12.9% | -62.9% |
| bs=10 sw=10 sl=64 | MB/s | 0.218 MB/s | 0.25 MB/s | 0.587 MB/s | -12.8% | -62.9% |
| bs=10 sw=10 sl=64 | p50 | 27,757 us | 24,555 us | 11,046 us | +13.0% | +151.3% |
| bs=10 sw=10 sl=64 | p95 | 31,533 us | 37,564 us | 13,484 us | -16.1% | +133.9% |
| bs=10 sw=10 sl=64 | p99 | 31,533 us | 37,564 us | 16,626 us | -16.1% | +89.7% |
| bs=100 sw=10 sl=64 | throughput | 766 tuples/sec | 824 tuples/sec | 1,234 tuples/sec | -7.0% | -37.9% |
| bs=100 sw=10 sl=64 | MB/s | 0.468 MB/s | 0.503 MB/s | 0.753 MB/s | -7.0% | -37.9% |
| bs=100 sw=10 sl=64 | p50 | 129,344 us | 119,538 us | 87,952 us | +8.2% | +47.1% |
| bs=100 sw=10 sl=64 | p95 | 152,405 us | 146,597 us | 93,929 us | +4.0% | +62.3% |
| bs=100 sw=10 sl=64 | p99 | 152,405 us | 146,597 us | 103,096 us | +4.0% | +47.8% |
| bs=1000 sw=10 sl=64 | throughput | 899 tuples/sec | 907 tuples/sec | 1,272 tuples/sec | -0.9% | -29.3% |
| bs=1000 sw=10 sl=64 | MB/s | 0.549 MB/s | 0.553 MB/s | 0.777 MB/s | -0.7% | -29.3% |
| bs=1000 sw=10 sl=64 | p50 | 1,113,225 us | 1,098,277 us | 862,437 us | +1.4% | +29.1% |
| bs=1000 sw=10 sl=64 | p95 | 1,164,754 us | 1,190,804 us | 904,996 us | -2.2% | +28.7% |
| bs=1000 sw=10 sl=64 | p99 | 1,164,754 us | 1,190,804 us | 929,784 us | -2.2% | +25.3% |
Raw CSV
config_idx,batch_size,schema_width,string_len,num_batches,total_ms,total_tuples,total_bytes,tuples_per_sec,mb_per_sec,lat_p50_us,lat_p95_us,lat_p99_us
0,10,10,64,20,560.50,200,128000,357,0.218,27757.24,31532.57,31532.57
1,100,10,64,20,2610.26,2000,1280000,766,0.468,129343.79,152404.63,152404.63
2,1000,10,64,20,22253.45,20000,12800000,899,0.549,1113225.08,1164753.74,1164753.74
What changes were proposed in this PR?
A dead GeeseFS mount stays in
/proc/mountsand can still answerstat()from cached attributes, but every read fails withTransport endpoint is not connected.RepositoryMountManager.isFuseMountedand the mounter's_respondsboth counted it as live. So the unit never re-requested the mount, and the operator got an unreadable directory until the unit was recreated.Both checks now require the mount's directory to be listable. The next run then re-requests the mount, and
do_mountreplaces it.Any related issues, documentation, discussions?
Follow-up to #6866 and #6897 (part of #6606).
How was this PR tested?
RepositoryMountManagerSpecandtest_mounter.py. The mounter's dead-mount test (stats fine, listing fails withENOTCONN) fails on the old check.stat()succeeded and listing failed.Was this PR authored or co-authored using generative AI tooling?
Generated-by: Claude Code (Claude Opus 5.5)
🤖 Generated with Claude Code