Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
128 commits
Select commit Hold shift + click to select a range
a958196
Clean up REFERENCE.md by removing legacy content
pbuncic Jun 19, 2026
1c156b7
REFERENCE.md: correct technical facts per review
Jun 24, 2026
e3a932b
REFERENCE.md: complete catalog schema, flag bits, and REST API tables…
Jun 25, 2026
45d582e
prepub: add optional --gateway-root-merge commit path (A/B, default off)
Jun 25, 2026
491444f
Revert "prepub: add optional --gateway-root-merge commit path (A/B, d…
pbuncic Jun 25, 2026
32497b0
lease: target dedicated gateway graft endpoint for DirectGraft
vvolkl Jul 1, 2026
149f053
add ci
vvolkl Jul 4, 2026
7be1073
prepub: add POST /api/v1/reserve for fail-fast namespace reservation
pbuncic Jul 11, 2026
93ad6fd
prepub: clean 'already published' failure for duplicate publishes
pbuncic Jul 11, 2026
c1324ad
prepub: serialize-until-published barrier (absorb stratum0 lag)
pbuncic Jul 11, 2026
36e88c2
prepub: hold commit lock across parent-dir + content commit
pbuncic Jul 12, 2026
079b287
prepub: add cvmfsdescriptor — ingestsql descriptor emitter (ADR-0007 …
pbuncic Jul 12, 2026
e89af19
prepub: buildset accumulator + finalize for coarse publish (ADR-0007 …
pbuncic Jul 12, 2026
57007f7
prepub: wire coarse publish into orchestrator + finalize endpoint (AD…
pbuncic Jul 12, 2026
0904bee
test(prepub): fix applyFileConfig call — pass chunk min/avg/max
pbuncic Jul 12, 2026
2503f43
buildset: emit intermediate ancestor dirs so multi-package builds ing…
pbuncic Jul 12, 2026
4835a29
buildset+cmd: handle '.' root entry; add prepub-finalize host CLI (AD…
pbuncic Jul 12, 2026
20922ee
prepub: finalize-as-a-job — publish a build in one commit via /jobs (…
pbuncic Jul 12, 2026
e749de5
prepub: --ingest-swissknife/--ingest-config-prefix/--ingest-env flags…
pbuncic Jul 12, 2026
fe6ad40
docs(adr): 0006 gateway-authoritative-catalog, 0007 descriptor-based …
pbuncic Jul 12, 2026
c7e391b
Removing adr
pbuncic Jul 12, 2026
4606696
docs(reference): §36 coarse publish — build accumulate + finalize (AD…
pbuncic Jul 12, 2026
5ae573d
fix(cvmfscatalog): name nested-root mountpoint when tar has no root dir
pbuncic Jul 12, 2026
68b346e
fix(buildset): root the coarse lease at the first path component
pbuncic Jul 13, 2026
f52fed4
prepub: default to fixed 24 MiB chunking (coarse publish is the default)
pbuncic Jul 13, 2026
0b3bed4
prepub: make Stratum 1 cache pre-warming opt-in (--prewarm), off by d…
pbuncic Jul 13, 2026
8d7ed82
prepub: enforce CVMFS publish-namespace containment
pbuncic Jul 16, 2026
c334d43
security: harden local-mode extraction + API/OIDC from the pre-releas…
pbuncic Jul 22, 2026
49c2ede
finalize: scratch on the spool volume; log ingestsql output on failure
pbuncic Jul 26, 2026
a8c61fd
finalize: pre-flight CAS existence check before committing catalogs
pbuncic Jul 26, 2026
7c2cd91
descriptor: fix compressed/internal encoding; declare the chunk grid
pbuncic Jul 26, 2026
a87eb43
receiver: size the pull HTTP transport for the worker pool
pbuncic Jul 26, 2026
ebd1e4a
Revert "descriptor: fix compressed/internal encoding; declare the chu…
pbuncic Jul 26, 2026
d3e8382
coarse publish: push each package's objects to the repository (ADR-00…
pbuncic Jul 26, 2026
ea9b811
Revert "coarse publish: push each package's objects to the repository"
pbuncic Jul 26, 2026
7e921e4
catalog: nested_catalogs.size must be the UNCOMPRESSED database size
pbuncic Jul 26, 2026
fa5a65d
catalog: satisfy the three remaining cvmfs_swissknife check rules
pbuncic Jul 27, 2026
7c2e048
catalog: fix the link count of a split catalog's own root entry
pbuncic Jul 27, 2026
1eccc60
catalog: match split roots to their transition point; no marker for d…
pbuncic Jul 27, 2026
20e252a
fix coarse publish: files were external, mis-flagged and bare-keyed
pbuncic Jul 27, 2026
bd87ac9
cas: implement the S3 backend the docs already promised
pbuncic Jul 27, 2026
ee55c8b
fix defects found reviewing 20e252a and bd87ac9
pbuncic Jul 27, 2026
af7d6dc
install.sh: add an 'update' action that preserves configuration
pbuncic Jul 27, 2026
4cadaab
go.mod: smithy-go is a direct dependency
pbuncic Jul 27, 2026
52a170e
s3: allow 0640 on the S3 config; name config keys in the setup error
pbuncic Jul 27, 2026
0fb9fae
probe: make the CAS probe read-only on S3, and use a valid CAS key
pbuncic Jul 27, 2026
e9dbc3d
pipeline: make the compress worker count tunable; cap service memory
pbuncic Jul 28, 2026
7a5b3d7
pipeline: spill large tar entries to disk instead of buffering the pa…
pbuncic Jul 28, 2026
ebc16c3
pipeline: stream compression so peak memory follows the grid, not the…
pbuncic Jul 28, 2026
132a3e1
api: release the producer at upload, not at publish
pbuncic Jul 28, 2026
771c35e
api: let a job choose its publish path and whether to pre-warm
pbuncic Jul 28, 2026
9143dd6
api: support running the local and ingest publish paths together
pbuncic Jul 28, 2026
40c8d16
docs: runbook for moving prepub off the gateway node
pbuncic Jul 28, 2026
a5906dc
gateway: allow a plaintext gateway URL on a trusted network
pbuncic Jul 28, 2026
2e93610
api: sign requests instead of sending the token (ADR-0008 D3, T1)
pbuncic Jul 28, 2026
f8f9d3e
docs: step-by-step runbook for a new prepub node
pbuncic Jul 28, 2026
e9f85f3
config: make the coarse-publish finalize configurable, and say when i…
pbuncic Jul 29, 2026
ceb5653
gitignore: also ignore archives and copied CVMFS config trees
pbuncic Jul 29, 2026
c7b3a3f
httpsig: interop test against the bits publish client
pbuncic Jul 30, 2026
9377eb5
api: bind signed bodies by route, not by Content-Type
pbuncic Jul 30, 2026
3f0d272
api: size the signed-body cap per route; quieten the binding backstop
pbuncic Jul 30, 2026
4092ace
prepub: make a stalled publisher diagnosable, and bound what can stall
pbuncic Jul 30, 2026
03403ed
prepub: bound the tar prefetch, which ran outside the job semaphore
pbuncic Jul 30, 2026
cc1535b
prepub: an operator restart must not spend a job's failure budget
pbuncic Jul 30, 2026
b5f58ac
prepub: charge the prefetch budget by tar size, not by scan count
pbuncic Jul 30, 2026
bba2ea6
prepub: allow the tar look-ahead to be turned off for slow storage
pbuncic Jul 30, 2026
28549d0
prepub: revert --job-timeout to disabled; a wall clock cannot see a s…
pbuncic Jul 31, 2026
5968fb1
prepub: charge job admission by tar size so large packages serialise
pbuncic Jul 31, 2026
38af51f
lease/ingest: create the parent directory chain before publishing
pbuncic Jul 31, 2026
b09c420
lease/ingest: a mountless publisher is skipped, not failed
pbuncic Aug 10, 2026
1505c76
orchestrator: re-derive TarPath before commit, for every backend
pbuncic Aug 10, 2026
2361bb3
api: reject a job path that is not repository-relative
pbuncic Aug 10, 2026
a74e6eb
lease: kill the whole cvmfs_server process group on cancel
pbuncic Aug 11, 2026
a36ff49
lease: fix three defects found reviewing a74e6eb
pbuncic Aug 11, 2026
4f20512
lease: make the interrupted-publish class deterministic; detach rollb…
pbuncic Aug 11, 2026
8bc05d6
ingest: per-job --direct-s3
pbuncic Aug 11, 2026
5d219b2
cas/s3: size the S3 keep-alive pool to the pipeline's concurrency
pbuncic Aug 12, 2026
60e0e35
lease: collect the object list over an inherited pipe
pbuncic Aug 12, 2026
36d58ad
api: accept object_list on the ingest path
pbuncic Aug 12, 2026
501881a
api: stop two submitJob tests racing the job goroutine
pbuncic Aug 13, 2026
86d1895
cas: promote a staged object prefix into the CAS, server-side
pbuncic Aug 13, 2026
ae65d67
api: accept staged-publish fields (staging_prefix, catalog_hash)
pbuncic Aug 13, 2026
6ead2e2
api: publish a staged job by promoting and grafting
pbuncic Aug 13, 2026
0f685dc
api: create parent directories for a staged publish
pbuncic Aug 13, 2026
5550819
api: promote staged objects before taking the lease and the lock
pbuncic Aug 13, 2026
f2eb51e
api: apply the serialize-until-published barrier to staged jobs
pbuncic Aug 13, 2026
1e8065e
api: record what a staged publish moved
pbuncic Aug 14, 2026
1fab8c0
ingest: delete a published subtree, so a conflict can be remediated
pbuncic Aug 15, 2026
9e6b321
api: replace an already published path on conflict, once, when asked
pbuncic Aug 15, 2026
f2b7bff
measure: one structured record per publish, and the run summary
pbuncic Aug 15, 2026
8ca289a
ingest: report what only the backend knows about a publish
pbuncic Aug 15, 2026
5564bb1
api: record every publish, and serve the records
pbuncic Aug 15, 2026
7a625fd
api: build_id is the run's identity; coarse is a separate decision
pbuncic Aug 15, 2026
fca7af9
prepub: make the staged-path promote concurrency configurable
pbuncic Aug 16, 2026
f63fcdc
api,lease: replace_on_conflict on the staged publish path
pbuncic Aug 18, 2026
42b61c3
api: make the measurements endpoint public (no auth)
pbuncic Aug 20, 2026
80ce38b
prepub: default the tuning knobs from env (.env-driven)
pbuncic Aug 20, 2026
e3a7a96
prepub: log a publisher-tuning banner at startup
pbuncic Aug 20, 2026
5c58320
prepub: also default min/max-concurrent-jobs from env
pbuncic Aug 20, 2026
efbf0c3
Fail closed on OIDC issuers without an audience (security review H3)
pbuncic Sep 1, 2026
3c067fa
Require per-node broker keys; receivers never hold the master (H2)
pbuncic Sep 1, 2026
31b3f38
Rename PREPUB_NODE_KEY -> S1_NODE_KEY
pbuncic Sep 1, 2026
27fa8d5
LRU eviction for the IP rate limiter (security review M3)
pbuncic Sep 1, 2026
bacfd27
jobs list: include accumulated (coarse) jobs; omit unset timestamps
pbuncic Sep 29, 2026
421e194
published endpoint: is a path published, and by which build hash
pbuncic Sep 29, 2026
0a55fb1
install.sh: --user and --spool-dir; keep the installed unit's user
pbuncic Sep 30, 2026
079e0ea
ingest: create missing parents through the gateway on a mountless host
pbuncic Sep 30, 2026
6d02132
ingest: leave missing parents to the gateway on a mountless host
pbuncic Sep 30, 2026
84a952c
prepub: configurable tar limit, spool free-space floor, drop publishe…
pbuncic Oct 1, 2026
696794b
prepub: skip a job published since submission; no second catalog on a…
pbuncic Oct 1, 2026
0fa4cb5
prepub: retry accepted jobs until published or permanently failed
pbuncic Oct 1, 2026
d846426
prepub: export spool job states and host load, memory, spool disk
pbuncic Oct 1, 2026
d937a55
api: name the backend in the no-pipeline log line
pbuncic Oct 3, 2026
f764288
Drop gofmt backup files; interop test reads fields_digest({})
pbuncic Oct 3, 2026
203d585
Merge remote-tracking branch 'origin/master' into feature/adr-0011-st…
pbuncic Oct 3, 2026
7827523
Drop internal design-plan references from code and help texts
pbuncic Oct 3, 2026
4ff7d0e
Remove unwired distribution code; fix receiver pull and flags
pbuncic Oct 3, 2026
5dc5772
docs: rewrite README, INSTALL and REFERENCE for the release
pbuncic Oct 3, 2026
e1b54ea
Harden publisher and receiver for the release
pbuncic Oct 3, 2026
b23f3b8
Pre-warm from the ingest object list; opt-in on node and job
pbuncic Oct 4, 2026
dd3d03b
prepub: replace only another build's content, when the job asks
pbuncic Oct 5, 2026
9dcd7e5
prepub: lock_wait_s measurement and a published-catalog cache
pbuncic Oct 5, 2026
553b4a3
prepub: timeline of cvmfs_server output, precheck_s and ancestors_s
pbuncic Oct 6, 2026
91de31f
prepub: one S3 config for the store and the direct-S3 ingest
pbuncic Oct 6, 2026
e8a05b8
install.sh: register with the gateway, deduce user and S3 source, res…
pbuncic Oct 6, 2026
2360924
measure: record host, direct_s3 and object_list per publish
pbuncic Oct 7, 2026
4c14332
install.sh: write CVMFS_S3_REPO_ALIAS, the prefix the direct-S3 inges…
pbuncic Oct 7, 2026
6210c26
POST /api/v1/published/files: batch-read published .meta.json/.bits-v…
pbuncic Oct 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 72 additions & 0 deletions .github/workflows/gateway-publish.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# Integration test: publish through a real cvmfs_gateway.
#
# Builds a mountless cvmfs_gateway + cvmfs_receiver from cvmfs@devel, backed by
# S3 (Garage), and drives a full publish through cvmfs-prepub in gateway mode.
# This is the only test that exercises the live lease → payload → commit/graft
# path against the actual gateway; the Go unit tests only cover the client side.
#
# It is heavy (builds cvmfs from source), so it runs on demand and on pull
# requests that touch the gateway client or the fixtures — not on every push.

name: gateway-publish

on:
workflow_dispatch:
inputs:
cvmfs_ref:
description: "cvmfs git ref to build the gateway from"
required: false
default: "devel"
pull_request:
paths:
- "internal/lease/**"
- "internal/api/**"
- "cmd/prepub/**"
- "test/integration/gateway/**"
- ".github/workflows/gateway-publish.yml"
push:
branches:
- "gateway-dedicated-graft-endpoint-test"

# A gateway build from source is expensive; don't pile up concurrent runs.
concurrency:
group: gateway-publish-${{ github.ref }}
cancel-in-progress: true

jobs:
gateway-publish:
runs-on: ubuntu-latest
timeout-minutes: 90
env:
CVMFS_REF: ${{ github.event.inputs.cvmfs_ref || 'devel' }}
steps:
- name: Check out cvmfs-bits
uses: actions/checkout@v4
with:
path: cvmfs-bits

- name: Check out cvmfs (${{ env.CVMFS_REF }})
uses: actions/checkout@v4
with:
repository: cvmfs/cvmfs
ref: ${{ env.CVMFS_REF }}
path: cvmfs

- name: Set up Go
uses: actions/setup-go@v5
with:
go-version-file: cvmfs-bits/go.mod
cache-dependency-path: cvmfs-bits/go.sum

- name: Run gateway publish integration test
working-directory: cvmfs-bits
env:
CVMFS_SRC: ${{ github.workspace }}/cvmfs
run: ./test/integration/gateway/run.sh

- name: Dump gateway logs on failure
if: failure()
working-directory: cvmfs-bits
env:
CVMFS_SRC: ${{ github.workspace }}/cvmfs
run: docker compose -f test/integration/gateway/docker-compose.yml logs --no-color || true
19 changes: 18 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
# (e.g. cmd/prepub/ was being silently gitignored by the bare "prepub" pattern)
/bin/
/prepub
/prepubctl

# Go build cache and test output
*.test
Expand Down Expand Up @@ -60,3 +59,21 @@ journal.jsonl
*.pem
*.key
*.crt

# Archives. The keys above (*.key, *.crt, *.pem) were already ignored when a
# cvmfs.tar.gz containing the repository signing key, the gateway key and the
# S3 credentials was committed anyway: an ignore pattern only sees the file it
# is given, not what is packed inside it. So ignore the containers too.
*.tar
*.tar.gz
*.tgz
*.tar.bz2
*.tar.xz
*.zip

# Copies of a CVMFS server configuration tree, which carry keys wholesale.
/cvmfs/
/etc/
*.gw
*.s3.conf
.gofmt-leftovers/
196 changes: 108 additions & 88 deletions CATALOG.md

Large diffs are not rendered by default.

1,783 changes: 892 additions & 891 deletions INSTALL.md

Large diffs are not rendered by default.

10 changes: 7 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
.PHONY: build test lint clean run-sim

# Version stamped into the binary (cvmfs-prepub --version); empty outside git,
# where the binary falls back to the go tool's VCS stamp or "dev".
VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null)
LDFLAGS := -X main.version=$(VERSION)

build:
@echo "Building cvmfs-prepub and prepubctl..."
@echo "Building cvmfs-prepub..."
@mkdir -p bin
go build -v -o bin/cvmfs-prepub ./cmd/prepub
go build -v -o bin/prepubctl ./cmd/prepubctl
go build -v -ldflags "$(LDFLAGS)" -o bin/cvmfs-prepub ./cmd/prepub

test:
@echo "Running tests..."
Expand Down
Loading
Loading