Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
178 commits
Select commit Hold shift + click to select a range
6bc3ed9
feat: Align SQL on FHIR run operation and add cross-cutting rejections
johngrimes Jun 21, 2026
5c1434e
feat: Align SQL on FHIR export operation to the spec
johngrimes Jun 21, 2026
f521148
feat: Point SQL on FHIR conformance at spec canonicals; lock in sqlqu…
johngrimes Jun 21, 2026
1d94664
test: Confirm Bulk Data export kick-off body is unaffected by SoF change
johngrimes Jun 21, 2026
47e147b
feat: Read view-export manifest download files from location parts
johngrimes Jun 21, 2026
5f39550
docs: Document SQL on FHIR operation alignment changes
johngrimes Jun 21, 2026
e27927a
test: Update view-export e2e mocks to the spec-shaped manifest
johngrimes Jun 21, 2026
095ca72
fix: Accept a supported _format media type carrying parameters
johngrimes Jun 21, 2026
0b697ab
fix: Allow query parameter placeholders in SQL validation
johngrimes Jun 21, 2026
ce68015
feat: Add the $sqlquery-export operation
johngrimes Jun 21, 2026
f76769e
refactor: Name the async wire contract with an AsyncPattern enum
johngrimes Jun 21, 2026
0a42267
test: Disable all export flags in the all-disabled assertion
johngrimes Jun 21, 2026
064c45b
chore: Raise the server CI timeout to 45 minutes
johngrimes Jun 22, 2026
4cf636d
test: Assert the operation list is populated before checking exclusion
johngrimes Jun 22, 2026
312a66c
fix: Bump Netty to 4.1.135.Final to address transitive CVEs
johngrimes Jun 22, 2026
450f786
fix: Bump org.hl7.fhir.* core libraries to 6.9.10
johngrimes Jun 22, 2026
09b4f29
fix: Upgrade react-router to 7.18.0 to address XSS and DoS advisories
johngrimes Jun 22, 2026
9d40fe7
chore: Bump server version to 3.0.0-SNAPSHOT
johngrimes Jun 22, 2026
fea0ce2
Add dual-role image entrypoint and dispatch test
johngrimes Jun 22, 2026
1ec6a30
Wire dual-role entrypoint into the Docker build profiles
johngrimes Jun 22, 2026
8d7b721
Correct Spark entrypoint reference to the runtime version
johngrimes Jun 22, 2026
c641a58
Merge pull request #2636 from aehrc/dual-role-image
johngrimes Jun 22, 2026
57b1f52
feat: Make cache backend first-byte timeout configurable
johngrimes Jun 25, 2026
1a5aa37
docs: Correct copyright year in cache README
johngrimes Jun 25, 2026
49390a6
feat: Grant driver RBAC permissions to manage executor scratch PVCs
johngrimes Jun 26, 2026
d794187
feat: Add shared SQL on FHIR Library parser and dependency graph model
johngrimes Jun 26, 2026
acd5238
feat: Resolve and execute SQLView dependency graphs
johngrimes Jun 26, 2026
822cf23
test: Cover nested SQLView graphs, diamonds, cycles, and depth
johngrimes Jun 26, 2026
ee3a099
feat: Run and export a SQLView as a top-level resource
johngrimes Jun 26, 2026
80e8207
feat: Require metadata READ to resolve stored views and queries
johngrimes Jun 26, 2026
d58f75f
docs: Document SQLView composition, depth limit, and authorisation
johngrimes Jun 26, 2026
ce0a55d
refactor: Prefer imports over inline fully-qualified names
johngrimes Jun 27, 2026
743a034
test: Add SQLView Library fixtures for the SQL query UI
johngrimes Jun 27, 2026
48e23c2
feat: List stored SQLViews through a shared Library list core
johngrimes Jun 27, 2026
606036d
feat: Surface stored SQLViews in the Select query picker
johngrimes Jun 27, 2026
c7aa599
feat: Hide runtime parameter values when no parameters apply
johngrimes Jun 27, 2026
4c900d1
feat: Reference a SQLView when authoring SQL inline
johngrimes Jun 27, 2026
62fbb54
test: Update SQL query export e2e for the renamed source picker
johngrimes Jun 27, 2026
8f1a246
test: Point inline e2e selectors at the renamed Views editor
johngrimes Jun 27, 2026
94d7531
docs: Note SQLView listing in the SQL query client header
johngrimes Jun 27, 2026
c02ce06
feat: Retain ViewDefinition url and version through encoding
johngrimes Jun 27, 2026
e68d3c0
feat: Resolve SQL on FHIR dependencies by canonical URL
johngrimes Jun 27, 2026
462ff56
feat: Author SQL on FHIR view references by canonical URL in the admi…
johngrimes Jun 27, 2026
58165af
docs: Describe canonical-URL resolution for SQL on FHIR dependencies
johngrimes Jun 27, 2026
52ad991
fix: Use a spaced hyphen in the URL-less source explanation
johngrimes Jun 27, 2026
2b06300
fix: Open sun.util.calendar for local server runs
johngrimes Jun 27, 2026
2d807f2
fix: Show submitted SQL for stored SQL on FHIR queries
johngrimes Jun 28, 2026
e26fb95
fix: Bound the height of the submitted SQL in query results
johngrimes Jun 28, 2026
d4f7704
fix: Truncate long view references in the SQL query summary
johngrimes Jun 28, 2026
776bb51
fix: Validate relation references inside CTE definition bodies
johngrimes Jun 28, 2026
9d4e083
fix: Allow string concatenation in $sqlquery-run
johngrimes Jun 28, 2026
9c1d596
test: Cover ViewDefinition url and version accessors
johngrimes Jun 28, 2026
df656a2
Merge pull request #2639 from aehrc/issue/2638
johngrimes Jun 28, 2026
de39266
fix: Upgrade Jackson to 2.22.0 to resolve security advisories
johngrimes Jun 28, 2026
e51647d
chore: Update core version to 9.9.0-SNAPSHOT
johngrimes Jun 28, 2026
9d7ea97
Update Pathling version for server to 9.9.0-SNAPSHOT
johngrimes Jun 28, 2026
6964abc
refactor: Extract schema drift detection into shared utility
johngrimes Jul 4, 2026
29431b7
fix: Refresh pinned datasets after schema-evolving updates
johngrimes Jul 4, 2026
af75905
feat: Migrate drifted Delta tables at server startup
johngrimes Jul 4, 2026
72ecf58
feat: Serve actionable errors for drifted unmigrated tables
johngrimes Jul 4, 2026
8fb2bb6
docs: Describe startup migration and drift diagnostics
johngrimes Jul 4, 2026
55e3e19
fix: Guard view execution and derived sources against schema drift
johngrimes Jul 4, 2026
4e8a35e
refactor: Deduplicate drift guard delegation logic
johngrimes Jul 4, 2026
99704cf
test: Clear Delta log cache when resetting the test warehouse
johngrimes Jul 5, 2026
067fa4c
fix: Prevent concurrent creates of a new resource type from failing
johngrimes Jul 5, 2026
40f68e8
test: Await async manifest download before teardown
johngrimes Jul 5, 2026
8509206
test: Raise response timeout for sqlquery-export integration tests
johngrimes Jul 5, 2026
b91b1c7
Merge pull request #2643 from aehrc/issue/2642
johngrimes Jul 5, 2026
56b671e
chore: Suppress unexploitable jackson-databind advisory CVE-2026-54515
johngrimes Jul 5, 2026
7e480cb
fix: Upgrade Spring Boot to 3.5.16 to resolve security advisory
johngrimes Jul 5, 2026
3cbae5e
fix: Garbage-collect Spark executor pods when the driver pod is deleted
johngrimes Jul 5, 2026
8071a7a
feat: Add Parquet schema validator for VOID columns
johngrimes Jul 10, 2026
52f253b
feat: Reject VOID columns in synchronous Parquet run
johngrimes Jul 10, 2026
e4b5362
feat: Reject VOID columns in asynchronous Parquet export
johngrimes Jul 10, 2026
4bc7f2f
docs: Document Parquet VOID-column limitation and error
johngrimes Jul 10, 2026
fcc0477
test: Use imports for stream helpers in export executor test
johngrimes Jul 10, 2026
1df3a55
Merge pull request #2658 from aehrc/issue/2657
johngrimes Jul 10, 2026
ac95ca2
feat: Allow DESCRIBE of registered views through $sqlquery-run
johngrimes Jul 10, 2026
68b4b9d
test: Cover DESCRIBE QUERY schema introspection through $sqlquery-run
johngrimes Jul 10, 2026
a88caf0
test: Verify the DESCRIBE rejection matrix at the API boundary
johngrimes Jul 10, 2026
fca66a3
docs: Document the DESCRIBE schema-introspection surface
johngrimes Jul 10, 2026
d971f92
Merge pull request #2659 from aehrc/issue/2651
johngrimes Jul 10, 2026
7ce7bb7
feat: Accept window frames and named windows in $sqlquery-run
johngrimes Jul 14, 2026
96231d1
fix: Validate named-window definition bodies in $sqlquery-run
johngrimes Jul 14, 2026
e0ccde1
docs: Clarify SQL query limits apply to run and export
johngrimes Jul 14, 2026
e7e4aee
test: Cover the analysed-plan walk of surviving named windows
johngrimes Jul 14, 2026
a13d317
Merge pull request #2660 from aehrc/issue/2649
johngrimes Jul 14, 2026
0064d48
feat: Add spark-hadoop-cloud for the S3A magic committer
johngrimes Jul 22, 2026
13f0b57
docs: Document S3A magic committer setup for S3 warehouses
johngrimes Jul 22, 2026
0ae3239
fix: Resolve site dependency vulnerabilities via override pins
johngrimes Jul 22, 2026
90267db
fix: Return clean 401 challenge without creating HTTP sessions
johngrimes Jul 23, 2026
d023118
fix: Exclude servlet API classes from the library-runtime fat jar
johngrimes Jul 23, 2026
bc26286
chore: Remove redundant servlet API version pin
johngrimes Jul 23, 2026
6e575aa
fix: Retain Servlet-5-only classes needed by Spark's Jetty
johngrimes Jul 23, 2026
e236e4f
fix: Add strict recursive delete to the job-directory helper
johngrimes Jul 23, 2026
a4a5828
fix: Write view and SQL export outputs on the warehouse filesystem
johngrimes Jul 23, 2026
ad310ab
fix: Write bulk export outputs on the warehouse filesystem
johngrimes Jul 23, 2026
36d3397
test: Cover export job-directory failure paths
johngrimes Jul 23, 2026
729136e
fix: Install native font libraries for the R build
johngrimes Jul 9, 2026
12b887b
Merge pull request #2668 from aehrc/fix-export-wrong-fs
johngrimes Jul 23, 2026
8e36685
Merge pull request #2667 from aehrc/fix-servlet-401
johngrimes Jul 23, 2026
90841bb
fix: Bump Jackson and Netty to patched versions
johngrimes Jul 23, 2026
c8560fd
fix: Suppress non-exploitable okhttp and ini4j findings
johngrimes Jul 23, 2026
9135eb2
feat: Add derived job status and registry snapshot
johngrimes Jul 24, 2026
4abe6aa
feat: Add system-level \$jobs list operation
johngrimes Jul 24, 2026
ef12711
fix: Enforce job ownership on the delete path
johngrimes Jul 24, 2026
0c162be
feat: Add server-backed jobs page to the admin UI
johngrimes Jul 24, 2026
88cbb00
feat: Add job cancellation to the jobs page
johngrimes Jul 24, 2026
6343df7
docs: Document the jobs operation and ownership rules
johngrimes Jul 24, 2026
bce97e9
fix: Correct jobs authority name and cover ETag skip
johngrimes Jul 24, 2026
3b40fa1
refactor: Extract search parameter map into a shared helper
johngrimes Jul 24, 2026
3f355e3
refactor: Extract shared capability and auth guard for pages
johngrimes Jul 24, 2026
c186aec
refactor: Extract shared job progress indicator
johngrimes Jul 24, 2026
15e8c21
Merge pull request #2670 from aehrc/jobs-listing
johngrimes Jul 24, 2026
b208b21
fix: Bump bulk-export to pick up shared filesystem fix
johngrimes Jul 24, 2026
fdb13ee
fix: Keep the warehouse reachable after a ping and pull import
johngrimes Jul 24, 2026
0b4ab47
fix: Stop the frontend cache truncating bulk data downloads
johngrimes Jul 24, 2026
45e917b
refactor: Lend the server file system to the bulk export client
johngrimes Jul 25, 2026
4c9cad3
fix: Suppress unfixable lz4-java finding blocking the build
johngrimes Jul 25, 2026
12ac080
fix: Resolve UI and site security findings blocking the build
johngrimes Jul 25, 2026
23e0cba
fix: Make ping and pull download tuning configurable
johngrimes Jul 25, 2026
932b2d4
fix: Allow the cache to serve slow readers of bulk data downloads
johngrimes Jul 25, 2026
9d60323
chore: Rebuild to pick up the bulk-export download retry
johngrimes Jul 26, 2026
2295328
feat: Add a shared error callout presentation
johngrimes Jul 27, 2026
e19fb0c
feat: Deliver the admin UI logos as content-hashed assets
johngrimes Jul 27, 2026
ca96b38
fix: Stop the admin UI being pinned to a stale cached bundle
johngrimes Jul 27, 2026
3ffc6be
fix: Report every session expiry, not only the first
johngrimes Jul 27, 2026
62f762d
fix: Report operation failures instead of discarding them
johngrimes Jul 27, 2026
a70a739
fix: Give visible feedback when a login attempt is made
johngrimes Jul 27, 2026
8207b6a
fix: Stop the jobs page fetching before access is permitted
johngrimes Jul 27, 2026
5e425dc
test: Add end-to-end coverage for the login and expiry defects
johngrimes Jul 27, 2026
5c4664a
test: Annotate the admin UI cache test fields for nullability
johngrimes Jul 27, 2026
c062295
Merge pull request #2679 from aehrc/issue/2677
johngrimes Jul 27, 2026
fbfd2ea
fix: Stop an operation failure notifying itself repeatedly
johngrimes Jul 27, 2026
8d8e95f
refactor: Present every error callout the same way
johngrimes Jul 27, 2026
1a2568f
fix: Remove the SQL query row cap and wall-clock timeout
johngrimes Jul 27, 2026
3efb16a
docs: Bring the SQL query documentation into line
johngrimes Jul 27, 2026
0398844
fix: Keep the login button's label visible while it is pending
johngrimes Jul 27, 2026
15922af
test: Tidy fully qualified references in the SQL query tests
johngrimes Jul 27, 2026
d3d847d
fix: Clear the login error when the expiry dialog is raised again
johngrimes Jul 27, 2026
7d4d692
test: Wait for the import cancel request before asserting on it
johngrimes Jul 27, 2026
347ea1a
Merge pull request #2682 from aehrc/issue/2676-login-feedback
johngrimes Jul 27, 2026
92c9e9d
test: Assert export contents across every output file
johngrimes Jul 27, 2026
e777c7d
docs: Warn against building the core from a server release branch
johngrimes Jul 27, 2026
6708572
docs: Fix invalid JSDoc tag in SQL query export result type
johngrimes Jul 27, 2026
6657721
docs: Correct the Ivy cache clearing instructions
johngrimes Jul 27, 2026
32e2ef5
Merge pull request #2681 from aehrc/remove-sql-query-limits
johngrimes Jul 27, 2026
6f572a2
feat: Declare the supported export formats in the CapabilityStatement
johngrimes Jul 27, 2026
a6d191b
Enforce the Admin UI coverage and duplication gates in CI
johngrimes Jul 28, 2026
634ccc5
feat: Add an issue-list form to the shared error callout
johngrimes Jul 28, 2026
ccaaf73
fix: Stop repeating the failure prefix on a failed view run
johngrimes Jul 28, 2026
91b7c95
Prove nothing polls by controlling time rather than sleeping
johngrimes Jul 28, 2026
dfdadd3
fix: Stop job deletion racing the work it cancels
johngrimes Jul 28, 2026
62a47d6
Reject fixed sleeps in the Admin UI end-to-end tests
johngrimes Jul 28, 2026
6c4a001
fix: Cancel a deleted job's Spark work within the request
johngrimes Jul 28, 2026
bee5f63
fix: Report a failed download as a download failure
johngrimes Jul 28, 2026
851cfce
fix: Report a failed job clean-up honestly rather than as an error
johngrimes Jul 28, 2026
a98139a
fix: Report a failed operation once rather than twice
johngrimes Jul 28, 2026
9a44ca7
fix: Allow an untagged job to be removed from the registry
johngrimes Jul 28, 2026
95179e8
docs: Describe how a job cancellation is handled
johngrimes Jul 28, 2026
518160d
Document the e2e sleep convention and the enforced gates
johngrimes Jul 28, 2026
c3e9222
refactor: Present every displayed failure the same way
johngrimes Jul 28, 2026
121e388
test: Give the form tests room to finish under coverage
johngrimes Jul 28, 2026
888b4ec
docs: Record the reporting rule for job failures
johngrimes Jul 28, 2026
c71bbf9
fix: Stop a failed download notifying twice
johngrimes Jul 28, 2026
13f22ff
test: Prove neither export wrapper notifies a job failure
johngrimes Jul 28, 2026
601adbb
fix: Remove a deleted job's output when it left the registry early
johngrimes Jul 28, 2026
044c10f
test: Prove the card tests catch a reinstated notification
johngrimes Jul 28, 2026
8ef36e1
test: Drive the session expiry poll rather than waiting for it
johngrimes Jul 28, 2026
7eb31f9
Merge pull request #2696 from aehrc/issue/2693
johngrimes Jul 28, 2026
c8266cc
Merge pull request #2695 from aehrc/issue/2687
johngrimes Jul 28, 2026
8fd0688
Merge pull request #2694 from aehrc/issue/2688-job-errors
johngrimes Jul 28, 2026
9fa16e9
Merge pull request #2692 from aehrc/issue/2685
johngrimes Jul 28, 2026
3610eb1
Fix styling of cancel button on export job card
johngrimes Jul 29, 2026
dec0749
chore: Update fhir-bulk-java to 1.1.0
johngrimes Jul 30, 2026
08c42fc
test: Expect the poisoned manifest to be rejected on entry
johngrimes Jul 30, 2026
329fc2d
fix: Restore the integration test suite in Docker builds
johngrimes Jul 30, 2026
a163e02
fix: Resolve fresh core snapshots and allow time for integration tests
johngrimes Jul 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
21 changes: 18 additions & 3 deletions .github/actions/setup-r/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,22 @@ runs:
- name: Set up TinyTeX
uses: r-lib/actions/setup-tinytex@v2

# libcurl is required for building the R package documentation.
- name: Install libcurl
# Native libraries required to build the R package and its documentation
# toolchain from source. When the R package cache misses, devtools and
# pkgdown are compiled from source, which pulls in systemfonts, textshaping
# and ragg. Those packages need the font (fontconfig, freetype, harfbuzz,
# fribidi) and image (png, tiff, jpeg) development headers, and libcurl is
# needed for the documentation build.
- name: Install system libraries
shell: bash
run: sudo apt-get install -y libcurl4-openssl-dev
run: |
sudo apt-get update
sudo apt-get install -y \
libcurl4-openssl-dev \
libfontconfig1-dev \
libfreetype-dev \
libharfbuzz-dev \
libfribidi-dev \
libpng-dev \
libtiff-dev \
libjpeg-dev
6 changes: 3 additions & 3 deletions .github/workflows/server-pre-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
pre-release-server:
name: Build and push Docker image
runs-on: ubuntu-latest
timeout-minutes: 30
timeout-minutes: 105
steps:
- name: Checkout code
uses: actions/checkout@v4
Expand Down Expand Up @@ -68,12 +68,12 @@ jobs:
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: |
mvn --batch-mode deploy -PdockerPreRelease -Dmaven.deploy.skip \
mvn --batch-mode --update-snapshots deploy -PdockerPreRelease -Dmaven.deploy.skip \
org.sonarsource.scanner.maven:sonar-maven-plugin:sonar \
-Dsonar.projectKey=aehrc_pathling_server -Dsonar.organization=aehrc \
-Dsonar.host.url=https://sonarcloud.io \
-Dsonar.sarifReportPaths=../trivy-results-server.sarif
timeout-minutes: 30
timeout-minutes: 90

- name: Save test reports
if: always()
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/server-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
name: Build and push Docker image
if: github.event_name == 'workflow_dispatch' || startsWith(github.ref_name, 'server-v')
runs-on: ubuntu-latest
timeout-minutes: 30
timeout-minutes: 105
steps:
- name: Checkout code
uses: actions/checkout@v4
Expand Down Expand Up @@ -65,7 +65,7 @@ jobs:
-Dsonar.projectKey=aehrc_pathling_server -Dsonar.organization=aehrc \
-Dsonar.host.url=https://sonarcloud.io \
-Dsonar.sarifReportPaths=../trivy-results-server.sarif
timeout-minutes: 30
timeout-minutes: 90

- name: Save test reports
if: always()
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/server-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:
test-server:
name: Build and test server
runs-on: ubuntu-latest
timeout-minutes: 30
timeout-minutes: 45
steps:
- name: Checkout code
uses: actions/checkout@v4
Expand Down Expand Up @@ -88,7 +88,7 @@ jobs:
-Dsonar.projectKey=aehrc_pathling_server -Dsonar.organization=aehrc \
-Dsonar.host.url=https://sonarcloud.io \
-Dsonar.sarifReportPaths=trivy-results.sarif
timeout-minutes: 30
timeout-minutes: 45

- name: Save test reports
if: always()
Expand Down
12 changes: 10 additions & 2 deletions .github/workflows/ui-test.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
# Runs the Admin UI quality checks documented in ui/CONTRIBUTING.md. Called by
# both test.yml and pre-release.yml.
#
# Author: John Grimes

name: Test UI

on:
Expand Down Expand Up @@ -27,11 +32,14 @@ jobs:
- name: Lint
run: bun run lint

- name: Check duplication
run: bun run lint:duplication

- name: Build
run: bun run build

- name: Run unit tests
run: bun run test:run
- name: Run unit tests with coverage
run: bun run test:coverage

- name: Install Playwright browsers
# The pinned version must be kept in step with @playwright/test in
Expand Down
30 changes: 24 additions & 6 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -150,16 +150,34 @@ mvn clean install -pl lib/R -am

### Clearing the Ivy cache

When rebuilding after making changes to upstream modules, you may need to clear
the local Ivy cache before the changes will be picked up by the Python and R
libraries. The Ivy cache is typically located at `~/.ivy2/cache`.

To clear the cache:
When rebuilding after making changes to upstream modules, you need to clear the
local Ivy state before the changes will be picked up by the Python and R
libraries.

Spark resolves `--packages` through Ivy, which keeps two directories per Ivy
version: `cache` (the resolved module metadata and artifacts) and `jars` (the
jars retrieved for the run). Both must be cleared. Removing only `cache` leaves
`au.csiro.pathling_library-runtime-<version>-SNAPSHOT.jar` in `jars`, and
because the SNAPSHOT filename never changes, Ivy reports `0 artifacts copied, N
already retrieved` and silently reuses the stale build. The tests still run and
pass; they just do not exercise the new code.

Spark also uses a home directory suffixed with its bundled Ivy version (for
example `~/.ivy2.5.2`) in addition to the conventional `~/.ivy2`, so both trees
need to be cleared:

```bash
rm -rf ~/.ivy2/cache
rm -rf ~/.ivy2/cache ~/.ivy2/jars ~/.ivy2.5.2/cache ~/.ivy2.5.2/jars
mkdir -p ~/.ivy2/cache ~/.ivy2/jars ~/.ivy2.5.2/cache ~/.ivy2.5.2/jars
```

Run `ls -d ~/.ivy2*` to confirm which version-suffixed directories exist on your
machine, as the suffix follows the Spark version in use.

The `mkdir` step matters. With the `jars` directory missing, Ivy fails to
retrieve `delta-spark`, `delta-storage` and `antlr4-runtime` from the local
Maven resolver, and the run fails with `JAVA_GATEWAY_EXITED`.

After clearing the cache, rebuild the libraries:

```bash
Expand Down
2 changes: 1 addition & 1 deletion benchmark/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
<parent>
<groupId>au.csiro.pathling</groupId>
<artifactId>pathling</artifactId>
<version>9.8.0</version>
<version>9.9.0-SNAPSHOT</version>
</parent>
<artifactId>benchmark</artifactId>
<packaging>jar</packaging>
Expand Down
6 changes: 5 additions & 1 deletion deployment/cache/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ based upon the deployment:

- `PATHLING_HOST`: The host name of the Pathling server.
- `PATHLING_PORT`: The port number exposed by the Pathling server.
- `PATHLING_FIRST_BYTE_TIMEOUT`: The maximum time to wait for the first byte of
a backend response, expressed as a Varnish duration (e.g. `60s`, `10m`). Raise
this above the Varnish default of `60s` to accommodate long-running
synchronous Pathling queries.

Copyright © 2065, Commonwealth Scientific and Industrial Research Organisation
Copyright © 2025, Commonwealth Scientific and Industrial Research Organisation
(CSIRO) ABN 41 687 119 230. Licensed under the Apache License, Version 2.0.
2 changes: 1 addition & 1 deletion deployment/cache/chart/Chart.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ name: pathling-cache
description: A Varnish-based frontend cache optimised for use with Pathling Server
icon: https://raw.githubusercontent.com/aehrc/pathling/main/media/logo-icon-colour-detail.svg
type: application
version: 1.0.0
version: 1.1.0
maintainers:
- name: John Grimes
email: John.Grimes@csiro.au
Expand Down
27 changes: 14 additions & 13 deletions deployment/cache/chart/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,19 +26,20 @@ helm install my-cache ./chart \

## Configuration

| Parameter | Description | Default |
| ------------------------------- | ------------------------------------------ | ------------------------------------- |
| `pathlingCache.image` | Container image to use | `ghcr.io/aehrc/pathling-cache:latest` |
| `pathlingCache.imagePullPolicy` | Image pull policy | `IfNotPresent` |
| `pathlingCache.replicas` | Number of replicas to deploy | `1` |
| `pathlingCache.pathlingHost` | Hostname of the Pathling server (required) | `~` |
| `pathlingCache.pathlingPort` | Port of the Pathling server (required) | `~` |
| `pathlingCache.service.type` | Kubernetes service type | `ClusterIP` |
| `pathlingCache.service.port` | Service port | `80` |
| `pathlingCache.resources` | CPU/memory resource requests and limits | `{}` |
| `pathlingCache.tolerations` | Pod tolerations | `[]` |
| `pathlingCache.affinity` | Pod affinity rules | `{}` |
| `pathlingCache.nodeSelector` | Node selector labels | `{}` |
| Parameter | Description | Default |
| -------------------------------- | --------------------------------------------------------- | ------------------------------------- |
| `pathlingCache.image` | Container image to use | `ghcr.io/aehrc/pathling-cache:latest` |
| `pathlingCache.imagePullPolicy` | Image pull policy | `IfNotPresent` |
| `pathlingCache.replicas` | Number of replicas to deploy | `1` |
| `pathlingCache.pathlingHost` | Hostname of the Pathling server (required) | `~` |
| `pathlingCache.pathlingPort` | Port of the Pathling server (required) | `~` |
| `pathlingCache.firstByteTimeout` | Backend first-byte timeout (Varnish duration, e.g. `10m`) | `60s` |
| `pathlingCache.service.type` | Kubernetes service type | `ClusterIP` |
| `pathlingCache.service.port` | Service port | `80` |
| `pathlingCache.resources` | CPU/memory resource requests and limits | `{}` |
| `pathlingCache.tolerations` | Pod tolerations | `[]` |
| `pathlingCache.affinity` | Pod affinity rules | `{}` |
| `pathlingCache.nodeSelector` | Node selector labels | `{}` |

## Examples

Expand Down
2 changes: 2 additions & 0 deletions deployment/cache/chart/templates/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ spec:
value: {{ required "pathlingCache.pathlingHost is required" .Values.pathlingCache.pathlingHost | quote }}
- name: PATHLING_PORT
value: {{ required "pathlingCache.pathlingPort is required" .Values.pathlingCache.pathlingPort | quote }}
- name: PATHLING_FIRST_BYTE_TIMEOUT
value: {{ .Values.pathlingCache.firstByteTimeout | quote }}
livenessProbe:
tcpSocket:
port: http
Expand Down
5 changes: 5 additions & 0 deletions deployment/cache/chart/values.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@
"type": ["integer", "null"],
"description": "Port of the Pathling server to cache (required)"
},
"firstByteTimeout": {
"type": "string",
"description": "Maximum time the cache waits for the first byte of a backend response, as a Varnish duration (e.g. '60s', '10m')",
"default": "60s"
},
"service": {
"type": "object",
"description": "Kubernetes service configuration",
Expand Down
5 changes: 5 additions & 0 deletions deployment/cache/chart/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@ pathlingCache:
pathlingHost: ~
pathlingPort: ~

# Maximum time the cache waits for the first byte of a backend response,
# expressed as a Varnish duration (e.g. "60s", "10m"). Raise this when
# synchronous Pathling queries take longer than the Varnish default of 60s.
firstByteTimeout: "60s"

service:
type: "ClusterIP"
port: 80
Expand Down
31 changes: 31 additions & 0 deletions deployment/cache/default.vcl
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,30 @@ import std;
backend default {
.host = "${PATHLING_HOST}";
.port = "${PATHLING_PORT}";
// Maximum time to wait for the first byte of the backend response. Raised
// above the Varnish default of 60s to accommodate long-running synchronous
// Pathling queries.
.first_byte_timeout = ${PATHLING_FIRST_BYTE_TIMEOUT};
}

sub vcl_recv {
// Bulk-data file downloads ($result) stream large NDJSON bodies to streaming
// clients such as the $import-pnp downloader. The frontend cache must not
// gzip, buffer, or cache these: on a cache miss Varnish otherwise serves an
// on-the-fly-gzipped, chunked, streamed response that is closed mid-body when
// the client reads in bursts (paced by its own downstream writes), truncating
// the download. Bypass the cache entirely so the response streams straight
// through with the backend's Content-Length.
if (req.url ~ "/\$result") {
// These clients read in bursts, stalling for as long as it takes to write
// each block to their own storage, which can exceed the default one minute
// allowed for sending to a client that is not reading. Without this, the
// connection is closed part-way through a large file and the download fails
// with a premature end of message body.
set sess.idle_send_timeout = 30m;
set sess.send_timeout = 2h;
return (pass);
}
if (req.http.Cache-Control ~ "(private|no-cache|no-store)" || req.http.Pragma == "no-cache") {
return (pass);
}
Expand All @@ -20,6 +41,16 @@ sub vcl_req_authorization {
}

sub vcl_backend_response {
// Never cache or gzip bulk-data file downloads (see vcl_recv). Disabling gzip
// lets the backend Content-Length pass through, so the body is delivered with
// a fixed length rather than chunked encoding, which is robust to the bursty,
// idle-gap read pattern of streaming download clients.
if (bereq.url ~ "/\$result") {
set beresp.uncacheable = true;
set beresp.do_gzip = false;
return (deliver);
}

// Respect backend cache-control headers that indicate the response should not be cached.
if (beresp.http.Cache-Control ~ "(no-cache|no-store|private)") {
set beresp.uncacheable = true;
Expand Down
8 changes: 8 additions & 0 deletions deployment/helm/pathling/templates/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,14 @@ spec:
value: "7078"
- name: spark.driver.bindAddress
value: 0.0.0.0
# In client mode, Spark only sets an ownerReference on executor
# pods when it knows the driver pod's name. This allows Kubernetes
# garbage collection to remove executor pods (and their on-demand
# PVCs) when the driver pod is deleted, e.g. on rollout restart.
- name: spark.kubernetes.driver.pod.name
valueFrom:
fieldRef:
fieldPath: metadata.name
{{- range $configKey, $configValue := .Values.pathling.config }}
- name: {{ $configKey }}
value: {{ $configValue | quote }}
Expand Down
5 changes: 5 additions & 0 deletions deployment/helm/pathling/templates/role.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@ rules:
- apiGroups: [""]
resources: ["pods", "services", "configmaps"]
verbs: ["create", "get", "list", "watch", "delete"]
# Allow the driver to provision and remove the dynamically created scratch
# volumes used for executor local storage (claimName OnDemand).
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["create", "get", "list", "watch", "delete"]
- apiGroups: [""]
resources: ["pods/log"]
verbs: ["get", "list", "watch"]
Expand Down
2 changes: 1 addition & 1 deletion encoders/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
<parent>
<groupId>au.csiro.pathling</groupId>
<artifactId>pathling</artifactId>
<version>9.8.0</version>
<version>9.9.0-SNAPSHOT</version>
</parent>
<artifactId>encoders</artifactId>
<packaging>jar</packaging>
Expand Down
Loading
Loading