Skip to content

fix(LakeFS-mount): treat a FUSE mount that cannot be listed as dead - #8832

Open
aicam wants to merge 2 commits into
apache:mainfrom
aicam:fix/dead-fuse-mount
Open

aicam wants to merge 2 commits into
apache:mainfrom
aicam:fix/dead-fuse-mount

Conversation

@aicam

@aicam aicam commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

What changes were proposed in this PR?

A dead GeeseFS mount stays in /proc/mounts and can still answer stat() from cached attributes, but every read fails with Transport endpoint is not connected. RepositoryMountManager.isFuseMounted and the mounter's _responds both 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_mount replaces it.

Any related issues, documentation, discussions?

Follow-up to #6866 and #6897 (part of #6606).

How was this PR tested?

  • New tests in RepositoryMountManagerSpec and test_mounter.py. The mounter's dead-mount test (stats fine, listing fails with ENOTCONN) fails on the old check.
  • Checked both rules against real dead mounts on a live cluster: inside the pod, 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

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>
@github-actions

github-actions Bot commented Oct 3, 2026

Copy link
Copy Markdown
Contributor

Automated Reviewer Suggestions

Based on the git blame history of the changed files, we recommend the following reviewers:

  • No candidates found from git blame history.

@github-actions

github-actions Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

Backport auto-label report

This fix: PR was checked against each actively-supported release branch. A release/* label nominates a backport target; the branch's release manager approving this PR is what sends the fix there. The required Backport Approvals check stays red until every label below is approved, so each manager either approves or removes their own label — which is why the labels left on a merged PR are exactly the branches it reached.

Release branch Analysis
⚠️ release/v1.3 Not labeled automatically — none of the files this PR modifies exist on this branch (bin/mounter/mounter.py, bin/mounter/tests/test_mounter.py, common/workflow-core/src/main/scala/org/apache/texera/amber/core/storage/RepositoryMountManager.scala, common/workflow-core/src/test/scala/org/apache/texera/amber/storage/RepositoryMountManagerSpec.scala). The fix may target code that isn't on this release, or the files were moved/renamed after the branch was cut. Please check and add release/v1.3 by hand if this fix should be backported here — its release manager then has to approve before this PR can merge.
⚠️ release/v1.2 Not labeled automatically — none of the files this PR modifies exist on this branch (bin/mounter/mounter.py, bin/mounter/tests/test_mounter.py, common/workflow-core/src/main/scala/org/apache/texera/amber/core/storage/RepositoryMountManager.scala, common/workflow-core/src/test/scala/org/apache/texera/amber/storage/RepositoryMountManagerSpec.scala). The fix may target code that isn't on this release, or the files were moved/renamed after the branch was cut. Please check and add release/v1.2 by hand if this fix should be backported here — its release manager then has to approve before this PR can merge.

Auto-label run.

@aicam
aicam requested a review from parshimers October 3, 2026 21:55
@aicam aicam self-assigned this Oct 3, 2026

@parshimers parshimers left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is there not some better way than trying to list the files?

@aicam

aicam commented Oct 5, 2026

Copy link
Copy Markdown
Contributor Author

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.

@aicam
aicam enabled auto-merge October 5, 2026 17:57
@codecov-commenter

codecov-commenter commented Oct 6, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 66.66667% with 1 line in your changes missing coverage. Please review.
✅ Project coverage is 92.57%. Comparing base (b05b620) to head (d73a21e).
⚠️ Report is 10 commits behind head on main.

Files with missing lines Patch % Lines
...ra/amber/core/storage/RepositoryMountManager.scala 66.66% 0 Missing and 1 partial ⚠️
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     
Flag Coverage Δ *Carryforward flag
access-control-service 77.38% <ø> (ø)
agent-service 99.16% <ø> (ø) Carriedforward from b05b620
amber 88.09% <66.66%> (-0.01%) ⬇️
computing-unit-managing-service 60.41% <ø> (ø)
config-service 87.37% <ø> (ø)
file-service 81.53% <ø> (ø)
frontend 96.56% <ø> (ø) Carriedforward from b05b620
notebook-migration-service 83.73% <ø> (ø)
pyamber 98.56% <ø> (ø) Carriedforward from b05b620
workflow-compiling-service 74.09% <ø> (ø)

*This pull request uses carry forward flags. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

⚠️ Benchmark changes need a look

🟢 2 better · 🔴 6 worse · ⚪ 7 noise (<±5%) · 0 without baseline

Compared against main b05b620 benchmarked on this same runner, so the delta is largely free of cross-runner hardware noise. The "7d avg" column still reflects the gh-pages dashboard. Treat <±5% as noise unless repeated.

Dashboard · Run

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

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants