Skip to content

feat(dataset-mount): mount datasets onto a computing unit#6896

Open
aicam wants to merge 2 commits into
apache:mainfrom
aicam:feat/mount-B1-platform
Open

feat(dataset-mount): mount datasets onto a computing unit#6896
aicam wants to merge 2 commits into
apache:mainfrom
aicam:feat/mount-B1-platform

Conversation

@aicam

@aicam aicam commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

What changes were proposed in this PR?

Add per-computing-unit dataset mounting on top of the mount infrastructure (#6866) — the platform step of the dataset-mounting feature (#6606).

A user can mount / list / unmount a dataset version on a running computing unit. The platform asks that CU's node mounter to perform the mount and reports the in-pod path back; nothing consumes the mount yet — that is the follow-up Python-UDF PR.

  • Per-computing-unit mount APIGET/POST/DELETE /computing-unit/{cuid}/mounts (ComputingUnitManagingResource), backed by a credential-free MounterClient that talks to the CU's node mounter over HTTP. Authorization stays in file-service via the pod's JWT — no credential enters the platform path.
  • FileResolver — resolve a dataset path to (repo, versionHash) and back, so a mount is shown to the user as /owner/dataset/version.
  • "Mount datasets into computing unit" UI — a per-CU modal, opened from the computing-unit selector, to mount / list / unmount datasets.

Any related issues, documentation, discussions?

Closes #6863 · part of #6606 · builds on #6866.

How was this PR tested?

  • sbt ComputingUnitManagingService/Test/compile green (main + test).
  • MounterClientSpec exercises mount / list / unmount against a stub node-mounter HTTP server, asserting the request shape and non-2xx error handling.
  • Validated end-to-end on a single-node minikube: mounting a dataset version onto a CU via the modal, listing it, and unmounting it.

Was this PR authored or co-authored using generative AI tooling?

Generated-by: Claude Opus 4.8

aicam and others added 2 commits July 24, 2026 14:03
Perform the FUSE mount for dataset repositories outside the (unprivileged)
computing-unit pod. A per-node privileged `texera-mounter` DaemonSet runs
GeeseFS on the pod's behalf and the read-only mount is exposed back into
the pod via mount propagation, scoped to that computing unit. A
JWT-authenticated S3 proxy in file-service fronts the LakeFS S3 gateway:
it verifies the pod's JWT, checks the user's read access, and re-signs to
LakeFS with credentials held only server-side, so no global credential
ever enters the pod.

- `texera-mounter` DaemonSet: mounter.py (+ tests), dockerfile, helm daemonset/rbac/values.
- Unprivileged CU pod + mount-propagation wiring (KubernetesClient) and mounter config/env.
- File-service JWT S3 proxy (S3ProxyServlet).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H27sHgS29u2JcLYPPR6Hdx
Add per-computing-unit dataset mounting on top of the mount
infrastructure. A user can mount / list / unmount a dataset version on a
running computing unit; the platform asks that CU's node mounter to
perform the mount and reports the in-pod path back.

- ComputingUnitManagingResource: GET/POST/DELETE
  /computing-unit/{cuid}/mounts, backed by a credential-free MounterClient
  that talks to the node mounter over HTTP.
- FileResolver: resolve a dataset path to (repo, versionHash) and back,
  so mounts can be shown to the user as /owner/dataset/version.
- "Mount datasets into computing unit" UI on the computing-unit selector.

At this point datasets can be mounted onto a CU but are not yet consumed
by any operator; that follows in the Python-UDF integration.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H27sHgS29u2JcLYPPR6Hdx
@github-actions github-actions Bot added feature frontend Changes related to the frontend GUI infra common platform Non-amber Scala service paths labels Jul 25, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Automated Reviewer Suggestions

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

  • Contributors with relevant context: @Ma77Ball, @Yicong-Huang, @eugenegujing
    You can notify them by mentioning @Ma77Ball, @Yicong-Huang, @eugenegujing in a comment.

@codecov-commenter

codecov-commenter commented Jul 25, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 18.81919% with 220 lines in your changes missing coverage. Please review.
✅ Project coverage is 82.54%. Comparing base (f02dd2f) to head (d4f0f3a).
⚠️ Report is 11 commits behind head on main.

Files with missing lines Patch % Lines
...rg/apache/texera/service/util/S3ProxyServlet.scala 5.79% 65 Missing ⚠️
...rvice/resource/ComputingUnitManagingResource.scala 0.00% 57 Missing ⚠️
...ount-modal/computing-unit-mount-modal.component.ts 9.09% 39 Missing and 1 partial ⚠️
...nt-modal/computing-unit-mount-modal.component.html 0.00% 25 Missing ⚠️
.../apache/texera/service/util/KubernetesClient.scala 4.00% 24 Missing ⚠️
...org/apache/texera/service/util/MounterClient.scala 87.87% 0 Missing and 4 partials ⚠️
...g-unit/workflow-computing-unit-managing.service.ts 0.00% 3 Missing ⚠️
.../scala/org/apache/texera/service/FileService.scala 0.00% 1 Missing ⚠️
...power-button/computing-unit-selection.component.ts 50.00% 1 Missing ⚠️

❌ Your patch status has failed because the patch coverage (18.81%) is below the target coverage (60.00%). You can increase the patch coverage or adjust the target coverage.

Additional details and impacted files
@@             Coverage Diff              @@
##               main    #6896      +/-   ##
============================================
+ Coverage     77.30%   82.54%   +5.23%     
+ Complexity     3524     2354    -1170     
============================================
  Files          1161      896     -265     
  Lines         45922    37881    -8041     
  Branches       5101     3992    -1109     
============================================
- Hits          35501    31268    -4233     
+ Misses         8840     5473    -3367     
+ Partials       1581     1140     -441     
Flag Coverage Δ *Carryforward flag
access-control-service 70.00% <ø> (ø)
agent-service 76.76% <ø> (ø) Carriedforward from ddf160e
amber 85.90% <100.00%> (+16.80%) ⬆️ Carriedforward from ddf160e
computing-unit-managing-service 21.82% <26.08%> (+1.32%) ⬆️
config-service 66.66% <ø> (ø)
file-service 59.49% <5.71%> (-7.72%) ⬇️
frontend 82.37% <12.65%> (-0.21%) ⬇️
notebook-migration-service 78.94% <ø> (ø)
pyamber 92.15% <ø> (ø) Carriedforward from ddf160e
workflow-compiling-service 55.14% <ø> (ø)

*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

Copy link
Copy Markdown
Contributor

⚠️ Benchmark changes need a look

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

Compared against main 57d4dba 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 390 0.238 24,720/36,464/36,464 us 🔴 +9.7% / 🔴 +119.7%
🟢 bs=100 sw=10 sl=64 815 0.497 121,565/149,291/149,291 us 🟢 -6.2% / 🔴 +36.8%
bs=1000 sw=10 sl=64 919 0.561 1,083,463/1,139,503/1,139,503 us ⚪ within ±5% / 🔴 +8.9%
Baseline details

Latest main 57d4dba from same runner

config metric PR latest main 7d avg Δ latest Δ 7d
bs=10 sw=10 sl=64 throughput 390 tuples/sec 416 tuples/sec 754.55 tuples/sec -6.3% -48.3%
bs=10 sw=10 sl=64 MB/s 0.238 MB/s 0.254 MB/s 0.461 MB/s -6.3% -48.3%
bs=10 sw=10 sl=64 p50 24,720 us 22,530 us 12,816 us +9.7% +92.9%
bs=10 sw=10 sl=64 p95 36,464 us 34,386 us 16,594 us +6.0% +119.7%
bs=10 sw=10 sl=64 p99 36,464 us 34,386 us 19,806 us +6.0% +84.1%
bs=100 sw=10 sl=64 throughput 815 tuples/sec 811 tuples/sec 969.38 tuples/sec +0.5% -15.9%
bs=100 sw=10 sl=64 MB/s 0.497 MB/s 0.495 MB/s 0.592 MB/s +0.4% -16.0%
bs=100 sw=10 sl=64 p50 121,565 us 117,400 us 103,584 us +3.5% +17.4%
bs=100 sw=10 sl=64 p95 149,291 us 159,118 us 109,097 us -6.2% +36.8%
bs=100 sw=10 sl=64 p99 149,291 us 159,118 us 117,304 us -6.2% +27.3%
bs=1000 sw=10 sl=64 throughput 919 tuples/sec 937 tuples/sec 1,004 tuples/sec -1.9% -8.4%
bs=1000 sw=10 sl=64 MB/s 0.561 MB/s 0.572 MB/s 0.613 MB/s -1.9% -8.4%
bs=1000 sw=10 sl=64 p50 1,083,463 us 1,066,430 us 1,002,357 us +1.6% +8.1%
bs=1000 sw=10 sl=64 p95 1,139,503 us 1,124,801 us 1,046,463 us +1.3% +8.9%
bs=1000 sw=10 sl=64 p99 1,139,503 us 1,124,801 us 1,073,661 us +1.3% +6.1%
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,512.93,200,128000,390,0.238,24719.60,36464.37,36464.37
1,100,10,64,20,2454.36,2000,1280000,815,0.497,121564.67,149290.87,149290.87
2,1000,10,64,20,21753.03,20000,12800000,919,0.561,1083462.81,1139502.72,1139502.72

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

Labels

common feature frontend Changes related to the frontend GUI infra platform Non-amber Scala service paths

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Per-computing-unit dataset mounting

2 participants