import { BaseSchema } from '@adonisjs/lucid/schema' /** * fragments, with its indexes, back in the catalog's tablespace (default_tablespace: nvme on homelab), out of * CHUNK_TABLESPACE where 3200 put it: it isn't read by key only. The fragment merger walks its file_key index and * reads each row, written and deleted all the time; on the HDD one round of its 30 s budget took 12+ minutes, and the * coordinator's settling and tail planning waited behind it (LOG.md 2026-10-15 (57)). 13 GB. Homelab was moved by * hand first, with the writers stopped; a no-op where it's 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 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 = 'fragments' OR c.oid IN (SELECT indexrelid FROM pg_index WHERE indrelid = 'fragments'::regclass)) AND coalesce(t.spcname, 'pg_default') <> ?`, [target] ) for (const { relname, relkind } of rows) { await db.rawQuery(`ALTER ${relkind === 'i' ? 'INDEX' : 'TABLE'} ${relname} SET TABLESPACE ${target}`) } }) } async down() {} }