Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
237 commits
Select commit Hold shift + click to select a range
56b9725
playground: scaffold ClickBench Firecracker microVM service
alexey-milovidov May 12, 2026
d1e144c
playground: mark chroot's /dev /proc /sys as rslave
alexey-milovidov May 12, 2026
41ed4b3
playground: shrink snapshots with restart + drop_caches + zstd
alexey-milovidov May 12, 2026
db4625a
playground: capture stop/start output in provision log
alexey-milovidov May 12, 2026
f9aed82
playground: kick daemon on agent boot, refresh rootfs on re-provision
alexey-milovidov May 12, 2026
b3c05ee
playground: pre-stamp 'ubuntu' in /etc/hosts
alexey-milovidov May 12, 2026
7181240
playground: pre-snapshot sync from host + drop daemon restart
alexey-milovidov May 12, 2026
446b3f7
playground: stop daemon before snapshot for tiny snapshot.bin
alexey-milovidov May 12, 2026
2d3ac3f
playground: init_on_free=1 + ensure-daemon-up on first /query
alexey-milovidov May 12, 2026
fd5d74f
playground: checkpoint — ClickHouse smoke test passes
alexey-milovidov May 12, 2026
f1088ec
playground: shared RO datasets disk + per-restore golden-disk clone
alexey-milovidov May 12, 2026
69f29a4
playground: overlayfs at /opt/clickbench/system, no dataset copy
alexey-milovidov May 12, 2026
ec99983
playground: enforce build/provision semaphores, clone-based rootfs
alexey-milovidov May 12, 2026
ab2fa8c
playground: flatten datasets, drop the symlink layout
alexey-milovidov May 12, 2026
d69f557
playground: cbsystem disk 200 GB sparse, not 2 GB
alexey-milovidov May 13, 2026
c33fd3b
playground: drop per-clone e2fsck, do it once at base build
alexey-milovidov May 13, 2026
06bf791
playground: pre-size base rootfs to 200 GB, drop per-clone resize2fs
alexey-milovidov May 13, 2026
b804e76
playground: drop redundant sync calls in image builds
alexey-milovidov May 13, 2026
5ea3be2
playground: fstrim before snapshot so freed dataset bytes leave the g…
alexey-milovidov May 13, 2026
b0d0c36
ClickBench: replace dataset copy/move with symlinks where safe
alexey-milovidov May 13, 2026
63cb2e5
playground: move agent off port 8080 to 50080
alexey-milovidov May 13, 2026
c824524
playground: ship lib/download-hits-* stubs at /opt/clickbench/lib
alexey-milovidov May 13, 2026
97758e0
playground: switch to Ubuntu's generic kernel + parse ip= from userspace
alexey-milovidov May 13, 2026
d6fe6df
playground: install Ubuntu kernel modules into base rootfs
alexey-milovidov May 13, 2026
ca8bc08
playground: use dpkg-deb -x for kernel modules to keep apt clean
alexey-milovidov May 13, 2026
5ec4e63
playground: parallel-provisioning report
alexey-milovidov May 13, 2026
70fd2a7
playground: fix fc-spawn underscore crash, OOM at 16 GB, $USER unset
alexey-milovidov May 13, 2026
a324d1f
playground: bump VM RAM to 48 GB, raise check timeout to 15 min
alexey-milovidov May 13, 2026
32a8504
playground: disable DataFrame-style engines, revert VM RAM to 16 GB
alexey-milovidov May 13, 2026
e759e96
playground: also disable duckdb-memory
alexey-milovidov May 13, 2026
b3db27e
playground: bump /snapshot/create timeout to 30 min
alexey-milovidov May 13, 2026
0689a33
playground: snapshot-specific semaphore (default 6)
alexey-milovidov May 13, 2026
d7a3f31
playground: restore VM state from disk on server start
alexey-milovidov May 13, 2026
c925886
playground: bump /snapshot/create timeout to 60 min
alexey-milovidov May 13, 2026
27db4c7
playground: snapshot/restore overhaul + UI iteration
alexey-milovidov May 13, 2026
cc76bc2
playground: hover tooltip on system slabs with uptime/status
alexey-milovidov May 13, 2026
3c1014f
playground: CSS-only system slab tooltip
alexey-milovidov May 13, 2026
2316c2a
playground: triangle pin under tooltip
alexey-milovidov May 13, 2026
428787d
playground: enlarge tooltip pin so it spans slab to box
alexey-milovidov May 13, 2026
e953f34
playground: no text selection on slabs; second click = run
alexey-milovidov May 13, 2026
230ad1d
playground: preserve example index across system switches
alexey-milovidov May 13, 2026
b9f7d90
playground: drop ' (script)' suffix from Time
alexey-milovidov May 13, 2026
fd457a4
playground: swap to new system's example only if textarea unedited
alexey-milovidov May 13, 2026
b33b8e1
playground: warm up snapshotted VMs on select
alexey-milovidov May 13, 2026
b502e4b
playground: /api/admin/provision actually triggers initial provision
alexey-milovidov May 13, 2026
e995418
playground: web UI works when opened as file://
alexey-milovidov May 13, 2026
f0c9cff
playground: default to clickhouse when no #hash selection
alexey-milovidov May 13, 2026
06ea5bf
Remove clutter
alexey-milovidov May 13, 2026
fc30338
Merge branch 'playground-wip' of github.com:ClickHouse/ClickBench int…
alexey-milovidov May 13, 2026
a754fbb
ClickBench: datafusion-vortex{,-partitioned} use datafusion-cli for q…
alexey-milovidov May 13, 2026
846d650
playground: hide output pane until a query result exists
alexey-milovidov May 13, 2026
5880597
playground: hide time stat until a query runs
alexey-milovidov May 13, 2026
d22b6b6
playground: re-apply example even when same option is re-picked
alexey-milovidov May 13, 2026
57c96b0
playground: ignore clicks on provisioning slabs
alexey-milovidov May 13, 2026
1d3c6b1
playground: raise output cap default to 256 KB
alexey-milovidov May 13, 2026
168a3c3
ClickBench/arc: launch via noble's loader so it boots on 22.04
alexey-milovidov May 13, 2026
1599219
ClickBench/opteryx: print query results
alexey-milovidov May 13, 2026
c74de82
ClickBench/byconity: ./stop preserves data
alexey-milovidov May 13, 2026
aa6d07f
ClickBench/chdb-parquet-partitioned: use bare "hits_*.parquet" in que…
alexey-milovidov May 13, 2026
b4e15e3
ClickBench/drill: pass --add-opens flags through DRILL_JAVA_OPTS
alexey-milovidov May 13, 2026
dce5893
playground: re-apply example on dropdown blur
alexey-milovidov May 13, 2026
73f5c4a
Minor changes
alexey-milovidov May 13, 2026
94ba946
ClickBench/mongodb: pin to 7.0 to avoid Linux >= 6.19 refusal
alexey-milovidov May 13, 2026
6530243
Merge branch 'playground-wip' of github.com:ClickHouse/ClickBench int…
alexey-milovidov May 13, 2026
eaa1ca8
ClickBench/presto*: print query rows instead of discarding them
alexey-milovidov May 13, 2026
47a1de6
playground: SNI-allowlist proxy for datalake systems
alexey-milovidov May 13, 2026
7cdf03b
ClickBench/doris{,-parquet}: rename Apache Doris -> Doris in results
alexey-milovidov May 13, 2026
deabe31
Merge branch 'playground-wip' of github.com:ClickHouse/ClickBench int…
alexey-milovidov May 13, 2026
e346a39
ClickBench/monetdb: start cleans stale daemon state + runs 'monetdb s…
alexey-milovidov May 13, 2026
8d6a897
playground: post-query health check, restore if daemon died
alexey-milovidov May 13, 2026
354a8fa
ClickBench/arc: fix loader path in glibc-noble wrapper
alexey-milovidov May 13, 2026
59e4998
ClickBench/duckdb-datalake*: skip IMDS probe so playground queries
alexey-milovidov May 13, 2026
3e99a29
ClickBench/clickhouse-datalake*: NOSIGN to skip IMDS probe
alexey-milovidov May 13, 2026
547706a
ClickBench/datafusion-vortex: bin renamed clickbench -> query_bench
alexey-milovidov May 13, 2026
d41743f
ClickBench/starrocks: wait for BE to actually become alive
alexey-milovidov May 13, 2026
ddc5c19
ClickBench/{pandas,polars-dataframe}: rename queries.py -> queries.sql
alexey-milovidov May 13, 2026
c87513d
ClickBench/polars: drop SQL->lambda translation, eval expressions dir…
alexey-milovidov May 13, 2026
4581727
playground: enable_internet strips filtered_internet's DROP first
alexey-milovidov May 13, 2026
fe3f646
ClickBench/druid: sync start/load/data-size to 37.0.0
alexey-milovidov May 13, 2026
fb52a2b
ClickBench/drill: pass --add-opens via the env vars sqlline reads
alexey-milovidov May 13, 2026
f72c4ea
ClickBench/monetdb: try 127.0.0.1 explicitly, log mclient error
alexey-milovidov May 13, 2026
62efd48
ClickBench/duckdb-datalake*: pin S3 region in query, not just at load
alexey-milovidov May 13, 2026
5839b6e
ClickBench: monetdb/siglens/starrocks/tidb fixes
alexey-milovidov May 13, 2026
3194d99
playground: ship hits.json on the readonly dataset disk
alexey-milovidov May 14, 2026
954a0fe
ClickBench: round of provisioning fixes
alexey-milovidov May 14, 2026
b4d2a47
playground: switch base rootfs to Ubuntu 24.04 (noble)
alexey-milovidov May 14, 2026
548d870
ClickBench/mongodb: pull 7.0 from jammy repo on noble too
alexey-milovidov May 14, 2026
c28304d
playground: cache DNS + early-out preamble in SNI proxy
alexey-milovidov May 14, 2026
3e217d7
playground: keep *.json runtime files when building per-system disk
alexey-milovidov May 14, 2026
5dfd7b8
playground: per-VM 256 GB swap disk for dataframe systems
alexey-milovidov May 14, 2026
f13a660
playground: fix pinot, daft-parquet-partitioned, log full /provision …
alexey-milovidov May 14, 2026
013434e
playground: rework monetdb load/query without expect; siglens uses pr…
alexey-milovidov May 14, 2026
0a2907b
playground: fix monetdb auth + daft-parquet-partitioned glob
alexey-milovidov May 14, 2026
a3dc1ee
playground: pinot: wait for broker+server to register before AddTable
alexey-milovidov May 14, 2026
b698d3b
playground: monetdb uses --password=; agent skips pre-snapshot restar…
alexey-milovidov May 14, 2026
7b1c755
playground: mark dataframe systems with .preserve-state
alexey-milovidov May 14, 2026
3abe6a9
playground: monetdb: drop -u from mclient — let ~/.monetdb provide bo…
alexey-milovidov May 14, 2026
680ea5e
playground: agent sets _daemon_started for .preserve-state systems
alexey-milovidov May 14, 2026
5a7ce23
playground: monetdb check: drop -u/-P from mclient like start/load/query
alexey-milovidov May 14, 2026
db5a916
playground: monetdb query: use -t clock instead of '\t clock' meta
alexey-milovidov May 14, 2026
eed1238
playground: parseable: stream NDJSON chunks to /ingest, don't write 4…
alexey-milovidov May 14, 2026
4a1d618
playground: drop sirius from catalog — needs GPU we don't have
alexey-milovidov May 14, 2026
a8f47f7
playground: tidb: default to TIDB_MODE=tikv
alexey-milovidov May 14, 2026
2ddb2c1
playground: pinot: mark .preserve-state
alexey-milovidov May 14, 2026
c08f246
playground: split queries.sql by lines instead of ;\n
alexey-milovidov May 14, 2026
fa534a2
playground: dataframe systems return result + cleaner query.py extrac…
alexey-milovidov May 14, 2026
238dbbd
playground: handle_queries falls back to queries.{logsql,py,txt}
alexey-milovidov May 14, 2026
223f67e
playground: rename queries.{logsql,txt} -> queries.sql
alexey-milovidov May 14, 2026
1d4e0a4
playground: give umbra a 256 GB swap disk
alexey-milovidov May 14, 2026
94ce37d
playground: persist vm.last_error to <system>/last_error.txt
alexey-milovidov May 14, 2026
c2ebdb2
playground: revert blur listener; reset example <select> on textarea …
alexey-milovidov May 14, 2026
937486a
playground: agent: don't surface truncation as an error
alexey-milovidov May 14, 2026
73f5692
playground: cumulative CPU-seconds cap (default 1 hour, ready state o…
alexey-milovidov May 14, 2026
f603ee9
playground: agent: pull dmesg OOM lines when query fails with no outp…
alexey-milovidov May 14, 2026
8ed0669
playground: kick VM on any /query error, not just unhealthy-daemon
alexey-milovidov May 14, 2026
1486731
playground: route presto+trino datalake variants through the SNI proxy
alexey-milovidov May 14, 2026
58103ee
playground: persist slot assignments so existing snapshots keep their…
alexey-milovidov May 14, 2026
2f17f9a
playground: lower HOST_MIN_FREE_DISK_GB default 500->100
alexey-milovidov May 14, 2026
f669cc8
playground: agent: detect snapshot restore via /proc/stat btime + rec…
alexey-milovidov May 14, 2026
3e831e1
playground: load ClickHouse credentials from <state_dir>/clickhouse.conf
alexey-milovidov May 14, 2026
6a9aa7a
Minor edit
alexey-milovidov May 14, 2026
67d00d8
playground: clickhouse bootstrap + shared-query plumbing
alexey-milovidov May 14, 2026
b8a6cf8
playground: web: permalink via X-Query-Id + restore from ?q=<id>
alexey-milovidov May 14, 2026
7f0e8ee
Minor edit
alexey-milovidov May 14, 2026
b4810e2
Merge branch 'playground-wip' of github.com:ClickHouse/ClickBench int…
alexey-milovidov May 14, 2026
c273b35
playground: bootstrap: resolve writer host via ipify, not remote_addr…
alexey-milovidov May 14, 2026
f15f13f
Merge branch 'playground-wip' of github.com:ClickHouse/ClickBench int…
alexey-milovidov May 14, 2026
913871e
playground: reader user has no password (sha256 of empty string)
alexey-milovidov May 14, 2026
d002acd
playground: trino-datalake: switch to fs.native-s3 (the legacy hadoop…
alexey-milovidov May 14, 2026
0eccf8d
playground: trino: --output-format=ALIGNED so /api/query has output
alexey-milovidov May 14, 2026
0f17abf
playground: agent: clear _daemon_started after docker reconcile
alexey-milovidov May 14, 2026
03beb2b
playground: umbra: --memory=128g --memory-swap=-1 so cgroup sees the …
alexey-milovidov May 14, 2026
72fc905
playground: drill: -XX:-UseContainerSupport to dodge the cgroup-v2 NPE
alexey-milovidov May 14, 2026
ca0abe5
playground: web: 'Run all' competition mode
alexey-milovidov May 14, 2026
0635c48
playground: un-gate heavyai + oxla (both ship public docker images)
alexey-milovidov May 14, 2026
02f78ed
playground: web: flash competition row yellow for 1s on state change
alexey-milovidov May 14, 2026
1e97091
playground: web: competition panel becomes a left rail with clickable…
alexey-milovidov May 14, 2026
f622415
playground: web: left rail = max-content, right pane = remaining
alexey-milovidov May 14, 2026
7eb6dd5
playground: web: only switch to 2-col grid when competition is actual…
alexey-milovidov May 14, 2026
28f4372
playground: web: competition rail tweaks
alexey-milovidov May 14, 2026
32078cf
playground: web: 'System status' + 'Last error' move into the right pane
alexey-milovidov May 14, 2026
45ab7ca
playground: gizmosql: .mode box (was .mode trash, discarded all rows)
alexey-milovidov May 14, 2026
0e1adcc
playground: parseable: inline the ingest command — exported bash fn i…
alexey-milovidov May 14, 2026
ae98b6c
playground: web: competition runs 3 rounds, fires in shuffled order
alexey-milovidov May 14, 2026
54f28e8
playground: quickwit: detect 'message' errors + queries.json -> queri…
alexey-milovidov May 14, 2026
d53d960
playground: web: sort by best-so-far time, not only when all 3 rounds…
alexey-milovidov May 14, 2026
487a41b
playground: tidb: --tag clickbench so the data dir persists across re…
alexey-milovidov May 14, 2026
597d7ce
playground: web: 'Run all' also works for custom textarea queries
alexey-milovidov May 14, 2026
370f7e1
elasticsearch: wait for shards to recover before declaring ready
alexey-milovidov May 14, 2026
c060137
playground: web: right-align 'Run all' in the buttons row
alexey-milovidov May 14, 2026
bbae7fc
playground: web: hide competition panel on example pick / Run / edit
alexey-milovidov May 14, 2026
cffa226
gizmosql: disable non-TTY truncation so rows are printed
alexey-milovidov May 14, 2026
b14e2cc
playground: per-system VM RAM override; bump umbra to 96 GiB
alexey-milovidov May 14, 2026
67def65
trino-datalake{,-partitioned}: pin trino:455, restore hadoop-S3 + ano…
alexey-milovidov May 14, 2026
1d1c476
umbra: lean on the swap disk instead of a privileged RAM allotment
alexey-milovidov May 14, 2026
9b14149
trino-datalake{,-partitioned}: widen shim classpath after :455 pin
alexey-milovidov May 14, 2026
6f06afa
playground: web: keep competition rail open while editing the query
alexey-milovidov May 14, 2026
2f05785
playground: URL-encode X-Error so error newlines survive end-to-end
alexey-milovidov May 14, 2026
8487726
playground: web: re-baseline pristineQuery on rail clicks in example-…
alexey-milovidov May 14, 2026
ef25906
playground: druid post-restore recovery + agent btime watcher
alexey-milovidov May 14, 2026
6494e8e
parseable: use a wide time-window in queries, not today
alexey-milovidov May 14, 2026
874f100
heavyai: trailing ';' in check; oxla: drop from catalog
alexey-milovidov May 14, 2026
8ebfabf
playground: orioledb sysdisk bump + slab-hover rail highlight
alexey-milovidov May 14, 2026
c2f986e
drill: accept sqlline's current 'N row(s) selected (X.YYY seconds)' f…
alexey-milovidov May 14, 2026
58a02c5
tidb: mark .preserve-state so the snapshot keeps the loaded table
alexey-milovidov May 14, 2026
1110d9f
mongodb: emit timing from bash, not console.error inside mongosh
alexey-milovidov May 14, 2026
7377cac
umbra: drop docker memory cgroup; raise vm.max_map_count
alexey-milovidov May 14, 2026
a0e1893
trino-datalake: shim classpath via shell glob — trino:455 has no find…
alexey-milovidov May 14, 2026
13b4100
heavyai: allowlist /tmp for COPY FROM via omnisci.conf
alexey-milovidov May 14, 2026
74239fb
turso: enable RUST_BACKTRACE=1 in load and query
alexey-milovidov May 14, 2026
d8db153
playground: web: pretty-print JSON output bodies
alexey-milovidov May 14, 2026
18e73d8
starrocks: backend_alive check column 9 (Alive), not column 10
alexey-milovidov May 14, 2026
ff16bff
Merge remote-tracking branch 'origin/main' into playground-wip
alexey-milovidov May 14, 2026
f8f8840
playground: drop stale 10 KB output-cap references
alexey-milovidov May 14, 2026
c314486
playground: agent: allow concurrent /query in a single VM
alexey-milovidov May 14, 2026
5e3db62
playground: drop stale build-progress.md
alexey-milovidov May 14, 2026
fb9e740
playground: drop stale parallel-provisioning-report.md
alexey-milovidov May 14, 2026
c0d57e8
playground: drop stale writer/reader-password parameters from bootstr…
alexey-milovidov May 14, 2026
57da682
playground: drop reader_password field — it is always empty
alexey-milovidov May 14, 2026
e756e52
playground: add clickhouse-web to the catalog
alexey-milovidov May 14, 2026
397fa67
playground: enable databend, firebolt{,-parquet,-parquet-partitioned}…
alexey-milovidov May 14, 2026
8d3d4bf
playground: security hardening — aiohttp symlink, trusted internet, p…
alexey-milovidov May 14, 2026
ed1bbbb
playground: drop unused PLAYGROUND_MAX_VMS / max_warm_vms
alexey-milovidov May 14, 2026
8147d66
playground: aiohttp pin, systemd hardening, per-IP rate limits
alexey-milovidov May 14, 2026
ac98846
playground: rate limiter keys on TCP peer only, never X-Forwarded-For
alexey-milovidov May 14, 2026
a184c37
playground: real local DNS, rate-limit GC, clickhouse-web cache path
alexey-milovidov May 14, 2026
a8fc4ab
clickhouse-web: cache dir is now a symlink to /dev/shm/clickhouse
alexey-milovidov May 14, 2026
cecea2b
playground: TLS on 443 via Let's Encrypt + certbot
alexey-milovidov May 14, 2026
6b220d6
playground: web: reserve scrollbar gutter on the competition rail
alexey-milovidov May 14, 2026
e80b86f
firebolt: persist /firebolt-core/volume across pre-snapshot stop+start
alexey-milovidov May 14, 2026
2fd44d6
polars: mark .preserve-state so the loaded LazyFrame survives
alexey-milovidov May 14, 2026
71b7f4b
parseable: fail load loudly when logstream create returns non-2xx
alexey-milovidov May 14, 2026
5de540f
kinetica: mv the gzip into persist (revert symlink)
alexey-milovidov May 14, 2026
b458230
polars: include the eval result in /query response
alexey-milovidov May 14, 2026
7e71fe9
playground: compress per-system goldens with zstd to free disk
alexey-milovidov May 14, 2026
1674727
playground: idle-VM reaper — tear down 'ready' VMs after 10 min unused
alexey-milovidov May 15, 2026
ded372c
playground: revert manual zstd compression; rely on btrfs
alexey-milovidov May 15, 2026
879d87f
playground: force iptables-legacy in the base rootfs
alexey-milovidov May 15, 2026
c036a30
playground: in-VM download-hits-parquet-partitioned stub points at hi…
alexey-milovidov May 15, 2026
fee66e5
playground: preload iptable_raw + friends so dockerd networking works
alexey-milovidov May 15, 2026
e549149
firebolt{,-parquet,-parquet-partitioned}: bring up to PR #860 per-ste…
alexey-milovidov May 15, 2026
d3ade32
playground: docker default bridge in nat-unprotected mode
alexey-milovidov May 15, 2026
f8bfb2b
playground: disable dockerd iptables management entirely
alexey-milovidov May 15, 2026
a272401
firebolt{,-parquet,-parquet-partitioned}: dump diagnostics on healthc…
alexey-milovidov May 15, 2026
7f490f1
firebolt{,-parquet,-parquet-partitioned}: chown fb-volume to uid 1111
alexey-milovidov May 15, 2026
edafd37
playground: btrfs migration — drop manual zstd compression, doc btrfs…
alexey-milovidov May 15, 2026
2b84f22
playground: stage partitioned parquet symlinks at cwd before ./load
alexey-milovidov May 15, 2026
a52048e
clickhouse-web: bind-mount tmpfs at caches/web instead of symlinking
alexey-milovidov May 15, 2026
39fc1bf
cedardb: bump start-ready timeout 60s → 300s
alexey-milovidov May 15, 2026
c16154e
clickhouse-web: drop idempotency dance from install (always from scra…
alexey-milovidov May 15, 2026
95125ac
parseable: upgrade v2.5.12 → v2.7.2 (fixes 0-row loads)
alexey-milovidov May 15, 2026
09d4e46
playground: actually isolate disable_internet VMs (FORWARD DROP catch…
alexey-milovidov May 15, 2026
061ccd6
polars: avoid backslash inside f-string expression in query script
alexey-milovidov May 15, 2026
27a1572
playground: rebuild per-system rootfs+sysdisk when base is newer
alexey-milovidov May 15, 2026
9a04fce
playground: add INSTALL.md with end-to-end setup instructions
alexey-milovidov May 15, 2026
fa27fbd
siglens: rename queries.spl → queries.sql
alexey-milovidov May 15, 2026
8a18b66
playground: replace .preserve-state marker with benchmark.sh vars
alexey-milovidov May 16, 2026
8aa9bd6
playground: restore docker0 MASQUERADE inside VMs (presto/cloudberry …
alexey-milovidov May 16, 2026
f993b92
cedardb-parquet: align start-ready timeout with cedardb (60s → 600s)
alexey-milovidov May 16, 2026
c00594b
playground: honor BENCH_CHECK_TIMEOUT in agent's post-start probe
alexey-milovidov May 16, 2026
8220f83
kinetica: lower RAM-tier cap from 27 GB to 9 GB
alexey-milovidov May 16, 2026
66e03f2
umbra: dump memory + swap + container cgroup state on start
alexey-milovidov May 16, 2026
c3a674f
trino-datalake{,-partitioned}: bump BENCH_CHECK_TIMEOUT 1800 → 3600
alexey-milovidov May 16, 2026
b9f4983
playground: per-system VM RAM override; bump umbra to 32 GiB
alexey-milovidov May 16, 2026
3cf6295
Revert "playground: per-system VM RAM override; bump umbra to 32 GiB"
alexey-milovidov May 16, 2026
c19ca4d
umbra: unlimited memlock + dump sysctl/memlock in start diagnostics
alexey-milovidov May 16, 2026
4fddcde
trino-partitioned, presto-partitioned: bind-mount datasets_ro into co…
alexey-milovidov May 16, 2026
94cab89
trino-datalake: dump container state + docker logs after start
alexey-milovidov May 16, 2026
f29d425
firebolt-parquet-partitioned: bind-mount datasets_ro into container
alexey-milovidov May 16, 2026
437f6f4
druid: fail load if hits still empty after polling; extend budget to 4 h
alexey-milovidov May 16, 2026
b528b7e
playground: flush provision.log incrementally so /provision-log
alexey-milovidov May 18, 2026
6e9d8ee
trino-datalake{,-partitioned}: fix hive config for trino:455
alexey-milovidov May 18, 2026
8eafda7
umbra: strace umbra-server during COPY to find the failing syscall
alexey-milovidov May 18, 2026
bc7555d
umbra: try MALLOC_CONF (jemalloc) tuning before giving up on swap
alexey-milovidov May 18, 2026
e9fdf86
byconity: ./check now also touches the worker so post-restore
alexey-milovidov May 18, 2026
1429078
byconity: ./start blocks until cluster is query-ready post-restore
alexey-milovidov May 18, 2026
f9d67a2
Merge branch 'main' into playground-wip
alexey-milovidov Jul 22, 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
22 changes: 22 additions & 0 deletions byconity/check
Original file line number Diff line number Diff line change
@@ -1,5 +1,27 @@
#!/bin/bash
set -e

# Server-local SELECT 1 (always works once the server container is up,
# but DOESN'T validate worker reachability).
docker compose exec -T server clickhouse-client --port 52145 \
--query "SELECT 1" >/dev/null

# If hits exists (post-load), force a worker-touching query so we
# refuse to declare 'ready' until the server-to-worker BRPC connection
# has actually re-established. Without this gate the first /query
# after snapshot-restore lands on a half-broken cluster and returns
# Code: 2008. ... 112:[E111]Fail to connect Socket{...}:30605 ...
# Not connected to 172.18.0.X:30605 yet, server_id=...
# from the cnch-worker reconnection path.
#
# We avoid running the query unconditionally because during the
# initial-provision phase (between ./start and ./load) hits doesn't
# exist yet; relying on `EXISTS TABLE` keeps the check usable in
# both phases.
exists=$(docker compose exec -T server clickhouse-client --port 52145 \
--query "EXISTS TABLE hits" 2>/dev/null || echo 0)
if [ "$exists" = "1" ]; then
docker compose exec -T server clickhouse-client --port 52145 \
--query "SELECT count() FROM hits WHERE AdvEngineID <> 0 LIMIT 1" \
>/dev/null
fi
41 changes: 37 additions & 4 deletions byconity/start
Original file line number Diff line number Diff line change
@@ -1,15 +1,48 @@
#!/bin/bash
set -e

# Bring the byconity stack up. Idempotent: if the server already responds,
# do nothing.
if docker compose exec -T server clickhouse-client --port 52145 \
--query "SELECT 1" >/dev/null 2>&1; then
# Idempotent at the server-only level (SELECT 1 against the server
# container only) — but if hits already exists, also require a
# worker-touching query to succeed before declaring start done. This
# closes the post-snapshot-restore window where SELECT 1 passes
# immediately on the server but server↔worker BRPC is still stale and
# the first /query returns
# Code: 2008. ... 112:[E111]Fail to connect Socket{addr=172.18.0.X:30605}
# Not connected to 172.18.0.X:30605 yet, server_id=NNN
ck() {
docker compose exec -T server clickhouse-client --port 52145 \
--query "SELECT 1" >/dev/null 2>&1 || return 1
local exists
exists=$(docker compose exec -T server clickhouse-client --port 52145 \
--query "EXISTS TABLE hits" 2>/dev/null || echo 0)
if [ "$exists" = "1" ]; then
docker compose exec -T server clickhouse-client --port 52145 \
--query "SELECT count() FROM hits WHERE AdvEngineID <> 0 LIMIT 1" \
>/dev/null 2>&1 || return 1
fi
return 0
}

if ck; then
exit 0
fi

docker compose up -d

# Wait for the cluster to actually serve a worker-touching query.
# Polls for up to 10 min: cnch-worker BRPC reconnect is normally <30s
# after a snapshot restore but slow firecracker boots have been
# observed taking longer.
for _ in $(seq 1 600); do
if ck; then
exit 0
fi
sleep 1
done
echo "byconity/start: cluster did not become query-ready within 600s" >&2
docker compose ps >&2 || true
exit 1

# HDFS user setup runs in load (after ./check confirms the stack is up
# — hdfs-namenode is a dependency of server, so when SELECT 1 works,
# namenode has been ready long enough to accept dfs commands too). Doing
Expand Down
1 change: 1 addition & 0 deletions firebolt-parquet-partitioned/benchmark.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/bash
# Thin shim — actual flow is in lib/benchmark-common.sh.
export BENCH_DOWNLOAD_SCRIPT="download-hits-parquet-partitioned"
export BENCH_DURABLE=no
export BENCH_RESTARTABLE=no
Expand Down
1 change: 1 addition & 0 deletions firebolt-parquet/benchmark.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/bash
# Thin shim — actual flow is in lib/benchmark-common.sh.
export BENCH_DOWNLOAD_SCRIPT="download-hits-parquet-single"
export BENCH_DURABLE=no
export BENCH_RESTARTABLE=no
Expand Down
2 changes: 2 additions & 0 deletions firebolt/benchmark.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#!/bin/bash
# Thin shim — actual flow is in lib/benchmark-common.sh.
export BENCH_DOWNLOAD_SCRIPT="download-hits-parquet-single"
export BENCH_DURABLE=yes
export BENCH_RESTARTABLE=no
exec ../lib/benchmark-common.sh
3 changes: 3 additions & 0 deletions playground/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
__pycache__/
*.pyc
.env
239 changes: 239 additions & 0 deletions playground/INSTALL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,239 @@
# ClickBench Playground — Installation

End-to-end setup for a fresh Ubuntu 24.04 host. Everything lives under
`/opt/clickbench-playground/` once it's running. Total disk: ~7 TB at full
catalog (100 systems × multi-GB-per-system goldens, on btrfs with zstd
compression).

## 0. Host prerequisites

- Ubuntu 24.04 (noble), x86_64
- `/dev/kvm` accessible (bare metal or a virt-enabled cloud instance —
`c6a.metal`, `m7i.metal-24xl`, `i4i.metal`, etc.)
- A dedicated block device for the playground state directory, plus
enough free space for ~7 TB of system goldens and ~200 GB of datasets.
- Outbound internet at install time (apt mirrors, GitHub releases,
Docker Hub, dataset downloads).
- Python 3.12+ on the host.

## 1. Format the state volume (btrfs + transparent zstd)

The playground depends on **reflink** (instant per-VM disk cloning) and
**transparent compression** (snapshots otherwise wouldn't fit). Btrfs gives
both. XFS works for reflink but lacks compression and fills the host at
~7 TB once all systems are provisioned.

```
sudo mkfs.btrfs -L cbplayground -f /dev/<your-device>
echo 'LABEL=cbplayground /opt/clickbench-playground btrfs \
defaults,noatime,compress=zstd:1,nofail 0 2' | sudo tee -a /etc/fstab
sudo mkdir -p /opt/clickbench-playground
sudo mount /opt/clickbench-playground
```

## 2. Clone the repo

```
sudo apt-get update
sudo apt-get install -y git python3 python3-pip
cd /home/ubuntu
git clone https://github.com/ClickHouse/ClickBench
cd ClickBench
pip3 install --user -r playground/requirements.txt
```

## 3. Sudoers entry for the server

The playground server runs as the unprivileged `ubuntu` user but needs to
call `sudo ip ...`, `sudo iptables ...`, `sudo mount`, `sudo cp`, `sudo
firecracker`, etc. Add a sudoers fragment so those calls don't prompt:

```
sudo tee /etc/sudoers.d/clickbench-playground >/dev/null <<'EOF'
ubuntu ALL=(root) NOPASSWD: /usr/sbin/ip, /usr/sbin/iptables, \
/usr/bin/mount, /usr/bin/umount, /usr/bin/cp, /usr/bin/mv, \
/usr/bin/chown, /usr/bin/chmod, /usr/bin/mkdir, /usr/bin/rm, \
/usr/bin/dd, /usr/bin/truncate, /usr/sbin/mkfs.ext4, \
/usr/sbin/losetup, /opt/clickbench-playground/bin/firecracker, \
/opt/clickbench-playground/bin/jailer
EOF
sudo chmod 440 /etc/sudoers.d/clickbench-playground
```

Tighten the allowlist further if your security model demands it.

## 4. Install Firecracker, kernel, host firewall, DNS, (optional) TLS

```
sudo playground/scripts/install-firecracker.sh
```

This script is idempotent. It:

- Downloads `firecracker` + `jailer` (v1.13.1) into
`/opt/clickbench-playground/bin/`.
- Downloads the guest kernel (`vmlinux-6.1.141` from firecracker-ci) into
`/opt/clickbench-playground/kernel/vmlinux`.
- Sets `net.ipv4.conf.all.route_localnet=1` (needed by the SNI proxy
REDIRECT path).
- Installs `dnsmasq` and configures it as a UDP-only resolver on port 53
for the per-VM TAPs.
- Sanity-checks that the state dir actually supports reflink.

To enable TLS for the public API at the same time, set the domain first:

```
export PLAYGROUND_TLS_DOMAIN=clickbench-playground.example.com
export PLAYGROUND_TLS_EMAIL=ops@example.com # optional, defaults to ubuntu@$(hostname -d)
sudo -E playground/scripts/install-firecracker.sh
```

This invokes `certbot --standalone` to issue a cert, configures a deploy
hook so the `ssl-cert` group can read the renewed privkey, and adds the
operator user to the `ssl-cert` group.

## 5. Download the datasets (~200 GB, slow)

```
playground/scripts/download-datasets.sh
```

Populates `/opt/clickbench-playground/datasets/` with:

- `hits.parquet` — single-file parquet (~14 GB)
- `hits_partitioned/hits_0..99.parquet` — partitioned parquet
- `hits.tsv` — decompressed TSV (~75 GB)
- `hits.csv` — decompressed CSV (~75 GB)
- `hits.json` / `hits.json.gz` — JSON variants for parseable /
victorialogs

The script uses `wget --continue` per format, so re-running picks up
where it left off.

## 6. Build the read-only dataset image

```
playground/images/build-datasets-image.sh
```

rsyncs the `datasets/` directory into `datasets.ext4`, sized to fit, with
no journal and zero reserved blocks. This image is attached read-only to
every VM as `LABEL=cbdata`.

## 7. Build the base rootfs

```
sudo playground/images/build-base-rootfs.sh
```

Starts from the official Ubuntu 24.04 cloud image and adds:

- The in-VM agent at `/opt/clickbench-agent/agent.py` plus its systemd
unit.
- Forced iptables-legacy alternatives (Docker on the Firecracker kernel
needs them — `nf_tables` isn't compiled in).
- `/etc/docker/daemon.json` with `"iptables": false`, so Docker doesn't
try to manage the (missing) `raw` table.
- A preloaded kernel-module list (`overlay`, `br_netfilter`, `veth`,
`ip_tables`, `iptable_*`, `nf_conntrack`, `nf_nat`, `xt_MASQUERADE`,
`xt_conntrack`).
- `lib/download-hits-*` stubs that symlink from the read-only dataset
disk rather than `wget`ing from the public mirror.

Output: `/opt/clickbench-playground/base-rootfs.ext4` (a sparse 200 GB
ext4 image).

## 8. ClickHouse Cloud credentials (request logging)

The server appends every request and restart to a ClickHouse Cloud table.
Provide credentials either via `playground/.env`:

```
CLICKHOUSE_CLOUD_URL=https://your-host.clickhouse.cloud:8443
CLICKHOUSE_CLOUD_USER=default
CLICKHOUSE_CLOUD_PASSWORD=...
CLICKHOUSE_CLOUD_DB=playground
```

…or by copying `playground/clickhouse.conf.example` to
`/opt/clickbench-playground/clickhouse.conf` and filling it in.

If neither is configured, the server falls back to a local JSONL sink
under `/opt/clickbench-playground/logs/`.

## 9. Start the server

Foreground (for local development):

```
playground/scripts/run-server.sh
```

As a managed service (recommended for production):

```
sudo cp playground/clickbench-playground.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now clickbench-playground
```

The server listens on `:8000` (HTTP) and, if a TLS cert exists at
`/etc/letsencrypt/live/${PLAYGROUND_TLS_DOMAIN}/`, also on `:443`.

## 10. Provision every system (long)

The server doesn't auto-provision on first query — initial install/start/
load/snapshot is opt-in. Kick the whole catalog:

```
playground/scripts/provision-all.sh
```

This walks every system in `/api/systems`, posts to
`/api/admin/provision/<name>`, and polls until each one is either
`snapshotted` or `down` with an error. Concurrency is bounded server-side
by `PLAYGROUND_PROVISION_CONCURRENCY` (default 32) and
`PLAYGROUND_BUILD_CONCURRENCY` (default 6). Expect 1–6 hours of wall
time depending on host throughput and Docker Hub rate-limit luck.

Status: `curl http://localhost:8000/api/state | jq`.
Per-system log: `/opt/clickbench-playground/logs/provision-<name>.log`.

## 11. (Optional) Tune concurrency / monitor thresholds

Environment variables read at server startup:

| Var | Default | What it does |
|----------------------------------|--------------------------------------|-----------------------------------------------------------|
| `PLAYGROUND_STATE_DIR` | `/opt/clickbench-playground` | host state root |
| `PLAYGROUND_LISTEN` | `0.0.0.0:8000` | HTTP listener |
| `PLAYGROUND_TLS_CERT/_KEY` | `/etc/letsencrypt/live/$DOMAIN/...` | TLS |
| `PLAYGROUND_BUILD_CONCURRENCY` | 6 | parallel per-system rootfs builds |
| `PLAYGROUND_PROVISION_CONCURRENCY` | 32 | parallel VM provisions |
| `PLAYGROUND_SNAPSHOT_CONCURRENCY` | 6 | parallel Firecracker snapshot saves |
| `CLICKBENCH_OUTPUT_LIMIT` | 262144 | per-query response cap (bytes) enforced inside the agent |
| `VM_CPU_BUSY_THRESHOLD` | 0.97 | monitor: kill idle VMs above this |
| `VM_DISK_FULL_PCT` | 0.97 | monitor: kill VMs whose sysdisk passes this |

## Smoke-testing a single system

```
playground/scripts/smoke-boot.sh clickhouse
```

Boots one system end-to-end (provision → snapshot → restore → /query),
prints timing, tears down. Use this to validate any change to
`base-rootfs.ext4` or the agent before re-kicking the full catalog.

## Re-provisioning after agent or base-image changes

`vm_manager` rebuilds the per-system rootfs+sysdisk automatically when
`base-rootfs.ext4` is newer than the existing `rootfs.ext4`. So after
changing `playground/agent/agent.py` or anything baked into the base:

```
sudo playground/images/build-base-rootfs.sh # rebuild base
curl -X POST http://localhost:8000/api/admin/provision/<name> # re-kick
```

The new agent and new per-system scripts both land in the next provision.
Loading
Loading