From eadae82b0c61d0981066d3e1d84a427f423fd959 Mon Sep 17 00:00:00 2001 From: Daan Meijer Date: Tue, 3 Nov 2026 23:57:59 +0100 Subject: [PATCH] The prober's tables on the NVMe; the prober runs through the night Migration 7400 moves pending_releases (with its two HDD indexes), release_inspections and probe_cache to the default tablespace (nvme on homelab): the edge's batch upserts into pending_releases took minutes each on the HDD and the prober's flushes waited on them (LOG.md (137)). Homelab moved them by hand with the services stopped: 66 GB in 10.5 minutes. With everything the prober touches on the NVMe, the nightly pause leaves the prober running (usenet-rebuild-pause.sh), and a deploy while paused recreates it with node-api and web (deploy.sh). Co-Authored-By: Claude Fable 5.1 --- .../1770000007400_prober_tables_on_nvme.ts | 37 +++++++++++++++++++ deploy/deploy.sh | 5 ++- deploy/usenet-rebuild-pause.sh | 7 ++-- 3 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 database/migrations/1770000007400_prober_tables_on_nvme.ts diff --git a/database/migrations/1770000007400_prober_tables_on_nvme.ts b/database/migrations/1770000007400_prober_tables_on_nvme.ts new file mode 100644 index 0000000..74fed51 --- /dev/null +++ b/database/migrations/1770000007400_prober_tables_on_nvme.ts @@ -0,0 +1,37 @@ +import { BaseSchema } from '@adonisjs/lucid/schema' + +/** + * Everything the prober reads or writes in the catalog's tablespace (default_tablespace: nvme on homelab), out of + * CHUNK_TABLESPACE (the HDD): pending_releases with its two HDD indexes (migration 6300), release_inspections + * (6000), probe_cache with its toast. The edge's batch upserts into pending_releases took minutes each on the HDD and + * the prober's flushes waited on them (LOG.md 2026-11-03 (137)); and with these on the NVMe the prober can run + * through the night without the HDD. Homelab moved them by hand (edge, node-api and the workers stopped; ~66 GB); + * a no-op where they're there already, or without a default tablespace (tests). + */ +export default class extends BaseSchema { + async up() { + this.defer(async (db) => { + const { rows: setting } = await db.rawQuery( + `SELECT current_setting('default_tablespace') AS target` + ) + const target = setting[0].target + if (!target) return + for (const table of ['pending_releases', 'release_inspections', 'probe_cache']) { + const { rows } = await db.rawQuery( + `SELECT c.relname, c.relkind FROM pg_class c LEFT JOIN pg_tablespace t ON t.oid = c.reltablespace + WHERE (c.relname = ? OR c.oid IN (SELECT indexrelid FROM pg_index WHERE indrelid = ?::regclass)) + AND c.relkind IN ('r', 'i') AND coalesce(t.spcname, 'pg_default') <> ? + ORDER BY c.relkind DESC, c.relname`, + [table, table, target] + ) + for (const { relname, relkind } of rows) { + await db.rawQuery( + `ALTER ${relkind === 'i' ? 'INDEX' : 'TABLE'} ${relname} SET TABLESPACE ${target}` + ) + } + } + }) + } + + async down() {} +} diff --git a/deploy/deploy.sh b/deploy/deploy.sh index fac6883..d99fae1 100755 --- a/deploy/deploy.sh +++ b/deploy/deploy.sh @@ -47,8 +47,9 @@ echo "== recreating app services" docker compose stop edge if [ -e "$CACHE/paused" ]; then # Paused for the night (~/bin/usenet-rebuild-pause.sh): the workers stay stopped, the resume starts the new build. - echo "== paused: coordinator, prober, merger, judge, spotter, spot-inspector and edge left stopped" - docker compose up -d --no-deps node-api web + # The prober runs through the night (2026-11-03, LOG.md (137)), so it gets the new build now. + echo "== paused: coordinator, merger, judge, spotter, spot-inspector and edge left stopped" + docker compose up -d --no-deps node-api web prober else docker compose up -d --no-deps node-api web coordinator prober merger judge spotter spot-inspector if [ -e "$CACHE/no-edge" ]; then diff --git a/deploy/usenet-rebuild-pause.sh b/deploy/usenet-rebuild-pause.sh index e6617f0..394c238 100755 --- a/deploy/usenet-rebuild-pause.sh +++ b/deploy/usenet-rebuild-pause.sh @@ -1,12 +1,13 @@ #!/bin/sh # Installed as ~/bin/usenet-rebuild-pause.sh (by hand). Nightly (homelab crontab, 23:45): voyager 2's processing paused for the night; usenet-rebuild-resume.sh (07:45) -# starts it again. Postgres, web and node-api stay up. Takes the deploy lock, so it never runs during a CI deploy, and -# leaves .cache/paused, so a deploy in the night doesn't start the workers again. +# starts it again. Postgres, web, node-api and the prober stay up: since 2026-11-03 (LOG.md (137)) everything the +# prober touches is on the NVMe, so it probes through the night without the HDD. Takes the deploy lock, so it never +# runs during a CI deploy, and leaves .cache/paused, so a deploy in the night doesn't start the workers again. cd /mnt/bulk/usenet-rebuild || exit 1 exec 9>.cache/deploy.lock flock 9 touch .cache/paused date "+%F %T pausing" docker compose stop edge -docker compose stop coordinator prober merger judge spotter spot-inspector +docker compose stop coordinator merger judge spotter spot-inspector docker compose ps --format "{{.Service}} {{.Status}}"