diff --git a/pgpm/cli/src/commands.ts b/pgpm/cli/src/commands.ts index fbf360368e..80ba66f6c1 100644 --- a/pgpm/cli/src/commands.ts +++ b/pgpm/cli/src/commands.ts @@ -27,6 +27,7 @@ import revert from './commands/revert'; import slice from './commands/slice'; import tag from './commands/tag'; import testPackages from './commands/test-packages'; +import tune from './commands/tune'; import verify from './commands/verify'; import { usageText } from './utils'; @@ -66,6 +67,7 @@ export const createPgpmCommandMap = (skipPgTeardown: boolean = false): Record = { + fsync: 'off', + synchronous_commit: 'off', + full_page_writes: 'off', + checkpoint_timeout: '30min', + max_wal_size: '8GB' +}; + +export default async ( + argv: Partial>, + prompter: Inquirerer, + _options: CLIOptions +) => { + if (argv.help || argv.h) { + console.log(tuneUsageText); + process.exit(0); + } + + const reset = argv.reset === true; + + const { yes } = await prompter.prompt(argv, [ + { + type: 'confirm', + name: 'yes', + message: reset + ? 'Restore PostgreSQL durability settings to server defaults?' + : 'Disable PostgreSQL durability? This risks data loss on crash and must never be used in production.', + default: false + } + ]); + + if (!yes) { + log.info('Operation cancelled.'); + return; + } + + const db = await getPgPool({ + database: 'postgres' + }); + + for (const [setting, value] of Object.entries(TUNE_SETTINGS)) { + if (reset) { + await db.query(`ALTER SYSTEM RESET ${setting};`); + log.info(`reset ${setting}`); + } else { + await db.query(`ALTER SYSTEM SET ${setting} = '${value}';`); + log.info(`set ${setting} = ${value}`); + } + } + + await db.query('SELECT pg_reload_conf();'); + + log.success( + reset + ? 'PostgreSQL durability settings restored to defaults.' + : 'PostgreSQL tuned for throwaway environments (durability disabled).' + ); +}; diff --git a/pgpm/cli/src/utils/display.ts b/pgpm/cli/src/utils/display.ts index b28d39ff38..c8fe5d4088 100644 --- a/pgpm/cli/src/utils/display.ts +++ b/pgpm/cli/src/utils/display.ts @@ -27,6 +27,7 @@ export const usageText = ` analyze Analyze database structure rename Rename database changes admin-users Manage admin users + tune Tune PostgreSQL for throwaway environments (CI/test) Testing: test-packages Run integration tests on all workspace packages