Firebolt: do a full restart before every cold run - #1666
Conversation
The three self-hosted firebolt-core entries set BENCH_RESTARTABLE=no, so lib/benchmark-common.sh skipped the ./stop -> drop_caches -> ./start cycle and only flushed the page cache before the first run of each query. README section 2.b calls that a lukewarm cold run and requires the "no-cold" tag, which #1648 duly added. There is no reason for these three to be lukewarm: the engine data directory is a host bind mount (fb-volume), so the database is still there after the container is stopped and started back up. Drop the BENCH_RESTARTABLE override, so the common runner restarts the engine before every cold run like it does for every other daemon, and drop the "no-cold" tag from the templates. Verified locally against ghcr.io/firebolt-db/engine:dev with a 10M-row ingest: the engine handles SIGTERM (clean shutdown log, exit code 0), the `clickbench` database and its row count survive stop+start, and the first try after a restart is 10-20x slower than the two warm tries that follow - i.e. the cold number is now actually cold. ./stop gets -t 120 instead of docker's 10s default grace period. The shutdown is prompt, so docker stop returns as soon as the engine exits and the longer window costs nothing; without it a slower flush on the full dataset would be SIGKILLed, and the recovery work on the next ./start would land inside the next query's cold measurement. Result files written before this change keep the "no-cold" tag - they were measured without a restart. The 2025-06-07 managed-cloud results keep it too: that is the hosted service, which cannot be restarted. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
The run of Logs:
|
…t-partitioned (c6a.2xlarge, c6a.4xlarge, c6a.metal, c6a.xlarge, c7a.metal-48xl, c8g.4xlarge, c8g.metal-48xl, t3a.small)
|
Results for Logs:
|
…t-partitioned (c6a.large)
|
Results for Logs:
|
Follow-up to #1648 (#1648 (comment)): rather than leaving the three self-hosted firebolt-core entries tagged
no-cold, make them do a true cold run.firebolt,firebolt-parquetandfirebolt-parquet-partitionedsetBENCH_RESTARTABLE=no, solib/benchmark-common.shskipped the./stop→drop_caches→./startcycle and only flushed the page cache before the first run of each query — a lukewarm cold run per README section 2.b.Nothing forces that: the engine data directory is a host bind mount (
fb-volume), so theclickbenchdatabase is still there after the container is stopped and started back up. This drops theBENCH_RESTARTABLEoverride so the common runner restarts the engine before every cold run like it does for every other daemon, and dropsno-coldfrom the three templates../stopgets-t 120instead of docker's 10 s default grace period. The shutdown is prompt, sodocker stopreturns as soon as the engine exits and the longer window costs nothing; without it a slower flush on the full dataset would beSIGKILLed, and the recovery work on the next./startwould land inside the next query's cold measurement.Verified locally
Against
ghcr.io/firebolt-db/engine:dev(arm64) with a 10M-row ingest:the engine handles
SIGTERM— clean shutdown log (Shutting down the server.), container exit code 0;the
clickbenchdatabase and its row count survive./stop+./start(10,000,000 rows before and after);./checkstarts failing right after./stop, sobench_wait_stoppedreturns immediately instead of burning its 60 s timeout;the first try after a restart is 10–20x slower than the two warm tries that follow, i.e. the cold number is actually cold:
SELECT COUNT(*)SELECT SUM(AdvEngineID), COUNT(*), AVG(ResolutionWidth)Wall-clock cost of the extra 43 restarts could not be measured on the box used for the local check (an overloaded shared dev machine where the docker daemon alone takes minutes per operation); the run on the benchmark machines will show it.
Results
The existing result files keep
no-cold— they were measured without a restart. The 2025-06-07 managed-cloud results keep it too: that is the hosted service, which cannot be restarted. Fresh results for the three entries come from this PR's benchmark run; add amachine:alllabel to re-run the whole matrix instead of justc6a.4xlarge.impalais the other local daemon #1648 tagged, and it stays tagged: restartingcatalogdwould empty Impala's in-memory catalog.🤖 Generated with Claude Code